javascriptでページ内オブジェクトの座標を並び替える方法

このQ&Aのポイント
  • javascriptでページ内のオブジェクトの座標を左上から右下の順に並び替えるためには、どのような関数を作成すれば良いのでしょうか?具体的な座標情報や並び替えた結果の表示方法など詳細を教えてください。
  • また、座標情報が与えられた場合、それを値の大小に基づいて並び替える方法も知りたいです。具体的なソートアルゴリズムやコードの例を教えてください。
  • アルゴリズムやコードの解説に加えて、効率的な方法や注意点なども教えていただけるとありがたいです。
回答を見る
  • ベストアンサー

ページ内オブジェクトを左上から順に並び替える

座標の並べ替えの計算について質問させて頂きます。 javascriptで、以下のような座標(左上基点)のリストを、左上から右下の順に並べ替えるためにはどのような関数を作成すれば良いか分からずにこまっています。 var list = [ { id : 0, x :138.313077609396, y :183.402580877775 }, { id : 1, x :15.0606060605741, y :138.374 }, { id : 2, x :15.0606060605741, y :228.41 }, { id : 3, x :138.312606060574, y :228.41 }, { id : 4, x :76.6868418349849, y :228.41 }, { id : 5, x :76.6868418349849, y :183.392 }, { id : 6, x :15.0860776093956, y :183.367 }, { id : 7, x :138.312606060574, y :138.374 }, { id : 8, x :76.6868418349849, y :138.374 }, { id : 9, x :15.0303030302711, y :15.030303030303 }, { id : 10, x :138.373999999968, y :53.2886884952961 } ]; □1□ | □2□ | □3□ | □4□ □5□ | □6□ | □7□ | □8□ □9□ | □10□ | □11□ | □12□ … といった順に並べ替えたいのです。 詳しい方、いらっしゃいましたら、ご教示のほど、宜しくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.4

まあ不可能だと思ったほうがいいです。 例えば1がもし上の方にも伸びていれば1->6->2となるでしょうし、 現状でも1->6->2と絶対ならない理由はないでしょう。 それこそ、2は画像を含んでいるので目が移りやすいとかそういったこともあるでしょう。 ですのでもう単純にy座標だけで決めたほうがいいです。 そしてy座標が同じならxを見ます。 ただしlistはy座標が微妙にずれているので注意がいります。

chiku-san
質問者

お礼

ありがとうございます! なるほど、ということは、はじめにページ全体のY座標を100分割くらいにしてしまって、似たようなY座標を全部同じにしてしまってから、Y座標が同じならxを見るという感じでやれば、なんとなく、そんな感じになりそうですかね。 こちらもちょっと試してみたいと思います! ありがとうございました!

その他の回答 (4)

  • sanzero
  • ベストアンサー率56% (58/102)
回答No.5

プログラムを考えないという方法もあります。要件に合致するかどうかはわかりませんが下記のようなプラグインがあります。 http://blog.shuffleee.com/1793/ http://on-ze.com/archives/1929 その他 http://matome.naver.jp/odai/2136089272724471701

chiku-san
質問者

お礼

ありがとうございます! pluginで対応ですね。ありがとうございます。 今回の要件ですが、このような計算によってランダムな雰囲気に配置された画像の座標を全部取得して、人が目で追うような右から左への順でに並べ替えて、いろいろやりたいという感じです。 ご教示頂いたプラグインの中を見て、計算方法を確認しつつアルゴリズムを理解しつつ、再度考えたいと思います! ありがとうございました。

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.3

これは座標だけで決められるものではありません。 例えばサンプル画像でもしも画像9の高さが極端に小さく、 9の底が8の頭よりも上であれば、8と9は逆転するでしょう。 他にもそのlist配列は並び替えるのに当たって諸問題がいくつかありそうに見えます。

chiku-san
質問者

お礼

ありがとうございます!確かに…ご指摘の通りですね…。 こういう場合は、左上座標のリストだけでは要件通りのソートはできないということですね…。 一般的にこのような要件の場合、どのようなリストを作成してソートを行うのでしょうか…。 かなり複雑な計算になるのでしょうか。 javascriptの学習を始めたばかりのため、見当もつきません…。 ヒントだけでもご教示頂けましたら幸いです。

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.2

そもそも左上とは? あるものと、それに対してyが0.1低く、xが10高いものはどちらを前とするのですか?

chiku-san
質問者

補足

