1

これは問題というよりは楽しい実験です。何が原因なのか知りたいです。

パターンで線のコレクションを描画するために、フロートとして格納された2Dポイントを生成しています。新しいポイントを生成するときは、最後のポイントのコピーを作成し、見出し(x + = cos(heading)、y + = sin(heading))に基づいて特定の方向に移動します。見出しもフロートとして保存されます。見出しを特定の速度(たとえば、90度)で変更します。これは、すべての新しいポイントが最後のポイントと平行であるか、またはそれに直角であることを意味します。

これは機能しますが、何回も(1000回)繰り返すと、パターンの外側のエッジがわずかに厚くなり始め、次に新しくプロットされたポイントがわずかに斜めの(ただし一貫した)位置に移動し始めます。その後、パターン全体が回転し始めます。

私が興味を持っているのは、壊れてはいけないものがどのように壊れるかです。私の推測では、見出し(常に縮小されているフロート)は、特定のサイズに達すると定義が失われます。

基本的に、(以下の正確なパターンを生成するための)コードは次のようになります。

float distance = 25;
int theta = 90;
float heading = 0;

    public static void main(String[] args) {
    turnLeft();
    func();
    turnRight();
    func();
    turnRight();
    turnRight();
    func();
}

public void func() {
    drawForward();
    turnRight();
    drawForward();
    turnRight();
    turnRight();
    drawForward();
    turnRight();
    drawForward();
    drawForward();
}

    public void turnLeft() {
    heading += degToRad(theta);
}

public void turnRight() {
    heading -= degToRad(theta);
}

public float degToRad(float degrees) {
    return (float) (degrees * (Math.PI / 180.0));
}

public void drawForward() {
    FPoint newFp = new FPoint(array[array.length - 1]); //copy last point

    movePoint(newFp, (float) (distance * Math.cos(heading)),
            (float) (distance * Math.sin(heading)));

    appendPoint(newFp); //add point to end of array

}

public void movePoint(FPoint fp, float x, float y) {
    fp.x += x;
    fp.y += y;
}

この件についてのご意見をいただければ幸いです。

4

1 に答える 1

1

前後に移動するときに、まったく同じ場所にいるかどうかを確認します。同じ場所にいない場合は、各前進運動から差の半分を引きます。

これは、数値の安定性と計算の精度に関連している可能性があります。http://en.wikipedia.org/wiki/Numerical_stability

後戻りする必要がないので、開始位置に到達するまで順方向+右+順方向+右....を使用し、開始値と異なる場合は減算します。次に、これをオフセットエラー値として使用して減算します(ただし、最初にエラーを移動数で除算します)(もちろん、「FRFRFRFECC」のようになります)

これは、BFECC前後のエラー訂正補償と呼ばれます。やむを得ないエラーの場合は、エラーを大幅に減らします。

ZalesakのTurningDiskでBFECCをテストして、何千回もの回転を繰り返した後にディスクが破損するかどうかを確認する人を見かけました。

于 2012-08-29T19:02:55.473 に答える