Sub in_out_check(bs, xx, yy, x1, y1, x2, y2, in_out) in_out = False sub_row = bs.Cells(Rows.Count, 1).End(xlUp).Row For check_row = 2 To sub_row x1 = bs.Cells(check_row, 1) - xx y1 = bs.Cells(check_row, 2) - yy x2 = bs.Cells(check_row, 3) - xx y2 = bs.Cells(check_row, 4) - yy If y1 * y2 > 0 Then GoTo bottom If x1 < 0 And x2 < 0 Then GoTo bottom If x1 + y1 * (x2 - x1) / (y1 - y2) >= 0 Then check_count = check_count + 1 End If bottom: Next check_row If check_count Mod 2 = 1 Then in_out = True End Sub
■ 説明 ■
callで呼び出します
bs 多角形座標が転記されているシート名
xx 対象点X座標
yy 対象点Y座標
x1,y1,x2,y2 線分の端部座標
check_count 交差回数(奇数ならば多角形内部にある)
in_out 内部ならtrue 外部ならfalseを返します
多角形座標をシートに転記した場合で記述してあります。
メイン部分は代入が終わった後のif文以降ですので
必要に応じて書き換えてください
■ 追記 ■
十分な長さを持つ線分と、多角形の各辺が交わる回数が
・奇数であれば多角形内
・偶数ならば多角形外
という定理を使用しています。
点1を原点として、各辺がX軸と交差するかどうかを全ての辺に対して判定し、
交差した回数を観察して判定させています。