0

このメソッドは、私が開発中の大規模なシミュレーション中に実行されます。基本的に、この Gladiator オブジェクトは、画面 screenX を screenY ごとに移動しています (変数 a は 1000,720 に設定されています)。Gladiator.center[0] は x 位置、Gladiator.center[1] は y 位置です。以下のメソッドの目的は、グラディエーターがこのコマンドで画面に描画した楕円の外に移動しないようにすることです。

g.fillArc(0,0, screenX,screenY, 0, 360);    

グラディエーターが移動を完了した直後に実行されるため、終点は現在の中心です。始点はエンドポイント - Gladiator.xMove と Gladiator.yMove で、位置で行われた変更を記述する変数です。

この移動メソッドはすべて、位置を整数値でオフセットして終了します。座標としてピクセルを使用しているため、入力を double ではなく整数のままにしておくことをお勧めします...したがって、最終結果が楕円の外側ではなく楕円の内側になるようにする論理ステートメントを挿入しました。

public void wallsStop(Gladiator glad, int screenX, int screenY) {

double value;
double gladX;
double gladY;
double finalX;
double finalY;
double v;
int n = 1;
double slope;
double rise = (int)glad.yMove;
double run = (int)glad.xMove;
slope = rise/run;
v = run;
gladX = glad.center[0]-(int)glad.xMove;
gladY = glad.center[1]-(int)glad.yMove;
value = (Math.pow((glad.center[0]-(screenX/2)),2)/(Math.pow(screenX/2,2)))+(Math.pow((glad.center[1]-(screenY/2)),2)/(Math.pow(screenY/2,2)));
    if (value > 1) {
    System.out.println("Centers: ("+glad.center[0]+","+glad.center[1]+")");
        while ( value > 1 && n < 8) {
        System.out.println("Value: "+value);
            if (value > 1) {
            v=v-v/Math.pow(2,n);
            System.out.println("Testing "+v);
            } else if (value <= .99 && n < 8) {
            v=v+v/Math.pow(2,n);
            System.out.println("Testing "+v);
            }
            value = (Math.pow(((gladX+v)-(screenX/2)),2)/(Math.pow(screenX/2,2)))+(Math.pow(((gladY+v*slope)-(screenY/2)),2)/(Math.pow(screenY/2,2)));
            n++;
        }
        finalX = v-run;
        finalY = v*slope-rise;

        if ( v - run < 0 ) {
        finalX = v - run - 1;
        finalY =v * slope - rise - slope;
        } else if (v - run > 0) {
        finalX = v - run + 1;
        finalY = v * slope - run + slope;
        }


        System.out.println("Value "+value+" Slope: "+slope+" finals: "+finalX+","+finalY+" Start and end point ("+gladX+","+gladY+"),("+glad.center[0]+","+glad.center[1]+")");
        glad.move((int)finalX,(int)finalY);

    }
}

基本的に、プログラムは、1 未満の値が見つかるまで、上または下を調べた場所の差を分割し続けますが、十分に正確であることを確認するために、差を少なくとも 8 回分割しています。この結果は、楕円の内側にあることを意味します。

現在のテストでは、グラディエーター オブジェクトの速度が大幅に低下しますが、いずれにせよ、ゆっくりと楕円の外に移動します。

私が行ったこのテストでは、座標が画面上部の中心にうまく並んでいるため、エッジがどこにあるべきかを簡単に理解できるため、バグ修正に最適な結果が得られました。

開始点: (506,8)、終了点 (501,-9) 勾配は 3.4 最初にテストされた v は -2.5、値は 1.002 でした 2 番目にテストされた v は -1.875 でした 値は .991 でした... それを使用しました。

finalX = 4.125 finalY = 2.025 として見つかったファイナル... 明らかに正しくありません。どんな助けもいただければ幸いです...私はこれに困惑しています!

編集:以前の試みからいくつかの未使用の変数を削除しました。また、xMove と yMove を int にキャストしている理由は、それらが使用されるたびにキャストされるためです。

編集2:値に使用している式は、このページの一番上の回答から取られています...彼らはそれをかなりよく説明しています。https://math.stackexchange.com/questions/76457/check-if-a-point-is-within-an-ellipse

4

1 に答える 1

1

finalY だけが「明らかに正しくない」と仮定すると、残りは問題ないように見えます。「上昇」を使用する必要がある場所で、y に「実行」を使用しています。

else if (v - run > 0) {
    finalX = v - run + 1;
    finalY = v * slope - run + slope;<--- THIS LINE
    }
于 2013-06-20T17:48:32.450 に答える