在编程方面我绝不自称是天才,而我当前的问题让我感到难过.
我发现这个问题试图仅使用似乎至少部分回答我的问题的图像来导出2D变换矩阵,但应该显示解决方案的图像不再可用:S
我正在使用C#而不使用WPF,因为我的输入或输出都不需要以图形方式显示.
在我的程序中,我有2个四边形,让我们称它们为输入和输出四边形.
输入四边形从左下方顺时针方向具有(2,1),(2,3),(4,4),(3,1)的共同点.
输出四边形可以有任何合并,并将从左下方顺时针再次按顺序列出.
给定这8个坐标对,是否可以计算出可以应用于任何单个坐标对的变换矩阵?
我对Matrices不太热,但我愿意学习指向正确的方向.
非常感谢
玩笑
快速谷歌或跳跃、跳过和谷歌发现了这个。我认为它肯定会解决你的问题。
\n\n正如我在评论中提到的,您需要一个同构函数来将四边形内的单个点投影到第二个四边形中的一个点。我找到了以下算法,而不是手动计算出来。
\n\n将算法发布在这里供后代使用:
\n\n\n\n\n令 p00、p10、p11 和 p01 为按逆时针顺序列出的第一个四边形的顶点。
\n\n令 q00、q10、q11 和 q01 为按逆时针顺序列出的第二个四边形的顶点。
\n\n定义 P10 =\n p10-p00、P11 = p11-p00、P01 = p01-p00、\n Q10 = q10-q00、Q11 = q11-q00 和 Q01 =\n q01-q00。
\n\n计算 a 和 b,使得 Q11 =\n aQ10 + bQ01。
\n\n这是两个未知数的两个线性方程组。
\n\n同样,计算 c 和 d,使得 P11 = cP10 + dP01。
\n\n事实证明,a >= 0、b >= 0、a + b> 1、c >= 0、d >= 0、c\n + d> 1。
\n\n四边形中的任意点 p 都可以写为 p =(1-xy)p00 + xp10 + yp01,其中 x = 0, y = 0,(1 - d)x + c(y - 1) = 0,并且\nd(x - 1)+(1 - c)y = 0。
\n\n四边形中的任意点 q 都可以写为 q\n =(1-uv)q00 + uq10 + vq01 其中 u = 0, v = 0,(1 - b)u + a(v -1) = 0,并且b(u -\n 1) + (1 - a)v = 0。
\n\n(u,v) 到 (x,y) 的透视映射为 u = m0x n0 + n1x + n2y 且 v = m1y n0 +\n n1x + n2y 其中 m0 = ad(1 - c - d), m1 = bc (1 - c - d),n0 = cd(1 - a - b),n1 =\nd(a - c + bc - ad),n2 = c(b - d - bc + ad)。
\n\n实际上,p 四边形映射到 \xe2\x80\x9cstandard\xe2\x80\x9d one, <(0, 0),(1, 0),(0, 1),(c,d)>
\n\nq 四边形映射为 <(0, 0),(1, 0), (0, 1), (a,b)>。
\n\n(x,y) 到 (u,v) 的映射将这两者联系起来。
\n\n你可以验证一下
\n\n\xe2\x80\xa2 (x,y)=(0, 0) 映射到 (u,v)=(0, 0)
\n\n\xe2\x80\xa2 (x,y)=(1, 0) 映射到 (u,v)=(1, 0)
\n\n\xe2\x80\xa2 (x,y)=(0, 1) 映射到 (u,v)=(0, 1)
\n\n\xe2\x80\xa2 (x,y)=(c,d) 映射到 (u,v)=(a,b)
\n
我将给出另一个答案,描述我如何解决评论中的示例 - 这个答案太长了。
\n| 归档时间: |
|
| 查看次数: |
2068 次 |
| 最近记录: |