Работаю над ускорением программы. Нужно функцию intersection_line_and_triangle вызвать для numpy массива Fig размерностью Nx9 (здесь 9 координат для трех вершин треугольника, координаты храняться в каждом Fig) . + хотелось бы получить булев массив good_indx (состоящий из True и False, соответственно, чтобы сделать присвоение X_good[good_indx]=X[good_indx]), для этого нужно избавиться еще от одно цикла :)
def intersection_line_and_triangle(x,y,tri):
a=tri[:3]; b=tri[3:6]; c=tri[6:];
n=normal(tri)
d=dot(a-x,n)/dot(y-x,n)
if d<0 or d>1:
return False
zz=x+d*(y-x);
za=a-zz; zb=b-zz; zc=c-zz
mza=linalg.norm(za);
mzb=linalg.norm(zb);
mzc=linalg.norm(zc)
if arccos(dot(za,zb)/mza/mzb) + arccos(dot(zb,zc)/mzb/mzc) + arccos(dot(zc,za)/mzc/mza) < 2.*pi:
return False
else:
return True
быдлокод (работающий, но очень медленно) здесь:
def intersection_line_and_border(x,y,b):
res=False
for i in range(b.shape[0]):
if intersection_line_and_triangle(x,y,b[i]):
res=True
return res
for i in range(X):
for j in range(3):
if not intersection_line_and_border(center_point,X[i][3*j:3*(j+1)],Fig):
X_good[i][3*j:3*(j+1)]=X[i][3*j:3*(j+1)]