gpt4 book ai didi

Java 2D - 拖动鼠标平滑旋转图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:10 24 4
gpt4 key购买 nike

通过鼠标移动旋转图像背后的逻辑是什么。我知道如何使用 graphics2d.rotate 进行旋转...但是在使用鼠标作为旋转源时遇到困难。以下是基本步骤:

  1. 获取鼠标 x(dx) 和鼠标 y(dy) 与 anchor 的距离(在本例中为我们要旋转的图像的中心)。
  2. 在 Math.arcTan2(dy,dx) 中使用此点来获取角度或旋转。
  3. 使用 step 到 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( ) );
}
}

最佳答案

据我了解,您应该寻找初始角度(当您点击时,定位点和点击之间的线)和当前角度(当您拖动时,同一条线)。该角度(独立于当前到 anchor 的距离)将为您提供旋转。

所以你必须:

rotate(anglenow - angle0)

如何找到它:

在这两种情况下(初始点击和鼠标移动事件),您必须找到 anchor 和鼠标点之间的角度,将 anchor 视为原点。

我会使用一种方法 (getAngle(x1,y1,x2,y2)。该方法(除了竞争条件,如相同 x 或相同 y,很容易检测到)应该计算 arctan(dy/dx)。

签名

但是当你划分 dy/dx 时,它可以是:

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

就是说,四种可能性给你两种结果。因此,您必须查看一些条件才能检测到它们。

我应该查看 arctan 文档或源代码以查看它给出的值(在 0 和 pi 之间,或 -pi/2 和 +pi/2 之间),然后检查 dx 或 dy 的符号(取决于 arctan 返回的范围) 并使用它来增加/减少 pi 到然后得到的角度。

然后您将获得一个正确返回 360º 空间的 getAngle 方法。

编辑

Javadoc 说:

Math.atan 在 -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;
}

关于Java 2D - 拖动鼠标平滑旋转图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2198303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com