Python код, чтобы проверить, находится ли точка внутри или снаружи кубоида - PullRequest
0 голосов
/ 20 января 2020

для конкретной цели я должен выяснить, находится ли заданная точка внутри кубоида или нет. С помощью этой ссылки (https://math.stackexchange.com/questions/1472049/check-if-a-point-is-inside-a-rectangular-shaped-area-3d). Я написал прототип кода, который может проверить, находятся ли точки внутри кубоида или нет.

(для математики этого, пожалуйста, обратитесь по этой ссылке.)

для этого мы должны определить 3 взаимно перпендикулярных оси кубоида.

Вот мой код

import numpy

def dot(v1, v2):
    return numpy.sqrt(numpy.square(numpy.dot(v1, v2)))

def InCuboid ( plist,pnt):
    c1 = plist[0]
    c2 = plist[1]
    c3 = plist[2]
    c4 = plist[3]
    u1 = numpy.subtract(c1, c2)
    u2 = numpy.subtract(c1, c3)
    u3 = numpy.subtract(c1, c4)
    t = pnt
    if dot(u1, c1) <= dot(u1, t) <= dot(u1, c2) and dot(u2, c1) <= dot(u2, t) <= dot(u2, c3) and dot(u3, c1) <= dot(u3,t) <= dot(u3, c4):
        return "In"
    else :
        return "Out"

c1 = [-100,1,-10]
c2 = [-50,1,-10]
c3 = [-100,3.0,-10]
c4 = [-100,1,10]

plst = [c1,c2,c3,c4]
mlst = [[0,0,0],[100,1000,1000],[-80,2,0],[-80,2,1]]

for p in mlst :
    print InCuboid(plst,p)


Если общая вершина находится в начале координат, это работает нормально. Но если это какой-то общий пункт, код не работает. Кто-нибудь может помочь мне найти проблему?

1 Ответ

2 голосов
/ 20 января 2020

Если ваш кубоид выровнен по оси, такие вычисления излишни - достаточно сравнить координаты.

Для произвольной ориентации вы должны немного изменить код. Удалить странную конструкцию

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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...