0

好的,我正在尝试根据角度 0.x 的原始位置旋转 Java 多边形,并且 y 在我使用它们结束时最终被转换为 int,所以我可以理解没有看到一些变化,但是当角度差异很大,例如 0 到 180 我想我应该看到一些东西

我已经有一段时间了,想不出它是什么。这是方法。(对不起,如果代码标签弄乱了,我的火狐把它们弄乱了。)

public void rotate(double x, double y, obj o1)
{
    double dist = Math.sqrt(Math.pow(x - (o1.x + (o1.w/2)), 2) + Math.pow(y - (o1.y + (o1.h/2)),2));

    x +=  (Math.sin(Math.toRadians(o1.a)) * dist);
    y -=  (Math.cos(Math.toRadians(o1.a)) * dist);  
}
4

3 回答 3

9

方法中操作的x和的值不会在调用它的方法中看到,因为Java 通过值传递方法参数yrotate

因此,方法中被改变的xand值是一个本地副本,所以一旦超出范围(即从方法返回到它的调用方法),and的值就会消失。yrotaterotatexy

所以目前,正在发生的事情是:

x = 10;
y = 10;
o1 = new obj();
o1.a = 100;
rotate(x, y, obj);
System.out.println(x);  // Still prints 10
System.out.println(y);  // Still prints 10

在 Java 中从方法中获取多个值的唯一方法是传递一个对象,并操作传入的对象。(实际上,在进行方法调用时会传入对该对象的引用的副本。)

例如,重新定义rotate以返回 a Point

public Point rotate(int x, int y, double angle)
{
    // Do rotation.
    return new Point(newX, newY);
}

public void callingMethod()
{
    int x = 10;
    int y = 10;
    p = rotate(x, y, 45);
    System.out.println(x);  // Should print something other than 10.
    System.out.println(y);  // Should print something other than 10.
}

也就是说,正如Pierre 建议的那样,在我看来,使用AffineTransform会容易得多。

例如,创建一个Rectangle对象并使用它旋转它AffineTransform可以通过以下方式执行:

Rectangle rect = new Rectangle(0, 0, 10, 10);

AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(45));

Shape rotatedRect = at.createTransformedShape(rect);

AffineTransform可以应用于实现Shape接口的类。Shape可以在接口的链接 Java API 规范中找到实现的类列表Shape

有关如何使用AffineTransform和 Java 2D 的更多信息:

于 2009-02-23T00:39:25.053 回答
4

仅供参考:旋转形状和点已在java.awt.geom.AffineTransform中实现

于 2009-02-23T00:27:21.713 回答
1

您正在执行2D 旋转变换

它应该看起来像这样:

xnew = xold*cos(t) - yold*sin(t)
ynew = xold*sin(t) + yold*cos(t)

当然,旋转角度 t 必须以弧度为单位。它在 x 轴为零,并在逆时针方向增加。

新旧点都需要相对于您正在旋转的原点表示。

于 2009-02-23T00:35:32.053 回答