Если ваш кубоид выровнен по оси, такие вычисления излишни - достаточно сравнить координаты.
Для произвольной ориентации вы должны немного изменить код. Удалить странную конструкцию
return numpy.sqrt(numpy.square(numpy.dot(v1, v2)))
Вы имеете в виду abs
? Я сомневаюсь, что алгоритм требует пропустить знак точечного произведения.
def dot(v1, v2):
return numpy.dot(v1, v2)
....
u1 = numpy.subtract(c1, c2)
u2 = numpy.subtract(c1, c3)
u3 = numpy.subtract(c1, c4)
t = pnt
if min(dot(u1, c1), dot(u1, c2)) <= dot(u1, t) <= max(dot(u1, c1), dot(u1, c2))\
and min(dot(u2, c1), dot(u2, c3)) <= dot(u2, t) <= max(dot(u2, c1), dot(u1, c3))\
and min(dot(u3, c1), dot(u3, c4)) <= dot(u3, t) <= max(dot(u3, c1), dot(u3, c4)):
return "In"
else :
return "Out"
Возвращает Out Out In In
для вашего примера и In In Out Out
для моего:
c1 = [-10,-10,-10]
c2 = [-10, -10, 10]
c3 = [-10, 10, -10]
c4 = [10, -10, -10]
plst = [c1,c2,c3,c4]
mlst = [[0,0,0],[1,1,1],[30,2,0],[4,-20,1]]