0

さて、Javaポリゴンを角度0の元の位置に基づいて回転させようとしています。xとyは、それらを使用した最後にintに変換されるため、変化が見られないことは理解できましたが、角度の差は0から180のように大きいです。何かが見えるはずだと思います。

私はしばらくこれにいて、それが何であるかを考えることができません。これが方法です。(コードタグがめちゃくちゃになったらごめんなさい、私のFirefoxはそれらをめちゃくちゃにします。)

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のy値はローカル コピーであるため、範囲外になると (つまり、メソッドから呼び出し元のメソッドにrotate戻ると)、 andの値は消えます。rotatexy

したがって、現在、何が起こっているかは次のとおりです。

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を返すように再定義し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.
}

とはいえ、ピエールが示唆するように、私の意見では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 に答える