Линейная интерполяция для нахождения координат в треугольнике - PullRequest
4 голосов
/ 17 января 2012

Предположим, у вас есть следующие три точки A, B и C, как показано на следующем рисунке:

enter image description here

Точки всегда сортируются в соответствии с их вертикальным смещением, поэтому самой верхней точкой всегда является A. Иногда B и C могут иметь одинаковую координату y.

Я пытаюсь найти координату x для точки D. Я могу найти координату Y для D, интерполируя точки A.y и C.y в ​​(B.y / (C.y - A.y)). Я делаю свою интерполяцию, используя следующую формулу (в C ++)

float linearInterpolation(float a, float b, float t)
{
    return a + (t * (b - a));
}

То есть, другими словами, D.y = линейная интерполяция (A.y, C.y, (B.y - A.y) / (C.y - A.y))

Итак, подведем итог: мой вопрос: как мне найти D.x?

Спасибо

-

Ответ:

Просто чтобы уточнить, вот решение, которое было предложено и сработало:

D.x = A.x + (B.y - A.y) * (C.x - A.x) / (C.y - A.y);
D.y = B.y;

Как показано на рисунке ниже:

enter image description here

Ответы [ 3 ]

7 голосов
/ 17 января 2012

Это координата x , которая требует интерполяции. y координаты B и D равны на вашей диаграмме.

D.x = A.x + (B.y - A.y) * (C.x - A.x) / (C.y - A.y);
D.y = B.y;

Вы должны также предусмотреть случайCy == Ay, где Dx может быть где-нибудь между Ax и Cx. Один из способов сделать это - не рисовать треугольники, для которых abs(C.y - A.y) < delta, с delta порядка 1 пикселя.

2 голосов
/ 17 января 2012
D.y = B.y

delta_x = C.x - A.x 
delta_y = C.y - A.y 

dist_y = B.y - A.y

percent = dist_y / delta_y

D.x = A.x + percent * delta_x
1 голос
/ 17 января 2012

Функция для линии AC: y = mx + b.

m = (Ay - Cy) / (Ax - Cx)

Затем можно заменить Aв: A.y = A.x * m + b

b = Ay - Ax * m

Вам нужно вычислить x по y, поэтому поменяйте местами функцию.

mx = y -b

x = (y -b) / m

Это три шага, чтобы найти x от y вдоль этой стороны треугольника.Обратите внимание, что вам не нужно делать какую-либо интерполяцию, чтобы найти Dy.Проще говоря, Dy = By

Обратите внимание, что вы, вероятно, можете оптимизировать то, что я только что написал, в меньшую серию шагов.Я думаю, что лучше писать код, который легче читать.

...