>あるものと、それに対してyが0.1低く、xが10高いものはどちらを前とする たしかに、ここを明確にしないとソートできませんね…。ありがとうございます! アメコミのコマを目で追うようにソートしたいのですが、こういう場合は「あるもの」が前になります。 ですので実際には「アメコミのコマを目で追う」とは、異なる要件であることが分かりました…申し訳ございません…涙。 そして、いろいろと質問の仕方が酷いことを実感し、以下にロケーションを画像イメージで用意いたしました。 これはピンタレストのトップですが、ちょうど、ページ全体の左上が基点0,0で、それぞれのブロックの左上の座標がランダムに格納されているデータをイメージして頂ければと存じます。 これを四角で振った連順番のように並べて行きたいのです。 http://nandemo.wpblog.jp/wp-content/mydata/scs.png

回答No.1

実際に並び替えたい部分は実行していないので座標が、どこにあるかは視覚的には認識していませんが、 xとyはそれぞれ横と縦だと思います。 対して左上というのは座標にするには両方必要です。 ここで必要なのは要件。 どのように並び替えたいか。 左上から並べたように見えるという事はどういう事かを定義する必要があります。 一つの案としては 「左上座標0,0との距離が近い順」 それで並び替えはできるかと思います。

chiku-san
質問者

お礼

ありがとうございます! なるほど、距離を追加して比較するとか、いろいろ方法ありそうですね! 良いのですね、早速やってみます!

chiku-san
質問者

補足

> どのように並び替えたいか。左上から並べたように見えるという事はどういう事かを定義する必要があります。 ありがとうございます。 並び替えは、左上をx:0,y:0とした場合に、以下の様に配列をソートしたいと考えています。 □1□ | □2□ | □3□ | □4□ □5□ | □6□ | □7□ | □8□ □9□ | □10□ | □11□ | □12□ 左上から、左から右まで順番に走査して、一段下がって、また走査してといった感じで、丁度アメリカンコミックのコマを目で追う順番にソートしたいと考えています。

