Вопрос в том, как использовать два np.where в одном и том же утверждении, например так (упрощенно):
np.where((ndarr1==ndarr2),np.where((ndarr1+ndarr2==ndarr3),True,False),False)
Чтобы избежать вычисления второго условного выражения, если первое не достигнуто.
Моя первая задача - найти пересечение луча в треугольнике, если он есть.Эта проблема может быть решена с помощью этого алгоритма (находится в stackoverflow):
def intersect_line_triangle(q1,q2,p1,p2,p3):
def signed_tetra_volume(a,b,c,d):
return np.sign(np.dot(np.cross(b-a,c-a),d-a)/6.0)
s1 = signed_tetra_volume(q1,p1,p2,p3)
s2 = signed_tetra_volume(q2,p1,p2,p3)
if s1 != s2:
s3 = signed_tetra_volume(q1,q2,p1,p2)
s4 = signed_tetra_volume(q1,q2,p2,p3)
s5 = signed_tetra_volume(q1,q2,p3,p1)
if s3 == s4 and s4 == s5:
n = np.cross(p2-p1,p3-p1)
t = np.dot(p1-q1,n) / np.dot(q2-q1,n)
return q1 + t * (q2-q1)
return None
Вот два условных оператора:
- s1! = S2
- s3 == s4 & s4 == s5
Теперь, когда у меня есть> 20k треугольников для проверки, я хочу применить эту функцию ко всем треугольникам одновременно.
Первое решение:
s1 = vol(r0,tri[:,0,:],tri[:,1,:],tri[:,2,:])
s2 = vol(r1,tri[:,0,:],tri[:,1,:],tri[:,2,:])
s3 = vol(r1,r2,tri[:,0,:],tri[:,1,:])
s4 = vol(r1,r2,tri[:,1,:],tri[:,2,:])
s5 = vol(r1,r2,tri[:,2,:],tri[:,0,:])
np.where((s1!=s2) & (s3+s4==s4+s5),intersect(),False)
, где s1, s2, s3, s4, s5 - массивы, содержащие значение S для каждого треугольника.Проблема в том, что это означает, что мне нужно вычислить s3, s4 и s5 для всех треугольников.
Теперь идеальным было бы вычислить утверждение 2 (и s3, s4, s5) только тогда, когда утверждение 1 истинно, счто-то вроде этого:
check= np.where((s1!=s2),np.where((compute(s3)==compute(s4)) & (compute(s4)==compute(s5), compute(intersection),False),False)
(чтобы упростить объяснение, я просто указал «вычислять» вместо всего вычислительного процесса. Здесь «вычислять» - это только для соответствующих треугольников).
Теперь, конечно, эта опция не работает (и вычисляет s4 два раза), но я бы с удовольствием дал несколько рекомендаций по аналогичному процессу