Уравнение для скользящего столкновения линейных сегментов - PullRequest
0 голосов
/ 06 июня 2011

Мне нужно уравнение, чтобы найти точку F. Точки A, B и D известны. Точка F неизвестна. Точка F находится на линии AB. Линия AB перпендикулярна линии DF. Что такое уравнение для F?

Ответы [ 3 ]

1 голос
/ 07 июня 2011

Я предполагаю, что вам нужно что-то быстрое в вычислительном отношении, так как вы упоминаете «столкновение», а это переполнение стека. Во-первых, диаграмма:

perpendicular intersection of AB and DF, with F the intersection point

Мы хотим вычислить компоненты AF , которые мы будем обозначать f = q i + p j . AFD образует треугольник, поэтому мы можем получить длину f из AD , которую мы обозначим d . Давайте пометим длины курсивом и векторами жирным шрифтом:

f = d cos (θ).

Но триг это вычислительно дорого. Итак, давайте использовать тот факт, что векторное произведение точек между b (AB) и d равно:

b · d = b d cos (θ)

Угол один и тот же, потому что AF и AB находятся на одной линии. Подставляя в течение d cos (θ):

b · d = b f

f = ( b · d ) / b

Теперь у нас есть f , но нам нужны его компоненты p и q. Называя угол к горизонтали φ:

q = f cos (φ)

p = f sin (φ)

Но опять же мы избегаем триггера. Мы знаем, что f идет вдоль b , поэтому f = k b и фактически использует единичный вектор в направлении б

f = f ( b / b )

Подставляя наше выражение для f :

f = [( b · d ) / b ] ( b / б )

= [( b / b ) · d ] ( b / b )

= [ b · d ] b / ( b 2 )

Определение коэффициента k, который является общим для обоих компонентов:

k = (b x d x + b y d y ) / b 2

Разделяя b 2 , мы можем избежать операции с квадратным корнем, чтобы получить единичный вектор вдоль b

Наши компоненты, тогда:

q = k b x

p = k b y

Наконец, добавьте обратно в смещение точки A.

Fx = Ax + q

Fy = Ay + p

Итак, псевдокод:

var vbx = Bx - Ax;   //vector b x component
var vby = By - Ay;   //vector b y component
var dot = vbx*(Dx-Ax) + vby*(Dy-Ay); // dot product of b and d
var k = dot/(vbx*vbx + vby*vby);  // inverse of square of vector b length
var fx = Ax + k*vbx
var fy = Ay + k*vby

Без вызовов с квадратным корнем, без триггера, 8 сложений / вычитаний, 6 умножений, 1 деление. Единственные нестабильности, которые я вижу: делить на ноль, когда A и B находятся в одном положении, возможное переполнение вычисляется dot, если AB большое, а AD большое.

0 голосов
/ 06 июня 2011

Вы точно не указали, где точка F находится вдоль линии DF, поэтому нет однозначного ответа. Если вы просто пытаетесь найти некоторую точку вдоль линии, перпендикулярной линии AB, из точки D, тогда

F.x = D.x + (B.y - A.y)
F.y = D.y + (B.x - A.x)

будет работать.

0 голосов
/ 06 июня 2011

Сначала найдите наклон линии AB с формулой наклона точки, используя координаты A и B: Формула наклона точки

Затем можно найти b, чтобы закончить уравнение для линии AB: y = mx + b где m - это наклон, который вы уже нашли, а b - это y-пересечение, которое вы только что нашли.

Наклон линии DF будет отрицательным обратным углом к ​​наклону линии AB.Включите это в уравнение: y = mx + b, где m - отрицательная обратная величина наклона линии AB, а b - позже.

Теперь решите для b, используя значения x и y точки D, ивключите это в уравнение.

Теперь у вас должно быть уравнение для линии DF и другое уравнение для линии AB.Теперь решите для пересечения двух уравнений, установив их равными друг другу и решив сначала для x, а затем подключив x и найдя y.

Вот пример.

A = (1, 2).B = (4, 8).D = (2, 5).

Линия AB:

    (y - y1) = m*(x - x1)
    (1 - 4) = m*(2 - 8)
    -3 = m*(-6)
    0.5 = m

    y = (0.5)*x + b
    2 = (0.5)*1 + b
    2 = (0.5) + b
    1.5 = b

y = 0.5*x + 1.5

Линия DF:

    m = -(1/mAB)
    m = -(1/0.5)
    m = -2

    y = -2*x + b
    5 = -2*2 + b
    5 = -4 + b
    9 = b

y = -2*x + 9

Пересечение AB и DF (т.е. координаты точки F)

Line DF: y = -2*x + 9
Line AB: y = 0.5*x + 1.5

    -2*x + 9 = 0.5*x + 1.5
    9 = 2.5*x + 1.5
    7.5 = 2.5*x
    x = 3

    y = -2*x + 9
    y = -2*3 + 9
    y = -6 + 9
    y = 3

F = (3, 3)
...