我有图像中6个点的坐标
(170.01954650878906, 216.98866271972656)
(201.3812255859375, 109.42137145996094)
(115.70114135742188, 210.4272918701172)
(45.42426300048828, 97.89037322998047)
(167.0367889404297, 208.9329833984375)
(70.13690185546875, 140.90538024902344)
我有一个点作为中心[89.2458, 121.0896]
。我尝试使用4个旋转度(从0,90,-90180)和6个缩放因子(0.5,0.75,1,1.10,1.25,1.35,1.5)重新计算点的位置。
我的问题是如何旋转和缩放上述点相对于中心点,并得到这6个点的新坐标?在
非常感谢你的帮助。在
数学
一种数学方法是将这些数据表示为从中心到图像点的向量,将这些向量转换到原点,应用转换并围绕中心点重新定位它们。让我们详细看看这是如何工作的。在
表示为向量
我们可以在一个网格中显示这些向量,这将产生下面的图像
这张图片提供了一个很好的观察这些点的方法,所以我们可以用视觉的方式看到我们的行为。中心点在所有箭头的开头用一个点标记,每个箭头的末端是问题中提供的一个点的位置。在
一个向量可以看作是点坐标值的列表
可能是python中向量的表示,它只保存一个点的坐标,所以问题中的格式可以按原样使用!请注意,在我的答案中,我将使用
0
作为x坐标,1
作为y坐标。在我只添加了这个表示作为一个视觉辅助,我们可以把任何两个点的集合看作一个向量,不需要计算,这只是看这些点的另一种方式。在
翻译到原点
第一次计算发生在这里。我们需要把这些向量都转换到原点。我们可以很容易地从所有其他点减去中心点的位置,例如(可以在一个简单的循环中完成):
^{pr2}$结果点现在可以绕原点旋转并相对于原点缩放。新点(作为向量)如下所示:
在这张图片中,我故意保持比例不变,这样很明显,这些向量(箭头)在大小和方向上完全相同,只是移动到(0,0)左右。在
为什么是起源
那么为什么要把这些点翻译成原点呢?好吧,在原点周围旋转和缩放操作很容易(数学上)做,而在其他点周围就不那么容易了。在
另外,从现在开始,我将只在这些图像中包括第一点、第二点和第四点,以节省一些空间。在
围绕原点缩放
在原点周围缩放操作非常简单。只需将点的坐标乘以比例因子:
从视觉上看,如下所示(缩放比例均为1.5):
其中蓝色箭头为原始矢量,红色箭头为缩放矢量。在
旋转
现在轮换一下。这有点难,因为旋转通常是用这个向量的矩阵乘法来描述的。在
与之相乘的矩阵如下
(来自wikipedia: Rotation Matrix)
所以如果V是向量,我们需要执行}。此旋转将始终逆时针!为了顺时针旋转,我们只需使用
V_r = R(t) * V
来得到旋转向量{R(-t)
。在因为这个问题只需要90°的倍数,矩阵就变成了一个几乎微不足道的问题。逆时针旋转90°时,矩阵为:
基本上是代码:
同样,这可以很好地以视觉方式显示:
我已经匹配了向量的颜色。在
顺时针旋转90度
旋转180°将取负坐标,或者,你可以按-1的因子进行缩放,这基本上是一样的。在
作为这些操作的最后一点,我想补充一下,您可以在一个序列中任意缩放和/或旋转,以获得所需的结果。在
转换回中心点
在缩放操作和/或旋转之后,剩下的唯一事情就是将向量重新传输到中心点。在
A一切都结束了。在
只是回顾一下
所以回顾一下这篇长文章:
我现在意识到我本可以简要回顾一下,但现在至少有一些视觉帮助和一点数学背景,这篇文章也不错。我真的相信,这样的问题应该从数学的角度来看待,数学描述可以帮助很多。在
相关问题 更多 >
编程相关推荐