• 締切済み

ある点が凹凸多角形の内部にあるか?外部にあるか?

いつもお世話になっております. タイトルに書きましたとおり, 「ある点が凹凸多角形の内部にあるか?外部にあるか?」を判断するためのアルゴリズムを探しております. ネットを散策して, 「ある点から伸ばしたRayと多角形との交差回数」というアルゴリズムを見つけたのですが,計算とプログラムでの実装が大変そうなので http://www.330k.info/essay/takakugatanonaigaihantei(参考サイト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の和を求めてはみたのですが,上記の条件に当てはまりません. どなたか「偏角の和」使った「ある点が凹凸多角形の内部にあるか?外部にあるか?」の判断方法を解説していただけないでしょうか? また,計算コストが軽ければ上記の方法でなくても問題ありませんので,別の方法を教えていただけても助かります. よろしくお願いします.

みんなの回答

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答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°になりますよね。 あなたの計算式では、そのような計算結果になっていますか? >ちなみに、和が奇数πのときは、多角形の線上にあることになりますね。 これは私の勘違いでした。すみません。

  • 178-tall
  • ベストアンサー率43% (762/1732)
回答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() の修正が必要。 超えなければ、そのまま。 このあたりを熟慮すれば、もっとスマートなアルゴリズムが得られるのかも…。    

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.6

> 考え方としては,∠Pn R Pn+1 の和が > 4πで割った時の余りが0なら外, > 4πで割った時の余りが2なら内 > であっているのでしょうか? それで合ってると思います。 実際にどのような状況でどのような計算をして、条件に当てはまらなかったのか、具体例を挙げてみませんか? もしかしたら、意外なところで考え違いや計算違いをしているかもしれませんよ。 ちなみに、和が奇数πのときは、多角形の線上にあることになりますね。

  • 178-tall
  • ベストアンサー率43% (762/1732)
回答No.5

大したハナシではないので、かなり端折ってました。 >多角形の各頂点を移動させればいいでしょうか? もちろん。Pn,R すべて単純に平行移動、がわかり易いでしょうね。 >各頂点は左回りでリストに格納しています. > … >「∠Pn R Pn+1の和」でいいのでしょうか? 向きを示す符号 (+, -) も勘定に入れれば、P0 からスタートして P0 へ戻ったとき、  「∠Pn R Pn+1の和」= 0 度ならば、R は多角形外部  「∠Pn R Pn+1の和」= 360 度ならば、R は多角形内部 になるのでは?    

  • 178-tall
  • ベストアンサー率43% (762/1732)
回答No.4

 http://www.330k.info/essay/takakugatanonaigaihantei の後に余計な文字列があるので、チャンと飛びませんヨ。 それはさておき、 * ある点から多角形の各頂点を順番に見ていったときに何回転するか の方法が推奨されてますね。 初めに「ある点」を原点にシフトすれば、考えやすそうです。 その際、気をつけねばならないのは、「ある点」が多角形の辺上にある場合。 最初に、それをチェックしてしまうほうがわかり易そうです。 「ある点」が多角形の辺上になければ、各頂点が辺を順繰りにたどるよう整列されている場合、全頂点を一巡したときに原点のまわりを 360 度めぐったか否か、判定すれば良いのでは?    

Cross999
質問者

お礼

回答ありがとうございます. リンクミスしてしまったみたいです.申し訳ないです. >初めに「ある点」を原点にシフトすれば、考えやすそうです。 「ある点を原点に移動させる場合の移動量」多角形の各頂点を移動させればいいでしょうか? >「ある点」が多角形の辺上になければ、各頂点が辺を順繰りにたどるよう整列されている場合、 各頂点は左回りでリストに格納しています. >全頂点を一巡したときに原点のまわりを 360 度めぐったか否か、判定すれば良いのでは? この方法は, 「∠Pn R Pn+1の和」でいいのでしょうか?

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答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などで角度を求めるよりはかなり計算量が少なくなると思いますが。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答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 では符号が逆になってしまう) の角度も足す必要があると思います。 それも解った上で、「上記の条件に当てはまりません」なのでしょうか?

Cross999
質問者

お礼

回答ありがとうございます. >∠Pm R P1 (∠P1 R Pm では符号が逆になってしまう)の角度も足す必要があると思います。 はい,多角形は閉じた図形を想定しており,∠Pm R P1も足していますが 合計値は,中途半端な値になってしまい 0,±4π,±8πや±2π,±6π,±10πといった値にはなりません. 考え方としては,∠Pn R Pn+1 の和が 4πで割った時の余りが0なら外, 4πで割った時の余りが2なら内 であっているのでしょうか?

  • skydaddy
  • ベストアンサー率51% (388/748)
回答No.1

多角形を三角形の集合ととらえ、ある点が各三角形の中にあるかどうか調べるのはどうでしょうか? すべての三角形の中に無ければ外にあることが判ります。

