Нахождение пересечения в треугольнике от вектора, происходящего с определенной стороны - PullRequest
1 голос
/ 05 февраля 2010

Я знаю координаты A, B и C .. Я также знаю вектор V, происходящий из C ..

Я знаю, что вектор пересекает A и B, я просто не знаю, как найти меня.

Кто-нибудь может объяснить шаги, связанные с решением этой проблемы?

Большое спасибо.

http://img34.imageshack.us/img34/941/triangleprob.png

Ответы [ 3 ]

3 голосов
/ 05 февраля 2010

Если вы знаете A и B, вы знаете уравнение для линии AB, и вы сказали, что знаете V, так что вы можете сформировать уравнение для линии V .... Что ж, это единственная точка, которая удовлетворяет обоим этим уравнениям.

Уравнение для линии AB:

  (bx-ax)(Y-ay) = (by-ay)(X-ax)

Если вы знаете направление (или наклон = m) вектора и любую точку, лежащую на векторе, тогда уравнение линии для вектора V будет

Y = mX = b

где m - наклон или направление линии, а b - координата y, где она пересекает вертикальную ось y = (где X = 0)

если вы знаете точку на линии (т. Е. C = (s, t)), то вы решаете для b следующим образом:

t = ms + b ==> b = t - ms

так что уравнение становится

Y = mX + t-ms
1 голос
/ 06 февраля 2010
i = C+kV
Lets call N the normal to the line A,B so N = [-(B-A).y, (B-A).x]
Also, for any point on the line:
(P-A)*N = 0       -- substitute from line 1 above:
(C+kV-A)*N = 0
(kV+C-A)*N = 0
kV*N + (C-A)*N = 0
kV*N = (A-C)*N
k = [(A-C)*N]/V*N
Now that we have k, plug it into line 1 above to get i.

Здесь я использую * для представления точечного произведения, поэтому расширяем его до обычного умножения:

k = ((A.x-C.x)*-(B.y-A.y) + (A.y-C.y)*(B.x-A.x)) / (V.x*-(B.y-A.y) + V.x*(B.x-A.x))
I.x = C.x + k*V.x
I.y = C.y + k*V.y

Если я что-то не испортил ....

0 голосов
/ 06 февраля 2010

Простая алгебра.Сложная часть часто просто записывает основные уравнения, но как только они записаны, все остальное легко.

Можете ли вы определить линию, которая исходит из точки C = [c_x, c_y] и указывает вдольвектор V = [v_x, v_y]?Хороший способ представить такую ​​линию - использовать параметрическое представление.Таким образом,

V(t) = C + t*V

В терминах векторных элементов мы имеем это как

V(t) = [c_x + t*v_x, c_y + t*v_y]

Посмотрим, как это работает.Когда t = 0, мы возвращаем точку C, но для любого другого значения t мы получаем какую-то другую точку на линии.

Как насчет отрезка, который проходит через A и B?Одним из способов решения этой проблемы было бы определение второй линии параметрически таким же образом.Затем найдите систему из двух уравнений с двумя неизвестными, чтобы найти пересечение.

Более простой подход - взглянуть на вектор нормали к отрезку AB.Этот вектор задается как

N = [b_y - a_y , a_x - b_x]/sqrt((b_x - a_x)^2 + (b_y - a_y)^2)

Обратите внимание, что здесь определено N, чтобы иметь единичную норму.

Итак, теперь, когда мы узнаем, лежит ли точка вдоль линии, соединяющейА и Б?Это легко сейчас.Это произойдет, когда определенное ниже скалярное произведение будет точно равным нулю.

dot(N,V(t) - A) = 0

Разверните это и решите для параметра t.Мы можем записать это, используя точечные произведения.

t = dot(N,A-C)/dot(N,V)

Или, если вы предпочитаете,

t = (N_x*(a_x - c_x) + N_y*(a_y - c_y)) / (N_x*v_x + N_y*v_y))

И как только мы получим t, подставим в выражение выше V (t).Давайте посмотрим всю эту работу на практике.Я выберу несколько точек A, B, C и вектор V.

A = [7, 3]
B = [2, 5]
C = [1, 0]

V = [1, 1]

Наш вектор нормалей N после нормализации будет выглядеть примерно так:

N = [0.371390676354104, 0.928476690885259]

Параметр линии,t, то будет

t = 3.85714285714286

И мы находим точку пересечения как

C + t*V = [4.85714285714286, 3.85714285714286]

Если вы нанесете точки на листе бумаги, все они должны совпасть, и все только внесколько простых выражений.

...