【发布时间】:2020-08-04 08:00:56
【问题描述】:
我有一组均匀分布的点,形成一个矩形(抱歉画的不好,想象所有点都是均匀分布的),并应用一个角度,我想从左图转到右图。唯一不动的点是左下角和右上角。
我想我可以使用切线推断出每个点的新位置来得到 dx 和 dy。但我不确定我最终会得到我想要的。并且可能对每个点都应用更优雅的转换?
【问题讨论】:
标签: geometry trigonometry transformation
我有一组均匀分布的点,形成一个矩形(抱歉画的不好,想象所有点都是均匀分布的),并应用一个角度,我想从左图转到右图。唯一不动的点是左下角和右上角。
我想我可以使用切线推断出每个点的新位置来得到 dx 和 dy。但我不确定我最终会得到我想要的。并且可能对每个点都应用更优雅的转换?
【问题讨论】:
标签: geometry trigonometry transformation
所以我们要保留两个相对的矩形顶点和它们之间的对角线。
设矩形的半宽为w,半高为h,圆半径为r。设坐标原点在圆心。
对角线和OX的夹角是
theta = atan(h/w)
新矩形的对角线和下边之间的转换角度为
fi = alpha + theta
所以我们可以找到新矩形的半角
nw = r * cos(fi)
平移后的顶点坐标为
2*nw*cos(alpha) - w, -h - 2*nw*sin(alpha)
我们想找到仿射变换M,将两个顶点变换为相同的点,将第三个顶点变换为上面的坐标
|-w w w| |-w w 2*nw*cos(alpha) - w |
M * |-h h -h| = |-h h -h - 2*nw*sin(alpha)|
|1 1 1| |1 1 1|
为了找到M,我们对左矩阵求逆,并将两边乘以这个逆。
M = |nw*cos(alpha)/w w/h - nw*cos(alpha)/h 0|
|-nw*sin(alpha)/w 1 + nw*sin(alpha)/h 0|
|0 0 1|
现在我们可以用这个矩阵变换所有坐标,得到旋转的矩形。
我的Delphi程序生成的坐标转换示例如下:
nX := Round(cx + x * cos(alpha)*nw/w + y * (w/h - cos(alpha)*nw / h));
nY := Round(cy - x * nw/w*sin(alpha) + y * (1 + nw/h * sin(alpha)));
【讨论】: