缩放和旋转点阵列

时间:2017-02-21 18:08:20

标签: java arrays math matrix

过去几天我一直在为这个问题摸不着头脑,而我却无法想出一个有效的解决方案。

我在数组中有一组点,表示鼠标路径:

Points[0] = 20,50
Points[Points.length-1] = 500,230

我试图找到一种旋转点阵列(Path)的方法,以便第一个点从x1,y1开始,最后一个点以x2,y2结束。

我知道这将涉及缩放和旋转整个阵列,但缺乏数学知识,我不知道如何处理它。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

正如James Large在评论中所说,你可以使用变换矩阵有效地做到这一点。你的变换需要缩放,旋转和平移,每个变换都可以用矩阵表示,你可以构建一个单一的变换矩阵,只需将表示每个变换的矩阵相乘,就可以从简单变换中一次完成所有这些变换矩阵。使用矩阵乘法。

你可以通过首先翻译点来实现你想要的,使第一个点位于原点(因为那是你想要旋转的点),然后应用旋转,缩放变换然后进行第二次平移,以便第一点是x1,y1。

可以通过计算(x1,y1) - (x2,y2)之间的角度与原始起点和终点之间的角度之间的差值来计算旋转角度:

double rotationAngle = atan2(y2-y1, x2-x1) -
    atan2(Points[Points.length-1].y-Points[0].y, Points[Points.length-1].x-Points[0].x);

比例因子是(x1,y1) - (x2,y2)之间的距离除以未转换的起点和终点之间的距离。

所以你的转型可以像这样构建:

  • 翻译(-Points [0] .x,-Points [0] .y)
  • rotate by rotationAngle
  • 按比例缩放因子缩放
  • 翻译(x1,y1)

可以交换旋转和缩放的顺序,这没关系。请参阅transformation matrices的文章,了解如何构建每个文章。

您也可以使用联立方程式求解,但我认为这种方式更直观。你最终会得到相同的矩阵,因此每点转换同样有效。