2010-02-04 94 views
3

什么是通过鼠标移动旋转图像后面的逻辑。我知道如何使用graphics2d.rotate进行旋转,但使用鼠标作为旋转源时遇到了困难。下面是基本步骤:爪哇2D - 拖动鼠标以平滑旋转图像

  1. 获取鼠标X(DX)和鼠标Y(DY)距锚固点(在这种情况下,这将是 我们要旋转图像的中心)。
  2. 在Math.arcTan2(dy,dx)中使用此点来获取角度或旋转。
  3. 使用Graphics2D.rotate方法的步骤中的值。

有了这个策略,每当我旋转图像,图像开始旋转从-pi旋转90度后,它回到-pi。我不明白我在这里做错了什么,它应该是非常基本的。

下面是代码的一部分:

// mouse dragged events get sent here. 
public void mouseDragged(MouseEvent e) { 
    int mx = e.getX(), my = e.getY(); 
    // just checking if it falls within bounds of the image we 
    // want to rotate. 
    if(mx > speedKX || mx < speedKX + speedK.getWidth() || my > speedKY || my < speedKY + speedK.getHeight()/2) 
    { 
     theta += getTheta(e.getX(), e.getY()); 
    } 
} 
+0

是否可以看到一些代码?看起来像一个三角函数问题... – 2010-02-04 08:45:48

+0

是肯定,在这里: //鼠标拖动事件被送到这里。 public void mouseDragged(MouseEvent e) int mx = e.getX(),my = e.getY(); //只是检查它是否落在我们想要旋转的图像的边界内 。如果(mx> speedKX || mx speedKY || my dave 2010-02-04 08:56:18

+0

我不确定为什么,但以前的评论没有格式好,你们可以阅读吗?如果不让我知道谢谢。 – dave 2010-02-04 08:57:08

回答

4

据我了解,你应该寻找初始角度(当你点击时,锚和你的点击之间的线),当前角度(当你拖动,同一行)。该角度(独立于当前到锚点的距离)会给你旋转。

所以,你必须:

rotate(anglenow - angle0) 

如何找到它:

在这两种情况下(首次点击鼠标移动事件),你必须要找到锚和鼠标点思考主播之间的夹角起源。

我会使用一种方法(getAngle(X1,Y1,X2,Y2)。该方法(除竞争条件等相同的x或相同的Y,可容易检测的)应计算反正切(DY/DX)。

注册

但是当你将DY/DX可以这样:

+/+ -> + 
+/- -> - 
-/+ -> - 
-/- -> + 

是,四个posibilities给你两个样的结果所以,你必须寻找一些条件来检测它们。 。

我应该查看arctan doc或source来查看它给出的值(在0和pi之间,或-pi/2和+ pi/2之间),然后检查dx或dy的符号(取决于arctan返回的范围)并使用它来添加/减少pi,然后生成角度。

然后,您将得到一个getAngle方法,可以正确返回360º空间。

编辑

的Javadoc说:

Math.atan retuns角的反正切,在-pi/2到pi/2的范围内。

因此,假设您的角度值为0的X轴,因为我假设,它返回的范围是右半球。所以你必须从左边的那个区分出右半球。

如果计算DX = xtarget - xorigin(像你一样为师),如果正确的半球是正确的,且负,如果不是这将是积极的。

因此,如果dy < 0那么你必须添加pi到你的合成角度。它将在-pi/2和3pi/2之间。您也可以通过全部传递(-pi,pi)范围或(0,2pi)范围来更正结果。

编辑:伪代码,请仔细检查!

onmousedown { 
    startpoint = (x,y); 
    startangle = getAngle(origin, startpoint); 
} 

onmousemove { 
    currentpoint = (x,y); 
    currentangle = getAngle(origin, currentpoint); 
    originalimage.rotate(currentangle - startangle); 
} 

getAngle(origin, other) { 
    dy = other.y - origin.y; 
    dx = other.x - origin.x; 
    if (dx == 0) // special case 
     angle = dy >= 0? PI/2: -PI/2; 
    else 
    { 
     angle = Math.atan(dy/dx); 
     if (dx < 0) // hemisphere correction 
      angle += PI; 
    } 
    // all between 0 and 2PI 
    if (angle < 0) // between -PI/2 and 0 
     angle += 2*PI; 
    return angle; 
} 
+0

哇,我真的很喜欢这个网站上的即时反馈,比y好多了!让我尽快地尝试一下。 – dave 2010-02-04 09:00:48

+0

这就是另一个问题,java的arctan2(dy,dx)方法返回一个介于-pi和pi之间的值。 – dave 2010-02-04 09:05:17

+0

-PI到PI =整圈:) – helios 2010-02-04 09:09:38