0

昨日もこれについて尋ねたところ、ラジアンを使用する必要があると言われました。それが答えだと思っていましたが、以下のコードには別の問題があるようです。私は、私のグラディエーターが2つの中心点を回転させ、いわば互いに円を描くことができるようにするメソッドを作成しようとしています. 以下は私のコードです。グラディエーター変数ターゲットはグラディエーター タイプであり、ローテーションの第 2 パーティに設定されます。center[0] は x 位置、center[1] は y です。

public void rotate(Gladiator a, int angle) {
    double x1;
    double y1;
    double x2;
    double y2;
    double r;
    double midx;
    double midy;
    int currentAngle;

    r = getDistance(a,a.target)/2;
    midx = (a.center[0]-a.target.center[0])/2;
    midy = (a.center[1]-a.target.center[1])/2;
    currentAngle = (int)Math.toDegrees(Math.atan2(a.center[1] - midy, a.center[0] - midx));

    x1 = Math.cos(Math.toRadians(currentAngle+angle)) * r;
    y1 = Math.sin(Math.toRadians(currentAngle+angle)) * r;
    x2 = Math.cos(Math.toRadians(currentAngle+angle)) * -r;
    y2 = Math.sin(Math.toRadians(currentAngle+angle)) * -r;
    a.move((int)x1,(int)y1);
    a.target.move((int)x2,(int)y2);


}

誰でもこれで何か問題があると思いますか?現時点では、彼らは私のサークルの真ん中にあると私が思うところに向かって会うことになり、彼らよりもずっと近くにいます。何かご意見は?

編集:また、私は現在これを2回実行しています...関与するグラディエーターごとに1回。私はそれを行うことができ、毎回必要な量の半分をローテーションさせることができますが、それらを全体としてローテーションしてから、反復しているグラディエーター リストから 2 番目のパーティを除外できればより良いでしょう。これの最も簡単な実装は何でしょうか?

Edit2: 私の問題の一部は、atan2 方程式で Math.toDegrees を呼び出さなかったことだと思います。0 以外の新しい角度値が取得されていないことに気付きましたが、現在は取得されています。それでも、何か問題があります。それらは水平から垂直に回転しますが、各回転で互いに遠く離れて移動し、垂直方向の配置に達すると、反対方向に数度 (現在の入力である 45 度ではなく) 回転することになり、その後多くの結果が得られます。以前のように一緒に近づきます。

Edit3: move メソッドのパラメーターは、実際の座標ではなく、必要な変更であることに注意してください。

4

1 に答える 1

1

intたくさん使っているようですねangle

繰り返しを簡素化し、推奨されたラジアンロジックを使用するために、簡単に書き直しました。(未テスト)。

doubleまた、奇数の整数演算の問題を回避するために、場所を に変換しました。(あなたのmidx/midy計算はint数学でした)

終了後、中点ではなく (0,0) を中心に回転していることに気付きました。また、mid 変数は紛らわしい名前が付けられていました。

//I would do double inline with the initialization, but left here in case you had another reason
double x1,y1, x2,y2, r, midx,midy, newAngle;

x1 = a.center[0];
y1 = a.center[1];
x2 = a.target.center[0];
y1 = a.target.center[1];

r = getDistance(a, a.target)/2;
midx = x1 + (x2 - x1)/2;
midy = y1 + (y2 - y1)/2;

newAngle = Math.toRadians(angle) +
           Math.atan2(midy, midx);

x1 = Math.cos(newAngle) * r + midx;
y1 = Math.sin(newAngle) * r + midy;
x2 = Math.cos(newAngle) * -r + midx;
y2 = Math.sin(newAngle) * -r + midy;
a.move((int)x1,(int)y1);
a.target.move((int)x2,(int)y2);
于 2013-06-07T19:58:01.817 に答える