
いつもお世話になっております.
タイトルに書きましたとおり,
「ある点が凹凸多角形の内部にあるか?外部にあるか?」を判断するためのアルゴリズムを探しております.
ネットを散策して,
「ある点から伸ばしたRayと多角形との交差回数」というアルゴリズムを見つけたのですが,計算とプログラムでの実装が大変そうなので
http://www.330k.info/essay/takakugatanonaigaihan …参考サイト1)のサイトや
http://soudan1.biglobe.ne.jp/qa3990775.html(参考サイト2)の4番目の回答で紹介されている
「偏角の和」といった条件を使った判定方法を利用したいと考えております.
しかしながら,私の知識では,こちらに書かれているアルゴリズムを理解することができません.
(参考サイト1)を読んでいると,
多角形の角頂点Pnを (Xn, Yn) (n=0,1,・・・・),ある点をR (Xr,Yr)とした時に
∠Pn R Pn+1の和が
0,±4π,±8π,…のとき,点Rは多角形の外
±2π,±6π,±10π…のとき,点Rは多角形の中
と判断できるそうなのですが,上手くいきません.
∠Pn R Pn+1の和を求めてはみたのですが,上記の条件に当てはまりません.
どなたか「偏角の和」使った「ある点が凹凸多角形の内部にあるか?外部にあるか?」の判断方法を解説していただけないでしょうか?
また,計算コストが軽ければ上記の方法でなくても問題ありませんので,別の方法を教えていただけても助かります.
よろしくお願いします.
A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
たとえば、
A(10,10) B(-10,10) C(-10,-10) D(10,-10) という四角形があって、O(0,0)が内部にあるかどうかを判定するときに、
∠AOB=∠BOC=∠COD=∠DOA=90°になりますよね。
次に、BとDの座標を入れ替えて、
A(10,10) B(10,-10) C(-10,-10) D(-10,10) という四角形があって、O(0,0)が内部にあるかどうかを判定するときは、
∠AOB=∠BOC=∠COD=∠DOA=-90°になりますよね。
あなたの計算式では、そのような計算結果になっていますか?
>ちなみに、和が奇数πのときは、多角形の線上にあることになりますね。
これは私の勘違いでした。すみません。
No.7
- 回答日時:
点 R を原点にした場合、P を複素平面上の点 (X + i*Y) とみなして偏角を求めるのがいちばん簡単みたい。
スプレッドシート上にて、シート関数で組むには、細かな配慮が要るようで…。
・スプレッドシートが返してくる主値 ASIN(X/SQRT(X^2+Y^2)) から点 P (X + i*Y) の偏角φ (≧0) を得るには、
ASIN(X/SQRT(X^2+Y^2)) を A (セルアドレス) として、
=IF(X<0,PI()-A,IF(Y<0,2*PI()+A,A))
などの後処理を要する。
・点 P の偏角φの増分を累計し終えたとき、その結果がスタート点 P0 の偏角φ0 を超える場合と、超える場合とがありえる。
φ0 を超えたら、φ0 →φ0+2*PI() の修正が必要。
超えなければ、そのまま。
このあたりを熟慮すれば、もっとスマートなアルゴリズムが得られるのかも…。
No.6
- 回答日時:
> 考え方としては,∠Pn R Pn+1 の和が
> 4πで割った時の余りが0なら外,
> 4πで割った時の余りが2なら内
> であっているのでしょうか?
それで合ってると思います。
実際にどのような状況でどのような計算をして、条件に当てはまらなかったのか、具体例を挙げてみませんか?
もしかしたら、意外なところで考え違いや計算違いをしているかもしれませんよ。
ちなみに、和が奇数πのときは、多角形の線上にあることになりますね。
No.5
- 回答日時:
大したハナシではないので、かなり端折ってました。
>多角形の各頂点を移動させればいいでしょうか?
もちろん。Pn,R すべて単純に平行移動、がわかり易いでしょうね。
>各頂点は左回りでリストに格納しています.
> …
>「∠Pn R Pn+1の和」でいいのでしょうか?
向きを示す符号 (+, -) も勘定に入れれば、P0 からスタートして P0 へ戻ったとき、
「∠Pn R Pn+1の和」= 0 度ならば、R は多角形外部
「∠Pn R Pn+1の和」= 360 度ならば、R は多角形内部
になるのでは?
No.4
- 回答日時:
http://www.330k.info/essay/takakugatanonaigaihan …
の後に余計な文字列があるので、チャンと飛びませんヨ。
それはさておき、
* ある点から多角形の各頂点を順番に見ていったときに何回転するか
の方法が推奨されてますね。
初めに「ある点」を原点にシフトすれば、考えやすそうです。
その際、気をつけねばならないのは、「ある点」が多角形の辺上にある場合。
最初に、それをチェックしてしまうほうがわかり易そうです。
「ある点」が多角形の辺上になければ、各頂点が辺を順繰りにたどるよう整列されている場合、全頂点を一巡したときに原点のまわりを 360 度めぐったか否か、判定すれば良いのでは?
回答ありがとうございます.
リンクミスしてしまったみたいです.申し訳ないです.
>初めに「ある点」を原点にシフトすれば、考えやすそうです。
「ある点を原点に移動させる場合の移動量」多角形の各頂点を移動させればいいでしょうか?
>「ある点」が多角形の辺上になければ、各頂点が辺を順繰りにたどるよう整列されている場合、
各頂点は左回りでリストに格納しています.
>全頂点を一巡したときに原点のまわりを 360 度めぐったか否か、判定すれば良いのでは?
この方法は,
「∠Pn R Pn+1の和」でいいのでしょうか?
No.3
- 回答日時:
>「ある点から伸ばしたRayと多角形との交差回数」というアルゴリズムを見つけたのですが,計算とプログラムでの実装が大変そうなので
4点P1(X1,Y1)、P2(X2,Y2)、R(Rx,Ry)、Q(Qx,Qy)があるとき、
線分P1P2とRQが交差しているかどうかの判定は、
{(Qx-Rx)(Y1-Ry)-(X1-Rx)(Qy-Ry)}{(Qx-Rx)(Y2-Ry)-(X2-Rx)(Qy-Ry)}<0 かつ
{(X2-X1)(Y1-Ry)-(X1-Rx)(Y2-Y1)}{(X2-X1)(Y1-Qy)-(X1-Qx)(Y2-Y1)}<0
でできます。
点Qのx座標が点Rのx座標と同じでy座標が遥か上にある場合、つまりQ(Rx,∞)の場合、上記の判定式は、
(X1-Rx)(X2-Rx)<0 かつ {(X2-X1)(Y1-Ry)-(X1-Rx)(Y2-Y1)}(X2-X1)>0
となります。
P1(X1,Y1)、P2(X2,Y2)を変えていけば、多角形との交差回数を求めることができます。
これは、arcsinやarctanなどで角度を求めるよりはかなり計算量が少なくなると思いますが。
No.2
- 回答日時:
∠Pn R Pn+1 の和ですが、
m角形の場合は、
∠P1 R P2
∠P2 R P3
:
:
∠Pm-2 R Pm-1
∠Pm-1 R Pm
これらの和だけではダメだと思います。
更に
∠Pm R P1 (∠P1 R Pm では符号が逆になってしまう)
の角度も足す必要があると思います。
それも解った上で、「上記の条件に当てはまりません」なのでしょうか?
回答ありがとうございます.
>∠Pm R P1 (∠P1 R Pm では符号が逆になってしまう)の角度も足す必要があると思います。
はい,多角形は閉じた図形を想定しており,∠Pm R P1も足していますが
合計値は,中途半端な値になってしまい
0,±4π,±8πや±2π,±6π,±10πといった値にはなりません.
考え方としては,∠Pn R Pn+1 の和が
4πで割った時の余りが0なら外,
4πで割った時の余りが2なら内
であっているのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル関数で源泉徴収額を計...
-
エクセルで60進法計算の仕方...
-
工事の共通仮設費率の計算がで...
-
100以下の自然数のうち、次のよ...
-
経費率の計算方法を教えて下さい。
-
この産み分けの計算でハズレの...
-
最小公倍数と最大公約数の求め...
-
数式は言葉で覚えたほうがいい...
-
3桁の自然数の中で、次の個数を...
-
ラプラス変換の「s」とは?
-
乱数について
-
Excelで勤務の過不足時間を計算...
-
エクセルでのシグマ計算
-
関数電卓の使い方
-
5進法を10進法への直し方
-
10分の1は「10/1 それとも1/10...
-
50以下は“50”も入るのですか?
-
1億x1億はいくらでしょうか?
-
敬語の使い方
-
実績を積むという表現
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセル関数で源泉徴収額を計...
-
エクセルで60進法計算の仕方...
-
工事の共通仮設費率の計算がで...
-
100以下の自然数のうち、次のよ...
-
この産み分けの計算でハズレの...
-
経費率の計算方法を教えて下さい。
-
エクセルでのシグマ計算
-
Excelで勤務の過不足時間を計算...
-
ラプラス変換の「s」とは?
-
関数電卓の使い方
-
数Aの「割り算のあまりの性質」...
-
8進数から16進数への変換
-
3桁の自然数の中で、次の個数を...
-
勝率50%の事象を100回やって勝...
-
99の10乗の下位5桁の数を求める...
-
小学生の割合の問題
-
ハミルトン閉路の計算量につい...
-
端数を習うのは小学何年生の頃...
-
一般結合法則
-
log[2]47って・・・
おすすめ情報