在编程方面,我绝不自称是天才,而我当前的问题让我感到难过。
我发现这个问题Trying to derive a 2D transformation matrix using only the images似乎至少部分回答了我的问题,但应该显示解决方案的图片已不再可用:S
我正在使用C#而不使用WPF,因为我的输入或输出都不需要以图形方式显示。
在我的程序中,我有2个四边形,我们称它们为输入和输出四边形。
输入四边形从顺时针左下方开始具有(2,1),(2,3),(4,4),(3,1)的共同点。
输出四边形可以有任何合并,并将从左下方顺时针再次按顺序列出。
鉴于这8个坐标对,是否可以计算出可以应用于任何单个坐标对的变换矩阵?
我对Matrices不太热,但我愿意学习指向正确的方向。
非常感谢
约什
答案 0 :(得分:2)
您的问题标题具有误导性,因为它暗示您拥有初始和最终矩阵。但是,你真正拥有的是两组积分:起点和终点。
首先,正如您所提到的,可以计算 a 转换矩阵,但不一定是 转换矩阵。对于任何特定的转换,有多种(无限?)方法来实现它。
请注意,以下只是一些想法。我实际上没有这样做过。我假设您有两组积分A
和B
,并且您确定B
是将某些转换应用于A
的结果。
如果允许的唯一转换是翻译,那么这个问题是微不足道的。在这种情况下,您可以只取左下角之间的距离。也就是说,如果原始点为A[0]
到A[3]
,并且新点为B[0]
到B[3]
,则转换只是X,Y平移:{{ 1}}。
如果允许缩放,则可以计算平移,然后缩放。虽然为了简化,首先你要翻译成原点。事实上,如果你首先转换为原点,大部分都会变得更简单。
如果允许轮换,事情会变得更加困难。给定四边形,首先必须旋转物体,使点与原始点的方向相同。这将要求您计算点之间的距离并使用比率来确定哪个点是左下角。然后旋转到适当的位置。
旋转,缩放和翻译的情况应该很容易解决。
剪切有点复杂。你应该能够检测剪切,但我不知道如何检测剪切量。不过,我认为,如果你解决了旋转/缩放/平移的情况,那么剪切解决方案至少会变得更加明显。
答案 1 :(得分:2)
快速谷歌或跳跃,跳过和谷歌找到this。我认为这肯定会解决你的问题。
正如我在评论中提到的,你要求一个同构函数将四边形内的单个点投影到第二个四边形中的一个点。而不是手动完成,我发现了以下算法。
此处为后代发布算法:
设p00,p10,p11和p01为 第一个四边形的顶点 以逆时针顺序列出。
设q00,q10,q11和q01为顶点 中国上市的第二个四边形 逆时针顺序。
定义P10 = p10-p00,P11 = p11-p00,P01 = p01-p00, Q10 = q10-q00,Q11 = q11-q00,Q01 = Q01-Q00。
计算a和b,使Q11 = aQ10 + bQ01。
这是一组两个未知数的线性方程组。
类似地,计算c和d使得P11 = cP10 + dP01。
结果是a> = 0,b> = 0,a + b> 1。 1,c> = 0,d> = 0,和c + d> 1.
可以写出四边形中的任何点p 当p =(1-x-y)p00 + xp10 + yp01其中x = 0,y = 0,(1-d)x + c(y-1)= 0,并且 d(x - 1)+(1 - c)y = 0.
四边形中的任何点q都可以写成q =(1-u-v)q00 + uq10 + vq01其中u = 0,v = 0,(1 - b)u + a(v -1)= 0,b(u - 1)+(1 - a)v = 0.
关于(u,v)与(x,y)的透视映射是u = m0x n0 + n1x + n2y和v = m1y n0 + n1x + n2y其中m0 = ad(1 - c - d),m1 = bc(1 - c - d),n0 = cd(1 - a - b),n1 = d(a - c + bc - ad),n2 = c(b - d - bc + ad)。
有效地将p-四边形映射到“标准”1,<(0,0),(1,0),(0,1),(c,d)>
并且q-四边形映射到<(0,0),(1,0),(0,1),(a,b)>。
(x,y)到(u,v)映射与这两者相关。
您可以验证
•(x,y)=(0,0)映射到(u,v)=(0,0)
•(x,y)=(1,0)映射到(u,v)=(1,0)
•(x,y)=(0,1)映射到(u,v)=(0,1)
•(x,y)=(c,d)映射到(u,v)=(a,b)
我将给出另一个答案,描述我如何在评论中解决这个例子 - 这个答案太长了。
答案 2 :(得分:1)
要解决一个示例案例 - 将一个点(5,5)从一个正方形(0,0) - (10,10)转换到一个正方形(0,0) - (20,20) - 你在正确的轨道,但要么太快停止,要么迷路了。该算法并不是最简单的,但一旦你了解了你的目的,它就非常有用。
处理垂直于x&的“正方形”时y轴,然后是a = b = c = d = 1
。
让我们调用四元组p1,p2,p3和p4的点。现在将a
视为描述p2和p3(相对于p1)之间的关系,并将b描述为描述p4和p3(相对于p1)之间的类似关系。非常简单,您希望计算出a
和b
a * length of side p1-p2
= x3的坐标和b * length of side p1-p4
= y坐标p3。即。从左下角开始,我需要添加多少个底边以获得右上角的x坐标,对于y坐标也是如此。虽然这是一个满口,当你正在处理一个正方形时,这里的正确结果肯定是1和1.一旦你离开垂直方块,它就不那么简单,但这很容易想象。
当你解决这个问题时
p =(1-x-y)p00 + xp10 + yp01
,其中x >= 0
y >= 0
(1 - d)x + c(y - 1) = 0
d(x - 1)+(1 - c)y = 0
使用点(5,5),您将得到x = 1/2,y = 1/2的值。请注意,这些不是您的点的x和y坐标。相反,如果将四边形投影到(1,1)大小的正方形,它们代表了你的观点。在这种情况下,它们意味着您的点位于1/2(横向)和1/2向上(垂直)多边形的位置 - 即它位于中间。
将a,b,c,d,x
和y
值插入大型公式(按照链接而不是尝试在此处阅读!),您还得到(u,v)=(1/2, 1/2),其中u& v代表上面相同的概念,但在第二个方格中。这是正确的,因为预期结果点位于第二个多边形的中间。
最后,当您将u, v
插入等式
q =(1-u-v)q00 + uq10 + vq01
你会得到点q =(10,10),这正是你所期望的。
我不知道&没有考虑在代码中求解联立方程式,我确信有一种方法,但它可能并不简单但不幸的是我不得不把它留给你。我刚刚在一张纸上完成了这一切,一切顺利;然而,除了更琐碎的例子之外,我的数学有点生疏。