Найти пополам две 3D линии - PullRequest
0 голосов
/ 19 января 2020

Я хотел бы рассчитать пополам две трехмерные линии, которые имеют точку пересечения. Линии - это прямые линии, определяемые точкой и вектором направления. Как я могу найти уравнение двух линий, которые делятся на две части?

Ответы [ 2 ]

1 голос
/ 19 января 2020

Пусть линии определены как A + t * dA, B + s * dB, где A, B - базовые точки, а dA, dB - нормализованные векторы направления.

Если гарантируется, что линии имеют пересечение, это можно найти, используя подход с точечным произведением (адаптированный из алгоритма минимального расстояния перекоса):

u = A - B
b = dot(dA, dB)
if abs(b) == 1: # better check with some tolerance
   lines are parallel
d = dot(dA, u)
e = dot(dB, u)
t_intersect = (b * e - d) / (1 - b * b)
P = A + t_intersect * dA

Теперь о биссектрисе:

bis1 = P + v * normalized(dA + dB)
bis2 = P + v * normalized(dA - dB)

Быстрая проверка для 2D-кейса

enter image description here

k = Sqrt(1/5) 
A = (3,1)     dA = (-k,2k)
B = (1,1)     dB = (k,2k)
u = (2,0)
b = -k^2+4k2 = 3k^2=3/5
d = -2k  e = 2k
t = (b * e - d) / (1 - b * b) = 
    (6/5*k+2*k) / (16/25) =  16/5*k * 25/16 = 5*k
Px = 3 - 5*k^2 = 2
Py = 1 + 10k^2 = 3
normalized(dA+dB=(0,4k)) =   (0,1)
normalized(dA-dB=(-2k,0)) = (-1,0)
0 голосов
/ 20 января 2020

Python реализация:

from sympy.geometry import Line3D, Point3D, intersection


# Normalize direction vectors:
def normalize(vector: list):
    length = (vector[0]**2 + vector[1]**2 + vector[2]**2)**0.5
    vector = [i/length for i in vector]
    return vector

# Example points for creating two lines which intersect at A
A = Point3D(1, 1, 1)
B = Point3D(0, 2, 1)

l1 = Line3D(A, direction_ratio=[1, 0, 0])
l2 = Line3D(A, B)

d1 = normalize(l1.direction_ratio)
d2 = normalize(l2.direction_ratio)

p = intersection(l1, l2)[0]  # Point3D of intersection between the two lines

bis1 = Line3D(p, direction_ratio=[d1[i]+d2[i] for i in range(3)])
bis2 = Line3D(p, direction_ratio=[d1[i]-d2[i] for i in range(3)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...