関連するQ&A

  • objectの座標が取れない。

    JavaScriptを利用して、画面に仕込んだタグをポップアップのように 呼び出したいと思っています。 以下、概略ですが <div id ="test1" style="display:none;">テスト</div> <a href="javascript:balOpen(this,number)">呼び出し</a> 以下js function balOpen(obj,number) { document.getElementById('test' + number).style.display = 'block'; var positionX; var positionY; positionX = getLocation(obj, 'X'); positionY = getLocation(obj, 'Y'); } 画面をスクロールした際でも、画面中央に出したいので、座標を見て tes1のleftとtopを調整したいと思っています。 しかし、上記のような書き方をしても、X、Yの座標が取れず困っています。 何か良いやり方があれば教えていただけないでしょうか。 宜しくお願いします。

  • javascriptでオブジェクトのメソッドを使う

    JavaScriptでnewでオブジェクト化したクラス(?)のメソッド、フィールドを利用する方法を教えて下さい。 javascriptにもオブジェクト化という考え方があると聞いたのですが、 例えば、Javaでいうsetter getterのようなメソッドを作り、使用することはできるのでしょうか? 下記のようなコードを実行したところ Uncaught TypeError: Object #<mousePosi> has no method 'setPara' というエラーが出てしまい、setParaというメソッドはない。と言われてしまいます。 しかし、mousePosi()をオブジェクト化することはできているようなので、 setParaとgetParaを使えるのではないかとおもいました。 どなたかアドバイス下さい。お願いします。 ------------------------------------------------------------------------------------------------- (function LineMain() { console.log("マウスの位置座標を表示"); // console.log("X座標=" + mymouse.x + ",Y座標=" + mymouse.y); //マウスムーブでeventControlを呼び出し addEventListener("mousemove", eventControl, false); function eventControl(event) { var event = event; var myMousePosi = new mousePosi(); myMousePosi.setPara(event); // console.log("X座標=" + obj.getMouse().x + ",Y座標=" + obj.getMouse().y); } function mousePosi() { var paraMouse = { x : 0, y : 0 }; function setPara(event) { this.paraMouse.x = event.x; this.paraMouse.y = event.y; } function getPara() { return this.paraMouse; } } })();

  • 座標を指定して画像を表示する

    こんばんは。 画像の左上を基点にし、XとY座標を指定して画像を表示する方法はありませんか? できればHTMLかJAVAなんかでしたいです。

  • Java言語プログラミングについて質問です

    次の問題をどう組んだらいいかわかりません。教えてください。 問.2次元上の円と長方形を表すデータファイルが与えられたとき、以下の処理を行うプログラムを作成せよ。ただし、長方形は必ず座標軸に並行変を持つとする。 1.全図形の合計面積を表示せよ 2.一番免責の大きい図形データを表示せよ 3.周の長さ順に図形データを表示せよ 4.重なり合ってるすべての円のペアを列挙せよ 5.重なり合っているすべての図形のペアも列挙せよ 図形データのフォーマットは以下のようなCSV形式で与えられているとする。 円  ID、1、中心点のX座標(double型)、中心点のY座標(double型)、半径(double型) 長方形 ID、2、左上の点のX座標(double型)、左上の点のY座標(double型)、右下の点のX座標(double型)、右下の点のY座標(double型) ただし、IDは図形間でユニークな整数値であるとする。 図形データの例 1. 1, 50, 0, 50, 0, 50.0 2. 2, -100, 0, 100, 0, 0, 0, 0, 0 3. 1, 0, 0, 0, 0, 10.0 4. 1, 50, 0, 0, 0, 30.0 5. 2, -75, 0, 75.0, -25.0, 25.0 まだ自分に知識がないので、この問題をどう組んだらいいかわかりません。教えてください。よろしくお願いします。解説とソースをお願いします。

  • Flashでのインスタンスの座標について

    こんばんは。 一つflashのインスタンスの座標について質問なのですが、 試しに actionscriptで  _root.attachMovie("1","2",1); _root[2]._x = 300; という動作をさせたところ、_root[2]のx座標を300に設定していてもステージのx=300(左上を0,0とした座標)の位置と違う位置に表示されてしまいます。 これは何故このような現象がおきてしまうのでしょうか?ステージのx,yとインスタンスのx,yは基点が違うのでしょうか?ご教授頂ければ幸いです。

  • 二次関数の通過領域

    座標平面状にX=-1の直線を考えます。 X軸と直線X=-1で4つに分けられた領域の右上をA左上をB左下をC右下をDとします。 二次関数Y=X^2+aX+1がAとBを通りCとDを通らないときaの範囲を求めよ という問題なのですが、解答を読んでも納得できない部分がありました。 解答では判別式が負もしくは軸(X=-a/2)がX>0にあることが条件である と書かれていて答えはa≦2となっています。 二次関数を平方完成すると Y=(X+a/2)^2+1-a^2/4 となり頂点のY座標は1-a^2/4となります。 ここで例えばa=-5を代入すると頂点のY座標は負となりCかDを通ると考え納得できませんでした。 どこで間違えているのかご指摘いただけないでしょうか?

  • Perlでcsvファイルを読み込んで計算する方法(初心者です)

    csvファイルに以下のようなデータが入っています。 ID,X座標,Y座標 0,1.22,3.42 1,3.24,4.52 2,5.34,7.87 (こういうのがID1000までずっと続きます) このデータから一行ずつ,Y座標-X座標を計算させて出力したいです。 とても困っているので解答お願いします。

    • ベストアンサー
    • Perl
  • インラインフレーム内の変数を親ページから呼び出す

    インラインフレーム内のマウス位置を↓のjavascriptコードで取得しているのですが、親ページのjavascriptの関数で使用したいです。どのようにインラインフレーム内の変数を親ページから呼び出して、利用すればよいのでしょうか? var x, y; window.addEventListener("DOMContentLoaded", function(){ window.document.onmousemove = function(e){ x = getMousePosition(e).x; } },false); function getMousePosition(e) { var obj = new Object(); if(e) { obj.x = e.pageX; obj.y = e.pageY; } else { obj.x = event.x + document.body.scrollLeft; obj.y = event.y + document.body.scrollTop; } return obj; }

  • UWSCでの関数定義は?

    只今UWSCにて画像クリックを自動化しようとしているのですが、CHKIMGとBTNを多用するため、関数にて引数に 画像のディレクトリ・検索範囲のx座標1・y座標1・x座標2・y座標2 を入れて呼び出したいと思っています。 説明には  PROCEDURE 関数名( 引数, Var 引数, 引数[], Var 引数[][], 引数=定数, .... )      処理 FEND と載っていたのですが、関数を作成するとメインの動作をしなくなってしまいました。 UWSCではどのように関数の定義と呼び出しをすればいいのでしょうか。 初歩的な質問で申し訳ないのですが、分かる方がいらっしゃったらお願いします。

  • 正方形の一次変換

    注:以下の説明で行列は2×2の正方行列で(左上,右上,左下,右下)の順 xy座標平面において、y≧0の部分にあり、頂点の一つが原点にある正方形の内で一次変換         (x`,y`)=(7,√3,√3,5)(x,y) ・・・・・(1) によって長方形になるものを求めよ。 という問題で、正方形の1頂点の座標を(a,b)とおいて他2頂点の座標を定め、移された点を(1)で求めた後、 ・辺同士が直交する ・対辺の長さが等しい など求めてみましたが、式が一つになってしまい、(a,b)が求まりません。 どなたか、解答のアプローチなどご存知の方、教えていただきたいです。