计算机图形:旋转多边形

时间:2016-05-20 17:15:21

标签: java opengl math graphics 3d

目的

我用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 )));
}

2 个答案:

答案 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.yb旋转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)以获得通常方向的角度。