Учитывая изображение ниже
1.Я обновил изображение на основе обратной связи от Steven_W, так что на правой диаграмме вместо треугольника есть 4 треугольника, что имеет больше смысла!
2.снова обновите изображение, чтобы пометить подреугольники как A, B, C, D серым цветом
Что такое псевдоалгоритм для отображения координат(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