我用Java AWT实现了一个多边形旋转。
我已经能够在屏幕上绘制多边形,并且我想在我的多边形坐标上手动应用旋转矩阵(围绕用户的lookAt点旋转)。
为了旋转世界,用户首先点击屏幕,然后拖动鼠标以执行旋转。
让我们注意第一个点击点为S,从拖动事件的下一个点为L,屏幕的中心为C.
为了计算旋转角度,首次点击屏幕时,我会保留一个从C到S的矢量:C-S。
然后,当发生拖拽事件时,我计算从C到L的向量:C-L。 然后我计算出C-S到C-L之间的角度以弧度,以及我应用于我的世界的那个角度。
这很有效,并且多边形确实围绕lookAt点旋转。
当用户完成PI的旋转,然后多边形向后旋转时,会出现问题。
e.g。当用户开始旋转时,角度从0.1 ...... 0.2 ... 1 ... 2 .. 3 ..开始,并且值~3.1(我假设为PI),值开始下降:3 .. .2 .. 1 ..直到0,反之亦然。
这是有道理的,因为弧度范围是[0,PI]。
我假设基矢量C-S位于X轴的右侧,当旋转下降到X轴以下时,多边形向后旋转。
但是,我不知道如何让多边形始终保持相同的旋转方向(当用户围绕多边形执行完整旋转时)。
角度函数是:
public final double angle(Vector2D v1)
{
double vDot = this.dot(v1) / ( this.length()*v1.length() );
if( vDot < -1.0) vDot = -1.0;
if( vDot > 1.0) vDot = 1.0;
return ((double) (Math.acos( vDot )));
}
答案 0 :(得分:0)
public Point rotate(Point original, Point vertex, double angle){
Point translated = new Point(original.x - vertex.x, original.y - vertex.y);
int x = (int)Math.round(translated.x * Math.cos(angle) - translated.y * Math.sin(angle));
int y = (int)Math.round(translated.x * Math.sin(angle) + translated.y * Math.cos(angle));
return new Point(vertex.x+x,vertex.y+y);
}
这是一个简单的旋转方法,可用于围绕给定顶点旋转点。
答案 1 :(得分:0)
这是一个arcus余弦问题,acos(cos(x))是一个在0到pi范围内上下移动的周期性帽函数。
在无法避免的较高维度中,由于没有首选参考框架,因此无法说phi
应该是-phi
。在2维中,存在平面的优选取向,以便可以说出第一个是什么,第二个矢量是什么,并且在正方向上定义了唯一的角度。旋转情况,使第一个矢量位于正实半轴上,从旋转的第二个矢量的坐标获得角度和正确的象限。
最容易重建的是复杂的图片,通过乘以a=a.x+i*a.y
的共轭来计算从b=b.x+i*b.y
到b
旋转a
的角度,以获得角度零角度正实轴,
arg((a.x-i*a.y)*(b.x+i*b.y))
=arg((a.x*b.x+a.y*b.y)+i*(a.x*b.y-a.y*b.x))
=atan2( a.x*b.y-a.y*b.x , a.x*b.x+a.y*b.y )
请注意,屏幕坐标使用与笛卡尔/复平面相反的方向,因此将atan2(y,x)
更改为atan2(-y,x)
以获得通常方向的角度。