輪郭内の内外判定を正しく判定したい
輪郭線と座標をプロットすると輪郭線内に座標があると目でわかるのですが、プログラムが判定すると一部の外積が正になってしまい輪郭線外にあると判定され、うまいこといきません。
外積が正になる部分を回避してうまいこと判定する方法を知りたいです。
Python
1import numpy as np 2import copy 3import pandas as pd 4import matplotlib.pyplot as plt 5 6#多角形の端の座標点を決める 7#(x,y)>(0,0) 8c = [np.array([2,1]),np.array([1,3]),np.array([1,7]),np.array([3,6]),np.array([4,8]),np.array([6,9]),np.array([8,8]),np.array([9,6]),np.array([8,3]),np.array([6,1])] 9 10 11name_list = [] 12for i in range(1,len(c)+1): 13 x = 'c'+str(i) 14 name_list.append(x) 15 #x = 'c{}'.format(i) 16 # = np.array([3,4]) 17 18#求めたい任意座標点の入力 19#(X,Y)>(0,0) 20point =np.array([7 ,8]) 21 22#多角形と任意座標の可視化 23x = [] 24y = [] 25 26for i in range(len(c)): 27 #c[i] = 'c'+str(i) 28 #str(name_list[i-1]) = c[i-1] 29 exec('x_num = c[i][0]'.format(i)) 30 x.append(x_num) 31 exec('y_num = c[i][1]'.format(i)) 32 y.append(y_num) 33x.append(c[0][0]) 34y.append(c[0][1]) 35plt.plot(x, y, label="test") 36plt.plot(point[0], point[1],marker="o",linestyle='None',markersize=6, color='red') 37plt.show() 38 39 40def inside(point,c): 41 #全てのベクトル計算 42 for i in range(1,len(c)+1): 43 if i < len(c): 44 print(c[i]) 45 kakomi = 'vector_c{}c{} = (c[i]-c[i-1])'.format(i,i+1) 46 exec(kakomi) 47 uchigawa = 'vector_c{}point = (point-c[i-1])'.format(i,i) 48 exec(uchigawa) 49 if i == len(c): 50 kakomi2 = 'vector_c{}c1 = (c[0]-c[i-1])'.format(i,i) 51 exec(kakomi2) 52 uchigawa2 = 'vector_c{}point = (point-c[i-1])'.format(i,i) 53 exec(uchigawa2) 54 #全ての外積計算 55 for i in range(1,len(c)+1): 56 if i < len(c): 57 get = 'outer_product_c{}c{}_point = np.cross(vector_c{}c{}, vector_c{}point)'.format(i,i+1,i,i+1,i) 58 exec(get) 59 if i == len(c): 60 get2 = 'outer_product_c{}c1_point = np.cross(vector_c{}c1, vector_c{}point)'.format(i,i,i) 61 exec(get2) 62 63 #外積結果をリストに内包する 64 list =[] 65 for i in range(1,len(c)+1): 66 if i < len(c): 67 s = eval('outer_product_c{}c{}_point'.format(i,i+1)) 68 list.append(s) 69 if i == len(c): 70 t = eval('outer_product_c{}c1_point'.format(i)) 71 list.append(t) 72 print(list) 73 74 #リスト内に1つでも正数があれば、Trueで外側 75 #なければ、Falseで内側 76 if any((x > 0 for x in list)) == True: 77 print('外側にあります') 78 else: 79 print('内側にあります') 80if __name__ == '__main__': 81 x = inside(point,c)
"実行結果"
[array(-17), array(-24), array(8), array(-6), array(-3), array(-1), array(-2), array(-8), array(-12), array(-28)]
外側にあります
このように、内側にある座標も外側判定されてしまいます。
回避する方法をご教授いただけたら幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/08 15:49