2017-02-21 121 views
1

过去几天我一直在摸索这个问题,而我不能想出一个工作(更不用说高效)的解决方案。缩放和旋转点阵

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

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

我试着找到一种方法来分的阵列(路径),这样第一个点开始在X1旋转, y1,最后一点结束于x2,y2。

我知道这将涉及缩放和旋转整个数组,但缺乏数学知识,我不知道如何解决这个问题。

任何想法?谢谢!

+1

如果不学习一些数学知识,你就不会有效地做到这一点。你想要的是计算一个_transform矩阵_,然后将这个变换应用到每个有问题的点。您可能需要解出一些线性方程组来计算矩阵。维基百科的文章为你提供了一种尝试,但是一本关于计算机图形学的良好教科书将会是一个更好的开始。 https://en.wikipedia.org/wiki/Transformation_matrix –

回答

1

正如James Large在评论中所说,您可以使用变换矩阵高效地完成此操作。你的变换需要缩放,旋转和平移,每一个都可以用一个矩阵来表示,你可以建立一个单一的变换矩阵,它只需将表示每个变换的矩阵相乘就可以一次完成所有这些变换使用矩阵乘法。

您可以通过首先平移点,使第一个点位于原点(因为这是您想要旋转的点),然后应用旋转,缩放变换,然后是第二个平移第一点是x1,y1。

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

缩放因子:(X2,Y2)和原始起始点和结束点之间的角度 -

旋转角可以通过计算(X1,Y1)之间的角度之间的差来计算是(x1,y1) - (x2,y2)之间的距离除以未转换的起点和终点之间的距离。

所以你的变换可以建这样的:

  • 通过翻译(-Points [0] .X,-Points [0] .Y)
  • 旋转通过rotationAngle通过缩放
  • 规模因素
  • 由(X1,Y1)翻译

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

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

+0

完美无缺,正是我一直在寻找的。谢谢! –