Отображение координат текстуры, как сопоставить координаты 4 треугольников в квадрате с 4 треугольниками в треугольнике - PullRequest
1 голос
/ 22 февраля 2010

Учитывая изображение ниже

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

2.снова обновите изображение, чтобы пометить подреугольники как A, B, C, D серым цветом

Mapping diagram

Что такое псевдоалгоритм для отображения координат(x, y) в левом квадрате, так что координата (u, v) создается внутри прямоугольника, ограничивающего треугольник справа, так что точки интерполируются между точками отображения, как показано на диаграмме?

От 1 до 4 равноудалены от треугольника слева направо, хотя моя иллюстрация немного шероховата по краям:)

Это для создания грубой и готовой панели для крышки скайбокса сверхуполовина панорамной фотографии на 360 градусов.

обновление 3 на основе обратной связи

Первый шаг - выяснить, в каком треугольнике мы находимся для левой диаграммы на основекоординаты (x, y).

Второй крутой шаг - определить расстояние по вершинам этого треугольника.Затем используйте эти расстояния, чтобы получить координаты соответствующего треугольника на диаграмме справа

обновление 4 - код для идентификации треугольника на левой диаграмме

Public Function TriangleIndex(ByVal x As Integer, ByVal y As Integer, ByVal w as integer, ByVal h as integer) as integer                              
    Dim AboveForwardSlashDiagonal As Boolean = ((((h * x) + (w * y)) - (h * w)) < 0)
    Dim AboveBackSlashDiagonal As Boolean = (((h * x) - (w * y)) > 0)
    If AboveForwardSlashDiagonal Then
         If AboveBackSlashDiagonal
            return 2 ' C
         else
            return 3 ' D
         end if
    else
         If AboveBackSlashDiagonal
            return 1 ' B
         else
            return 0 ' A
         end if
    End If
End Function

обновление 5 - шаблон для решения кода

w1 и h1 - размеры левой диаграммы w2, а h2 - размеры правой диаграммы

Private Function TranslateToTriangle(ByVal x1 As Integer, ByVal y1 As Integer, ByVal w1 As Integer, ByVal h1 As Integer, ByVal w2 As Integer, ByVal h2 As Integer) As System.Drawing.Point

    Dim ReturnPoint As New System.Drawing.Point


        select case TriangleIndex(x1,y1,w1,h1)
            case 0

            case 1

            case 2

            case 3

        end select

    Return ReturnPoint

End Function

формула обновления 6для площади треугольника с учетом его длины - что может быть полезно при расчете барицентрических весов?

Private Function AreaOfTriangle(ByVal LengthA As Single, ByVal LengthB As Single, ByVal LengthC As Single) As Single
    Dim Perimeter As Single = LengthA + LengthB + LengthC
    Return 1 / 4 * Math.Sqrt(Perimeter * (Perimeter - 2 * LengthA) * (Perimeter - 2 * LengthB) * (Perimeter - 2 * LengthC))
End Function

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

Что ж, ваш комментарий к ответу @ Steven_W делает ответ на ваш вопрос более ясным. Вы действительно хотите отобразить точки в 4 треугольниках (125, 235, 435, 415) в вашем квадратном квадрате в соответствующие 4 треугольника в другом квадратике (125, 235, 435, 415). О, у вас нет треугольника 415 во второй коробке, возможно, вам следует, а может и нет.

Так что теперь вы должны отобразить точки от треугольника к треугольнику, что должно быть легко. В качестве координат для каждой точки в вашем начальном треугольнике используйте ее положение относительно всех 3-х вершин, затем используйте ту же позицию относительно 3-х вершин «конечного» треугольника. Возможно, вам не помешает использовать только 2 вершины треугольника для координат.

НТН

Запись в Википедии Трилинейные координаты Я достаточно хорошо объясняю математику.

1 голос
/ 22 февраля 2010

Рассмотрим сначала случай треугольника a.

Предполагая, что ваш источник находится в точке 5, координаты точек 1 и 2 равны (-x0, y0) и (x0, y0), мы должны иметь следующее.

Отображение из старых координат (x, y) в новые (xnew, ynew) должно быть линейным. Это означает, что у нас есть следующие формулы с еще неопределенными коэффициентами:

xnew = A*x + B*y + C
ynew = D*x + E*y + F

Как мы можем определить коэффициенты? У нас есть три пары значений: (-x0, y0) -> (-x0, y0), (x0, y0) -> (-x0/2, y0) и (0, 0) -> (0, -y0). Это дает нам следующее:

-x0 = -A*x0 + B*y0 + C   (1)        -x0/2 = A*x0 + B*y0 + C   (3)
 y0 = -D*x0 + E*y0 + F   (2)         y0   = D*x0 + E*y0 + F   (4)

  0 =  A*0  + B*0  + C   (5)
-y0 =  D*0  + E*0  + F   (6)

Хорошо, пока. (5) дает нам C = 0, (6) дает F = -y0. Сложив (2) и (4), получим 2*y0 = 2*E*y0 + 2*(-y0), следовательно E = 2. Вычитая (2) и (4), мы получаем 0 = 2*D*x0, следовательно D = 0. Сложив (1) и (2) и учитывая, что C = 0, мы получим -(3/4)*x0 = 2*B*y0, следовательно B = -3/4*x0/y0. Наконец, вычитая (1) и (2) мы получаем x0/2 = 2*A*x0, следовательно A = 1/4.

Теперь мы можем записать необходимое отображение:

xnew = 0.25*x - 0.75*(x0/y0)*y
ynew = 2*y - y0

Точно так же, для треугольника c получаем:

xnew = -0.25*x - 0.25*(x0/y0)*y
ynew = -2*y - y0
1 голос
/ 22 февраля 2010

Не совсем понятно, почему определенные точки сопоставляются с их аналогом в треугольнике.

Например, где должна быть точечная карта с этим на равном расстоянии между «1» и «4»?

Или точка чуть выше "числа 5"?

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