60

2D空間に2つのポイントがあり、これらのポイントの1つをX度回転させ、もう1つのポイントを中心として機能させる必要があるとします。

float distX = Math.abs( centerX -point2X );
float distY = Math.abs( centerY -point2Y );

float dist = FloatMath.sqrt( distX*distX + distY*distY );

これまでのところ、2つのポイント間の距離を見つけることができました...そこからどこに行けばいいですか?

ここに画像の説明を入力してください

4

6 に答える 6

70

最も簡単なアプローチは、次の3つの変換を構成することです。

  1. ポイント1を原点に導く翻訳
  2. 必要な角度で原点を中心に回転
  3. ポイント1を元の位置に戻す翻訳

これをすべて実行すると、次の変換が行われます(ここxで、はラジアン単位の目的の回転角です)。

newX = centerX + (point2x-centerX)*Math.cos(x) - (point2y-centerY)*Math.sin(x);

newY = centerY + (point2x-centerX)*Math.sin(x) + (point2y-centerY)*Math.cos(x);

これは、時計回りの回転(座標系xのいわゆる標準または右向き)に対して角度が負であると仮定していることに注意してください。そうでない場合は、を含む用語の符号を逆にする必要がありますsin(x)

于 2012-08-28T14:22:12.970 に答える
19

2次元回転行列が必要ですhttp://en.wikipedia.org/wiki/Rotation_matrix

あなたの新しいポイントは

 newX = centerX + ( cosX * (point2X-centerX) + sinX * (point2Y -centerY))
 newY = centerY + ( -sinX * (point2X-centerX) + cosX * (point2Y -centerY))

反時計回りではなく時計回りに回転しているため

于 2012-08-28T14:23:11.730 に答える
12

Java Graphics2D APIを使用していると仮定して、このコードを試してください-

    Point2D result = new Point2D.Double();
    AffineTransform rotation = new AffineTransform();
    double angleInRadians = (angle * Math.PI / 180);
    rotation.rotate(angleInRadians, pivot.getX(), pivot.getY());
    rotation.transform(point, result);
    return result;

ここで、ピボットは回転しているポイントです。

于 2012-08-28T14:24:44.080 に答える
2
  1. 「1」を0,0に変換します

  2. 回転する

    x = sin(角度)* r; y = cos(angle)* r;

  3. 翻訳し直してください

于 2012-08-28T14:22:30.783 に答える
1

こちらは回転方向を気にするバージョンです。右(時計回り)は負で、左(反時計回り)は正です。ポイントまたは2Dベクトルを送信し、このメソッド(最後の行)でそのプリミティブを設定して、パフォーマンスのためのメモリ割り当てを回避できます。vector2とmathutilsを、使用するライブラリまたはjavaの組み込みポイントクラスに置き換える必要がある場合があります。mathutilsの代わりにmath.toradians()を使用できます。

/**
 * rotates the point around a center and returns the new point
 * @param cx x coordinate of the center
 * @param cy y coordinate of the center
 * @param angle in degrees (sign determines the direction + is counter-clockwise - is clockwise)
 * @param px x coordinate of point to rotate 
 * @param py y coordinate of point to rotate 
 * */

public static Vector2 rotate_point(float cx,float cy,float angle,float px,float py){
    float absangl=Math.abs(angle);
    float s = MathUtils.sin(absangl * MathUtils.degreesToRadians);
    float c = MathUtils.cos(absangl * MathUtils.degreesToRadians);

    // translate point back to origin:
    px -= cx;
    py -= cy;

    // rotate point
    float xnew;
    float ynew;
    if (angle > 0) {
        xnew = px * c - py * s;
        ynew = px * s + py * c;
    }
    else {
        xnew = px * c + py * s;
        ynew = -px * s + py * c;
    }

    // translate point back:
    px = xnew + cx;
    py = ynew + cy;
    return new Vector2(px, py);
}

この方法は、投稿で試した方法よりもパフォーマンスが高いことに注意してください。非常にコストのかかるsqrtを使用しているため、このようにして、ルックアップテーブルで管理される度からラジアンに変換します。そのため、非常に高いパフォーマンスを発揮します。

于 2017-05-31T08:48:41.103 に答える
0

これは、2Dの他のポイントを中心に任意のポイントを回転させる方法です。3Dでは、これはz軸を中心とした回転として使用できることに注意してください。ポイントは変化しないため、ポイントのz座標が変更されます。3Dでのx軸とy軸を中心とした回転も簡単に実装できます。

コードはJavaScriptです。最初のコメント行は、関数のテストセットです。それらは使用例としても役立ちます。

//A = new Array(0,0)
//S = new Array(-1,0)
//fi = 90
//alert("rotujBod: " + rotatePoint(A, S, fi))

function rotatePoint(A, S, fi) {
/** IN points A - rotated point, S - centre, fi - angle of rotation (rad)
*    points in format  [Ax, Ay, Az], angle fi (float)
*       OUT point B
*/
    r = Math.sqrt((A[0] - S[0])*(A[0] - S[0]) + (A[1] - S[1])*(A[1] - S[1]))
    originOfRotation = new Array(S[0] + r, S[1])
    if (A[1] < S[1]) {
        A2 = new Array(A[0], -1*A[1])
        originalAngle = -1*sizeOfAngle(originOfRotation, S, A2)
    } else {
    originalAngle = sizeOfAngle(originOfRotation, S, A)
    }
    x = S[0] + r*Math.cos(fi + originalAngle)
    y = S[1] + r*Math.sin(fi + originalAngle)
    B = new Array(x, y)
    return(B)
}

function sizeOfAngle(A, S, B) {
    ux = A[0] - S[0]
    uy = A[1] - S[1]
    vx = B[0] - S[0]
    vy = B[1] - S[1]
    if((Math.sqrt(ux*ux + uy*uy)*Math.sqrt(vx*vx + vy*vy)) == 0) {return 0}
    return Math.acos((ux*vx + uy*vy)/(Math.sqrt(ux*ux + uy*uy)*Math.sqrt(vx*vx + vy*vy)))
}
于 2015-11-07T18:12:10.007 に答える