【问题标题】:Computer Graphics: Rotating a polygon计算机图形学:旋转多边形
【发布时间】:2016-05-22 03:53:25
【问题描述】:

目的

我正在使用 Java AWT 实现多边形旋转。

我已经能够在屏幕上绘制多边形,我想在我的多边形坐标上手动应用一个旋转矩阵(围绕用户的lookAt点进行旋转)。

我已经做了什么

为了旋转世界,用户首先点击屏幕,然后拖动鼠标来执行旋转。

让我们将第一个点击点记为 S,将拖动事件的下一个点记为 L,将屏幕中心记为 C。

为了计算旋转角度,在第一次点击屏幕的时候,我保留了一个从C到S的向量:C-S。

然后,当拖动事件发生时,我计算从 C 到 L 的向量:C-L。 然后我计算 C-S 到 C-L 之间的弧度角度,这就是我在我的世界中应用的角度。

这很好用,多边形确实围绕着lookAt点旋转。

我的问题

当用户完成 PI 的旋转,然后多边形向后旋转时,就会出现问题。

例如当用户开始旋转时,角度从 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 )));
}

【问题讨论】:

  • 您是否可能使用反余弦来计算角度?然后切换到 atan2 方法。
  • "这是有道理的,因为弧度范围是 [0, PI]。" 不,it's [0, 2Pi]
  • 什么意思?编辑和添加角度功能。
  • @LutzL 您的评论已解决此问题,请将其作为答案发布,以便我批准。

标签: java opengl math graphics 3d


【解决方案1】:

这是一个反余弦问题,acos(cos(x))是一个在0到pi范围内上下移动的周期性帽子函数。

在无法避免的更高维度中,由于没有首选的参考系,所以没有办法说phi真的应该是-phi。在二维中存在平面的首选方向,因此可以说出第一个向量是什么,第二个向量是什么,并在正方向定义一个独特的角度。旋转情况,使第一个向量位于正实半轴上,从旋转后的第二个向量的坐标中得到角度和正确的象限。

最容易重构的是复杂图片,计算从a=a.x+i*a.yb=b.x+i*b.y 的角度,通过与a 的共轭相乘来旋转b 以分别从零角度得到一个角度。正实轴,

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) 以获得通常方向的角度。

【讨论】:

    【解决方案2】:
    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);
        }
    

    这是一种简单的旋转方法,可用于围绕给定顶点旋转一个点。

    【讨论】:

    • 这不是我的问题,我有一个可以正常工作的旋转矩阵。物体旋转得很好,但是一旦完成一半的旋转,它就会开始向后旋转,这是由于我的角度计算造成的。
    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多