3

Canvas オブジェクト (線、頂点、三角形など) を作成していますが、それらに点を中心とした回転を適用したいと考えています。

マップ上の GeoPoint にポイントがアタッチされているため、Canvas の rotate() メソッドを使用できないため、rotate() メソッドを使用するとすべてのマップが回転してしまいます...

問題は、Canvas が Point(int,int) を必要とし、cos 関数と sin 関数のために回転を適用すると double が作成されることです。したがって、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;
}
4

3 に答える 3

7

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;
}
于 2013-01-01T03:08:55.203 に答える
1

あなたの解決策はかなり良いと思います。小さな改善は、座標を整数にキャストする前に座標に 0.5 を追加することです。これにより、通常使用される丸めが行われます。たとえば、0.5 を超えるものはすべて 1 に丸められます。それ以外は、連続したスペースを個別のスペース(つまり、キャンバスへの平面)に配置したいので、丸めを避けることはできないと思います。

于 2012-05-10T12:05:49.943 に答える