我正在尝试将旧图形编辑器的旋转和裁剪矩形设置转换为使用与旧坐标系不同的坐标系的新编辑器。下图说明了问题:
所有矩形具有相同的纵横比(例如3:2),并且所有坐标在边缘上标准化(即在X和Y方向上从0到1)。
旧程序保存在与绿色矩形对齐的坐标系中给出的蓝色矩形C的角坐标(原点在A处),以及黄色矩形的旋转角度。
新程序需要坐标系中蓝色矩形的角坐标与黄色矩形对齐(原点为B)。我如何进行从旧到新的转换?
这似乎是一个简单的数学问题,但是自数学课以来已经这么多年了,我无法用笔和纸来解决这个问题,也没有搜索这个网站(很多类似的问题,但我找不到一个匹配的......)
答案 0 :(得分:2)
让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
和{{1} }。
每个对角线d(i) = R(q) * (c(i) - c)
都可以通过
i
在B移出s(i, j) = min (|r(j).x| / |d(i).x|, |r(j).y| / |d(i).y|)
定义的区域之前。为r(j)
和s(i, j)
计算i = 0, 1
,让j = 0, 2
成为这4个值中的最小值。
根据s
的衡量方式,您可能需要将转化q
应用于q' = atan2(kx * sin(q), ky * cos(q))
以解决宽高比问题。