2012-05-10 11 views
3

私はCanvasオブジェクト(線、頂点、三角形など)を作成していますが、それらの点を中心に回転を適用したいと思います。Javaでポイント周りのポリゴンを回転させる方法は?

点が地図上GeoPointに取り付けられるので、私はすべてのマップが回転している回転()メソッドを使用する場合、私は、キャンバスの回転()メソッドを使用することができない

...

問題ですCanvasはPoint(int、int)を必要とし、回転を適用すると、cos関数とsin関数のためにdoubleが生成されます。だから私はすべての点に回転を適用すると、intに倍精度化をキャストするので、私はいくつかのグラフィカルな問題が発生します...

私は最高のソリューションを探しています。

ここに私の回転コード:

public Point rotatePoint(Point pt, Point center) 
{ 
    this.angle = ((this.angle/180)*Math.PI); 
    double cosAngle = Math.cos(this.angle); 
    double sinAngle = Math.sin(this.angle); 

    pt.x = center.x + (int) ((pt.x-center.x)*cosAngle-(pt.y-center.y)*sinAngle); 
    pt.y = center.y + (int) ((pt.x-center.x)*sinAngle+(pt.y-center.y)*cosAngle); 
    return pt; 
} 

答えて

1

私はあなたのソリューションは非常に良いと考えています。小さな改良点は、それらを整数にキャストする前に座標に0.5を追加することです。これは、通常は丸めを行います.0.5を上回るものはすべて1に丸められます。それ以外の場合は、連続したスペースを個別のスペース(キャンバスの平面)に配置したい場合は、丸めを行わないようにすることはできません。

+0

[OK]を、あなたの応答を@izomorphius感謝、私は間違い:)コピーで行わを/修正するために自分の投稿を編集しましたペースト – Bibu

5

pt.yを計算するときにコードに小さなバグがあります。 (pt.xは更新されますが、後で使用されます)。代わりに、次のことを試してください。

public Point rotatePoint(Point pt, Point center) 
{ 
    this.angle = ((this.angle/180)*Math.PI); 
    double cosAngle = Math.cos(this.angle); 
    double sinAngle = Math.sin(this.angle); 
    double dx = (pt.x-center.x); 
    double dy = (pt.y-center.y); 

    pt.x = center.x + (int) (dx*cosAngle-dy*sinAngle); 
    pt.y = center.y + (int) (dx*sinAngle+dy*cosAngle); 
    return pt; 
} 

私はまた、次のバリエーションを使用します。

public Point rotatePoint(Point pt, Point center, double angleDeg) 
{ 
    double angleRad = (angleDeg/180)*Math.PI); 
    double cosAngle = Math.cos(angleRad); 
    double sinAngle = Math.sin(angleRad); 
    double dx = (pt.x-center.x); 
    double dy = (pt.y-center.y); 

    pt.x = center.x + (int) (dx*cosAngle-dy*sinAngle); 
    pt.y = center.y + (int) (dx*sinAngle+dy*cosAngle); 
    return pt; 
} 
+1

私は「以下のバリエーション」をテストしました。作品! –

関連する問題