Cross999
質問者

お礼

回答ありがとうございます!! この方法だと多角形を自動的に三角形に分けるのが難しくないでしょうか?

関連するQ&A

  • 六面体内部の点

    1つの点と6面体がある時、この点が内部にあるか?外部にあるか?を判断する方法はあるでしょうか? よろしくお願い致します。

  • すいませんが、多角的なご意見が欲しいですので詳しく教えてください。

    すいませんが、多角的なご意見が欲しいですので詳しく教えてください。 学生時代の先輩から幼保一体化に反対する署名をお願いしますとの連絡がありました。恥ずかしながら、この件について判断できる知識を持ち合わせておりません。 現政府が提出しようとしている法案は何が良くて何が悪いのか。 今までとの違いは何か。 その他注意すべき点は何か。 教えてください。 その先輩に聞けばよいかも知れませんが、保育士であり、全保連の活動も熱心にされていて、偏りのある意見になりそうなのです。 なるべく早く連絡が欲しいと言われています。 たくさんのご意見を参考にしたいと思っていますのでお願いします。 お世話になっている方なので、もし署名するとしたら、できるだけ協力したいと思っていますので、私が判断でき、他の方にも説明出来るだけの知恵が欲しいです。色んな意見をお待ちしております。

  • 3つの点電荷の内部にもうひとつの点電荷を置く

    角度はすべて120度未満の三角形ABCで、内部の点Pをとります。 ベクトルPAの表記は矢印を省略して、単にPAなどとかきます。 PA+PB+PC=0 をみたす点Pは重心です。 Oを始点にすると、OP=(OA+OB+OC)/3となることから分かります。 モーメントの和が0と見なすと、Pは、重さは0とみなした三角板の3つの頂点に同じ重さのおもりをつけて、三角板を下から指で支えたときに、つりあう位置を意味しています。 PA/|PA| + PB/|PB| + PC/|PC| = 0 をみたす点Pはフェルマー点です。 3つの単位ベクトルを足して0ベクトルになるとき、3つのベクトルを平行移動すればそれは正三角形状になり、ベクトルどうしのなす角は120度になることから分かります。 モーメントの和が0とみなすと、Pは、テーブル上の3点A,B,Cに穴を開け、また、Yの字型に作った糸の3つの端に同じ重さのおもりをつけて、3つの穴からたらしたときの、糸の結び目の位置を意味しています。 では、 PA/|PA|^3 + PB/|PB|^3 + PC/|PC|^3 = 0 をみたす点Pはどういった点なのでしょうか? 知られていることや参考サイトがありましたら教えてください。 単位ベクトルPA/|PA|を、距離の2乗に反比例させたPA/|PA|^3らの和が0とみなすと、Pは、テーブル上の3点A,B,Cに点電荷を固定し、もうひとつの点電荷を内部に置いたときにどちらにも移動しなくてつりあう位置を意味しています。 http://topicmaps.u-gakugei.ac.jp/phys/matsuura/java/Efield3/efield3.htm によると、正三角形ではそういった点Pは4箇所あるようですが。 物理のラグランジュ点とは関係あるのでしょうか。 また、 PA/|PA|^2 + PB/|PB|^2 + PC/|PC|^2 = 0 や |PA|*PA + |PB|*PB + |PC|*PC = 0 をみたす点Pの物理的意味があれば教えてください。

  • カノニカルでの古典粒子の内部エネルギー

    以下の問題が解けずに困っています。 N個の同種粒子からなる一次元の粒子系を考える。ハミルトニアンが H=1/(2m)Σp^2+U(r) (p、rにはiのラべリングがありますが省略します) 古典カノニカル統計を用いることにする。ポテンシャルエネルギーUがar^2/2の項を含み、かつrがこれ以外に現れないとき、この項には平衡状態で内部エネルギーkT/2が割り当てられることを示せ。 という問題です。 調和振動子のカノニカル統計の内部エネルギーなどを参考に本やインターネットなど調べ計算したのですが、どうしても内部エネルギーがkTになってしまい1/2が出てきません。 私がやった計算は、 一粒子状態和は z=1/h∬dpdr exp[-β(p^2/2m+ar^2/2)]=2π/(βh)(m/a)^(1/2) よって内部エネルギーは ϵ=-∂Inz/∂β=1/β=kT という感じです。 聞きたいのは、 1.問題の「この項に割り当てられる」内部エネルギーというのが、一粒子についての内部エネルギーという解釈で合っているのかどうか。 2.E=-∂InZ/∂βの式は全系の状態和Zと内部エネルギーEについての式だと思うのですが、上で私が書いたように一粒子についても使えるのかどうか。(ほかに一粒子についてわからずとりあえず使って計算してみました…) 3.ほかの教科書などでも、古典カノニカルで内部エネルギーに1/2がついているものが見当たらなかったのですが、この問題はどう解くのか。 ほかにもいろいろと間違っているところはあると思うのですが、指摘していただけると助かります。

  • 円と球の内部の格子点について

    円と球の内部の格子点についてですが。 格子点とは座標系において、その値が整数であるような点のことです。たとえば、二次元平面(xy平面)では、(1、1)や(2、1)といった点を指し、(1.2、2.5)といった少数や分数となるような点は格子点ではありません。 問題はここからです。 xy平面において、原点中心、半径rの円を考えたとき、その内部に含まれる格子点の数をSrとする。ここで、rは正の整数とする。(例えば、単位円(r=1)の場合、条件を満たす格子点は(0,0)、(0,1)、(1,0)、(-1,0)、(0 ,-1)であるからS1=5である。) Srを求めよ。これはもちろんrの関数になります。 次に、xyz座標空間になったとき、原点中心、半径rの球を考えたとき、その内部に含まれる格子点の数をVrとする。Vrを求めよ。 Vr/Sr をn→∞としたときの値を求めよ。 おそらく、これは発散するかと思います。SrやVrの求め方はおそらく区分求積法、法則性を見つけ出す(数列の漸化式を解く)方法かとも思うんですが、よくできないので、教えてください。 また、この極限値の問題はnC2 と nC3 に関係があるかと思います。 できれば、ヒントだけでなく、「答え」を教えてもらえるとありがたいです。

  • 外部DNSサーバの構築方法

    Windows2003Serverにて外部DNSサーバを構築しようと考えています。 サーバはDMZへ設置しようと思います。 外部問い合わせには外部アドレスを、内部問い合わせには内部アドレスを返したいと思います。参考になるサイトなどありましたらお知らせください。

  • ある点がモデルに内包されるかどうかの判別

    プログラミングカテゴリに投稿しようか迷ういましたがこちらに投稿させていただきます。 やりたいのは、3D空間で一つのベクトルによって表現されるある点が、三角形のメッシュの集合としてあらわされるある閉じたモデル(要は一般的な3Dモデルデータのことですが)の内部にあるか外部にあるかを判別するアルゴリズムがしりたいです。 その情報が載っているサイトでもいいです 英語でも構いません 一応ここでいう内部とは各面の法線ベクトルの反対方向に存在する閉じた空間のことです。 -ここから蛇足- Blenderなどの3Dモデリングツールではおなじみのboolean演算ですが、なんとなく一から作ってみようと思っていろいろ調べてみたんですが、三角形メッシュ vs 三角形メッシュ の衝突判定と交線を求めるアルゴリズムは調べてすぐ出てきたんですが、メッシュのモデル内包判定とかVertex のモデル内包判定とか調べても出たなかったので・・・ なのでぶっちゃけbooleanのアルゴリズムについて詳しく書いてあるページがあればそういう情報も大歓迎です

  • 複数の点電荷の問題

    3個の点電荷+q ,-2q ,+qが間隔dで直線状に置かれている。これら点電荷から十分離れた点(r>>d)における電位および電場の各成分Ex,Ey,Ezをdについて2次の精度で求めなさいという問題です。 複数なら和をとればいいというのは分かるのですが、具体的な計算方法がよく分かりません。

  • フレームページで外部リンクを押すと…

    フレームページ(例えば左がメニューで右に表示だとする) のサイトで、ブログなどの外部リンクも貼ってありました。 で、その外部リンクを押すと、フレームの右側に表示されます。 で、次に左側のメニューの内部リンクを押すと、右側の画面が変わらないのです。 外部リンク先の画面のままなのです。 普通に内部リンクだけを押していると変わるのですが、 外部→内部 だと外部リンク先の画面のままなのです。 内部→外部 だと大丈夫なんです。 前までこんな事はなかったのでとても不便です; 直す方法はありませんでしょうか…?

  • 突然、内部から繋がらなくなった

    CentOS5.2で自宅サーバーを運用しようとしています。 ttp://centossrv.com/bind-centos5.shtml ↑を参考にBINDで内部向けDNSを構築しました。 (他の設定も全てこのサイトを参考にしています) 昨日確認した時点では、正しく内部から接続できており、 apacheとpure-ftpd、plumを起動した状態で就寝したのですが 今朝起きてみるとplumに繋いでいたIRCクライアントが切断されており、 ftpにも繋がらずWebページも表示できない状態になっていました。 自分なりに切り分けした結果、 ・現在のグローバルIPでも繋がらない ・外部(携帯)からはWebページが見える ・プライベートIPだとftp、http、plumともに繋がる と言うことから内部向けDNSに問題があるのでは?と思ったのですが 何処をどう見れば原因を探れるのかが解らず、質問させていただきました。 一応、BINDの再起動、サーバーの再起動も行いましたが変化無しです。 回答お待ちしております、よろしくお願いします。