検索
AND検索
OR検索
トップ
|
リロード
|
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
Top
/ 多角形の内外判定
多角形の内外判定 の編集
Last update on |
編集
|
複製
|
名前変更
|
差分
|
バックアップ
|
添付
メニュー
簡易掲示板
LINK集
y.tackの公式BBSブックマーク
practice room
?
最新の20件
2022-10-09
多角形の内外判定
2021-05-19
RecentDeleted
2018-08-01
FrontPage
文字列型変数管理サブルーチン
GAME作成システム
2018-07-31
double型変数管理サブルーチン
int型変数管理サブルーチン
2018-07-21
GUIとメイン分割処理。たたき台2
2018-07-11
memo
NO_579_sample
GUIとメイン分割処理。たたき台
2018-06-28
NO_714
NO_712
NO_706
NO_705
NO_704
NO_703
NO_702
2018-06-23
Shift_JIS
モートン番号テーブル化 / 八分木
total
170
today
1
yesterday
0
now
1
Menu
Total:170/Today:1
-- 雛形とするページ --
2.61スクリプト修正
2byte処理
BracketName
FormattingRules
FrontPage
GAME作成システム
GUIとメイン分割処理。たたき台
GUIとメイン分割処理。たたき台2
Help
HSP\[XeWiki
HSPの仕様の質問ストック
InterWiki
InterWikiName
InterWikiSandBox
LINK集
memo
MenuBar
NO_454
NO_455
NO_456
NO_458
NO_461
NO_462
NO_463
NO_464
NO_465
NO_467
NO_468
NO_469
NO_470
NO_473
NO_477
NO_547_DOC
NO_579_sample
NO_587
NO_589
NO_590_DOC
NO_592_subr
NO_593_subr
NO_594_subr
NO_595_subr
NO_596
NO_597
NO_599
NO_600
NO_603
NO_604
NO_605
NO_606
NO_607
NO_608
NO_611
NO_612
NO_613
NO_614
NO_616
NO_617
NO_618
NO_619
NO_622
NO_623
NO_630
NO_632
NO_634
NO_635
NO_638
NO_639
NO_640
NO_641
NO_642
NO_643
NO_645
NO_646
NO_647
NO_648
NO_649
NO_650_allright
NO_651
NO_652
NO_653
NO_654
NO_655
NO_656
NO_657
NO_658_EDIT
NO_659_EDIT
NO_660_EDIT
NO_662_EDIT
NO_663_EDIT
NO_667
NO_668
NO_669
NO_670
NO_671
NO_672
NO_675
NO_676
NO_677
PHP
PukiWiki/1.4/Manual
...
*多角形の内外判定 [#tb03a432] 以下のページを参考にしました。 ~ [[点の多角形に対する内外判定>https://www.nttpc.co.jp/technology/number_algorithm.html]]~ 単純に実装すると、点が線分上にある場合、図形の向きで結果が逆になってしまいます。~ 例を挙げます、次の図を見てください~ ┏━━━━━━━━━━━━┓~ ┃ /┃~ ┃ / ┃~ ┃ / ┃~ ┃ A / ┃~ ┃ ・ ┃~ ┃ / ┃~ ┃ / ┃~ ┃ / ┃~ ┃ / ┃~ ┃ / B ┃~ ┃ / ┃~ ┃/ ┃~ ┗━━━━━━━━━━━━┛~ ↑AとBで結果が逆になる。~ 参考にしたページではそういう仕様で進めているようですが、(図2-3)~ 直感的には線分上は当たりとするか、~ 完全に図形に入り込んでいるときのみ当たりにするかのどちらかの方がいいと思います。~ 今回は、線分上に点がある場合は当たりとする処理にしています。~ **ソース [#i25eba58] #module //polygonは実数または整数の配列 #defcfunc 多角形内外判定 array polygon, int 頂点数, double x, double y count = 0 a_max = 頂点数 * 2 for i,, a_max, 2 始点 = polygon(i), polygon(i + 1) 終点 = polygon((i + 2) \ a_max), polygon((i + 3) \ a_max) if 始点 != 終点{ 判定 = (x - 始点) * (終点.1 - 始点.1) / (終点 - 始点) + 始点.1 - y }else{ 判定 = (x != 始点) || ((y - 始点.1) * (y - 終点.1) > 0) } if 判定 < 0{ if x < 始点 ^ x < 終点{ if 始点 < 終点{ count++ }else{ count-- } } }else: if 判定 == 0{ //点が線分上にある時 return 1 } next return count != 0 #global #include "a2d.hsp" alcreateImage title "多角形内外判定" repeat stick key if key & 256{ a(頂点数 * 2) = mousex, mousey 頂点数++ } if key & 512{ 頂点数 = limit(頂点数 - 1, 0) } 判定結果 = 多角形内外判定(a, 頂点数, mousex, mousey) redraw 2 alColor 240,240,240 alFillRect 0,0,640,480 alColor 0,0,0 if 判定結果: alColor 200,100,50 alFillPoly a, 頂点数 alColor 50,130,30 alDrawPoly a, 頂点数 alCopyImagetoScreen pos 0, 0 color mes "左クリック: 頂点を作成 mes "右クリック: 最後に作成した頂点を削除 mes ""+mousex+","+mousey + " : " + 判定結果 redraw await 16 loop
タイムスタンプを変更しない
*多角形の内外判定 [#tb03a432] 以下のページを参考にしました。 ~ [[点の多角形に対する内外判定>https://www.nttpc.co.jp/technology/number_algorithm.html]]~ 単純に実装すると、点が線分上にある場合、図形の向きで結果が逆になってしまいます。~ 例を挙げます、次の図を見てください~ ┏━━━━━━━━━━━━┓~ ┃ /┃~ ┃ / ┃~ ┃ / ┃~ ┃ A / ┃~ ┃ ・ ┃~ ┃ / ┃~ ┃ / ┃~ ┃ / ┃~ ┃ / ┃~ ┃ / B ┃~ ┃ / ┃~ ┃/ ┃~ ┗━━━━━━━━━━━━┛~ ↑AとBで結果が逆になる。~ 参考にしたページではそういう仕様で進めているようですが、(図2-3)~ 直感的には線分上は当たりとするか、~ 完全に図形に入り込んでいるときのみ当たりにするかのどちらかの方がいいと思います。~ 今回は、線分上に点がある場合は当たりとする処理にしています。~ **ソース [#i25eba58] #module //polygonは実数または整数の配列 #defcfunc 多角形内外判定 array polygon, int 頂点数, double x, double y count = 0 a_max = 頂点数 * 2 for i,, a_max, 2 始点 = polygon(i), polygon(i + 1) 終点 = polygon((i + 2) \ a_max), polygon((i + 3) \ a_max) if 始点 != 終点{ 判定 = (x - 始点) * (終点.1 - 始点.1) / (終点 - 始点) + 始点.1 - y }else{ 判定 = (x != 始点) || ((y - 始点.1) * (y - 終点.1) > 0) } if 判定 < 0{ if x < 始点 ^ x < 終点{ if 始点 < 終点{ count++ }else{ count-- } } }else: if 判定 == 0{ //点が線分上にある時 return 1 } next return count != 0 #global #include "a2d.hsp" alcreateImage title "多角形内外判定" repeat stick key if key & 256{ a(頂点数 * 2) = mousex, mousey 頂点数++ } if key & 512{ 頂点数 = limit(頂点数 - 1, 0) } 判定結果 = 多角形内外判定(a, 頂点数, mousex, mousey) redraw 2 alColor 240,240,240 alFillRect 0,0,640,480 alColor 0,0,0 if 判定結果: alColor 200,100,50 alFillPoly a, 頂点数 alColor 50,130,30 alDrawPoly a, 頂点数 alCopyImagetoScreen pos 0, 0 color mes "左クリック: 頂点を作成 mes "右クリック: 最後に作成した頂点を削除 mes ""+mousex+","+mousey + " : " + 判定結果 redraw await 16 loop
テキスト整形のルールを表示する