纹理坐标映射如何将正方形中的4个三角形的坐标映射到三角形中的4个三角形

时间:2010-02-22 10:46:36

标签: vb.net coordinates

如下图所示

1。我根据Steven_W的反馈更新了图像,因此右手图中有4个三角形而不是3个更有意义!

2。再次更新图像,将子三角形标记为灰色的A,B,C,D

Mapping diagram http://i49.tinypic.com/17eank.jpg

用于在左手方块中映射坐标(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 个答案:

答案 0 :(得分:2)

嗯,您对@ Steven_W的回答的评论使您对问题的回答更加清晰。您实际上想要将方框中的4个三角形(125,235,435,415)中的点映射到另一个方框(125,235,435,415)中的相应4个三角形。哦,你的第二个盒子里没有三角形415,也许你应该或不是。

所以现在你必须将点从三角形映射到三角形,这应该很容易。由于“开始”三角形中每个点的坐标使用其相对于所有3个顶点的位置,然后使用相对于“目标”三角形的3个顶点的相同位置。你可能只使用2个三角形顶点来获得坐标。

HTH

维基百科条目trilinear coordinates我认为数学解释得很好。

答案 1 :(得分:1)

为什么某些点映射到三角形上的对应点并不是很清楚。

例如,“1”和“4”之间的点映射应该在何处等距?

或者,只是“高于”数字5点?

答案 2 :(得分:1)

我们首先考虑三角形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