• ベストアンサー

凸型の多角形の座標

凸型の多角形が作れるような座標があります。 それぞれの座標を P(0),P(1)・・・P(n) とします。今それぞれの座標はバラバラで P(0)→P(1)→P(2)→・・・→P(n)→P(0) と結んでも凸型の多角形になりません。 これを凸型の多角形が作れるように時計回りか反時計回りに並び替えるプログラムは どのように書いたらいいでしょうか?

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

凸多角形になることが保証されているなら, 例えば 1. y座標が最小の点を見つける 2. その点から他の各点を結んだ直線の, x軸からの偏角を求める 3. 偏角の小さい順にソートする でできるはず. 一般的には Jarvis march (ジャービスの行進) とかで調べてくれ.

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

#3 をちと変更. 本質は何も変わらないけどコードとしては 1 を「x座標が最小の点を見つける」とした方がおそらく簡単.

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.2

とりあえず P(0)→P(1)→P(2)→・・・→P(n)→P(0) と結ぶ。この状態では複数の線分が交差している可能性がある。 [外側のループ] P(0)→P(1)、P(1)→P(2)、P(3)→P(4)、…、P(n-1)→P(n)のそれぞれの線分に対して、順番に[内側のループ]の処理を行う。 [内側のループ] 今外側のループでP(r)→P(r+1)が選択されていると仮定する。 P(r+2)→P(r+3)、P(r+3)→P(r+4)、…、P(n)→P(0)のそれぞれがP(r)→P(r+1)と交差するかどうか調べる。 もしP(s)→P(s+1)が交差していたら、P(r+1)~P(s)の範囲の座標を全て逆転させる(これで交差が1つ解消される。でもまだP(r)→P(r+1)に対して交差が残っているかもしれない)。 例えば今、P(5)→P(6)とP(9)→P(10)が交差していたら、入れ替えた後では、 …、P(4)、P(5)、P(9)、P(8)、P(7)、P(6)、P(10)、P(11)、… となる。でもこれは改めて以後 …、P(4)、P(5)、P(6)、P(7)、P(8)、P(9)、P(10)、P(11)、… と呼ばれることになる。 交差が無くなったら外側のループに戻って外側の線分を次の線分にする。 つまり今回の場合は全ての線分が互いに交差しなくなれば凸多角形になっているはず。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

P(0),P(1)・・・P(n) が凸多角形を形成できることが保障されているならば、 (1) 求める多角形の初期値として Poly := [P(0), P(1), P(2)] とする。 (2) k := (Poly の要素数) とし、P(k) に対して、(Poly[0], Poly[1]), (Poly[1], Poly[2]),..., (Poly[k - 2], Poly[k - 1]), (Poly[k - 1], Poly[0]) のうち最も距離が近い線分(直線ではなく)を求める。  (2-1) (2) で求めた線分が (Poly[k - 1], Poly[0]) の時: Poly の末尾に P(k) を追加する。  (2-2) 上記を満たさない、すなわち、(2) で求めた線分が (Poly[m], Poly[m + 1]) の時: Poly の m 番目の要素の後に P(k) を追加する。 (3) Poly の要素数が n になるまで (2) へ。 でできる、と思うんだけどどうかなぁ。

関連するQ&A

  • 極座標?

    点Oを中心とする半径1の円に正n角形P(0)、P(1)、…P(n-1)が内接している。 P(0)を点(1,0)として座標軸に書くと、∠P(0)OP(k)=2kπ/nであるので、(k=0,1…n-1) P(k)の座標は(COS2kπ/n,SIN2kπ/n) となっているのですが、X座標の方は-COS2kπ/nになることもあるのではないでしょうか?P(k)がX軸の負側のとき∠P(0)OP(k)=2kπ/nだからP(k)からX軸に垂線を下ろして足をHとすると、∠OP(k)H=180-2kπ/n よって、P(k)のX座標;COS(180-2kπ/n)=-COS2kπ/n 一体どこがおかしいのでしょうか。よろしくおねがいします。

  • 多角形の座標を定義

    RECT 構造体は四角形の左上隅と右下隅の座標を定義するものではあると思いますが 多角形の座標を定義する構造体はないのでしょうか?

  • 座標から図形の重心座標を求める方法

    約500点のXY座標が存在します。 各点は順に接続し、開始点と終了点が閉合する多角点の重心座標を求める方法を教えてください。

  • fortran 3次元座標

    四面体の4頂点の3次元座標を設定するプログラムを例にならって以下のように書いたのですが、doループの内容がいまいちよくわかりません。p(1:3,m),p(1:3,n)が表されている値は理解できるのですが、出力されたファイルの内容が2行3列の答えが6つあって、なぜそのように答えが出てくるのかがわかりません。教えて下さい。よろしくお願いします。 rogram list2_11 implicit none integer :: m, n, fno = 10 real(8) p(3,4) call random_seed call random_number(p(1:3,1:4)) open(fno, file = 'tetra.d') do m = 1, 3 do n = m+1, 4 write(fno,*) p(1:3,m) write(fno,*) p(1:3,n) write(fno,*) '' enddo enddo close(fno) end program list2_11

  • 座標を求めて書き出す

    初速v、地上からの角度αで発射された質点の地上に到達するまでの時間をtとして、tを適当な数nで分割してΔtとし、Δt毎の質点のx座標とy座標を求めてワークシートに書き出すプログラムはどう作ったらいいですか? 教えてください。

  • 直交座標系での問題が分かりません。

    直行座標(x1,x2)において点P=(p1,p2)が与えられており、 点Q=(q1,q2)はこの座標系でPから角度α、距離dの位置にある。 また直交座標系(x1,x2)にたいして反時計回りにβ回転させた 直交座標系(y1,y2)を考える。 問1 点Pの座標系(y1,y2)における座標(p'1,p'2)をp1,p2,βで表しなさい 問2 点Qの座標系(y1,y2)における座標値(q'1,q'2)をp1,p2,βで表しなさい。 問3 問1でもとめた(p'1,p'2)にたいして座標系(y1,y2)において角度α-β 距離dの位置にある点を考える。 この座標は問2で求めた点Qの座標系(y1,y2)における(q'1,q'2)と 一致することを示しなさい。 --------------------------------------------------------------------- という問題があり 問1は p'1=p1cosβ-p2sinβ p'2=p1sinβ+p2cosβ と計算できましたが 問2以降がわかりません。 レベルの低い問題ですがよろしければ解答をお願いします。

  • ワーク座標系とプログラム座標系について

    ワーク座標系とプログラム座標系について  ワーク座標系というのはどのような場合必要なのでしょうか? ワーク座標系とプログラム座標系について教えていただけないでしょか? お願いします。

  • 座標

    私は今座標から画像の値を読み出す勉強しています。プログラムを用いて座標を出すことはできました。今度はその実行結果ででた座標の値から画像の画素値を取り出すプログラムを書けたいのですが書けません。いろいろ参考書を見たりCマガジンという雑誌を読んだりしましたが理解できなくて投稿しました。

  • 座標を求める

    座標a(4,3)とb(1,1)があって、bを中心に反時計回りaを90度回した座標を求める問題なのですが、求めるだけならできるのですがsin,cosを使って求めるやり方がわかりません。 解答のほうをお願いします。 答えは(-1,4)です。

  • この座標の出し方を教えてください

    数学から離れて十数年。。。すっかり忘れてしまいましたのでお助けください。 xy平面上で座標(a1,b1)の点を、原点(0,0)を中心に時計回りに120度回転させた点の座標(a2,b2)はどういう数式で表されますでしょうか?

専門家に質問してみよう