我正在尝试将旧图形编辑器的旋转和裁剪矩形设置转换为使用与旧编辑器不同的坐标系的新编辑器。下图说明了这个问题:
所有的矩形都有相同的纵横比(例如3:2),并且所有的坐标都在边缘上进行了标准化(即在X和Y方向上从0到1)。
旧程序保存与绿色矩形(原点为A)对齐的坐标系中给定的蓝色矩形C的角坐标,以及黄色矩形的旋转角度。
新程序需要坐标系统中蓝色矩形的角坐标与黄色矩形对齐(原点为B)。如何实现从旧到新的转换?
这似乎是一道简单的数学题,但数学课已经上了这么多年了,我既不能用纸笔解决这个问题,也不能搜索这个网站(有很多类似的问题,但我找不到一个匹配的……)
发布于 2011-08-23 18:25:11
设c(0), c(1), c(2), c(3)
是C
的四个角,b(0)
是B的坐标系所在的角B。设q
是B的x轴的旋转角度。所有这些角度和点必须在同一坐标系中给定。
要找到B中c(i)
的坐标,请将向量c(i) - b(0)
旋转角度q
(或-q
,取决于测量对象的方式)。为此,您可以使用旋转矩阵。让cq = cos(q)
、sq = sin(q)
和(dx, dy) = c(i) - b(0)
。B中的c(i)
的坐标是
设c = (c(0) + c(2)) / 2
是C的中心,S(s)
是按s
缩放的矩阵,R(q)
是按q
旋转的矩阵。B的角由下式给出
b(i) = c + S(s) * R(q) * (c(i) - c)
矩形A的角点a(0), a(1), a(2), a(3)
也是已知的。我们希望确定缩放参数s
的最大可能值,使得B的所有点b(i)
都在矩形A内。
我认为这里最安全和最简单的方法是考虑相关的b(i)
和a(i)
对,对于这些对,计算最大值s(i, j)
,如果是s = s(i, j)
,则b(i)
位于a(j)
的角区域内。
设a(0)
和a(2)
是A的对角,c(0)
和c(1)
是C的邻角,r(j) = a(j) - c
和d(i) = R(q) * (c(i) - c)
是C的邻角。
每个对角线i
可以按以下比例进行缩放
s(i, j) = min (|r(j).x| / |d(i).x|, |r(j).y| / |d(i).y|)
在B移出r(j)
定义的区域之前。计算i = 0, 1
和j = 0, 2
的s(i, j)
,并将s
设为这4个值中的最小值。
根据q
的测量方式,您可能需要对q
应用转换q' = atan2(kx * sin(q), ky * cos(q))
,以解决纵横比问题。
https://stackoverflow.com/questions/7162439
复制