6

Point2D.Double x の距離を別の Point2D.Double に近づける最善の方法は何ですか?

編集: 編集しようとしましたが、メンテナンスのためにダウンしました。いいえ、これは宿題ではありません

飛行機 (A) を滑走路 (C) の端に向かって移動させ、正しい方向 (角度 a) に向ける必要があります。

代替テキスト http://img246.imageshack.us/img246/9707/planec.png

これが私がこれまでに持っているものですが、面倒なようです。このようなことをする通常の方法は何ですか?

    //coordinate = plane coordinate (Point2D.Double)
    //Distance = max distance the plane can travel in this frame

    Triangle triangle = new Triangle(coordinate, new Coordinate(coordinate.x, landingCoordinate.y),  landingCoordinate);

    double angle = 0;

    //Above to the left
    if (coordinate.x <= landingCoordinate.x && coordinate.y <= landingCoordinate.y)
    {
        angle = triangle.getAngleC();
        coordinate.rotate(angle, distance);
        angle = (Math.PI-angle);
    }
    //Above to the right
    else if (coordinate.x >= landingCoordinate.x && coordinate.y <= landingCoordinate.y)
    {
        angle = triangle.getAngleC();
        coordinate.rotate(Math.PI-angle, distance);
        angle = (Math.PI*1.5-angle);
    }

    plane.setAngle(angle);

三角形のクラスは、http://pastebin.com/RtCB2kSZにあります。

飛行機は滑走路ポイントの周りの任意の位置にある可能性があることを念頭に置いてください

4

6 に答える 6

6

2 点間の最短距離は線なのでx、2 点を結ぶ線に沿ってその点単位を移動するだけです。


編集:これが宿題である場合、回答の詳細を明かしたくありませんでしたが、これはネタバレになりすぎずに説明できるほど単純です。

2 つの点A= (x 1 , y 1 ) とB= (x 2 , y 2 ) があるとします。これらの 2 点を含む直線には方程式があります。

(x 1 , y 1 ) + t · (x 2 - x 1 , y 2 - y 1 )

どこにtパラメータがありますか。の場合、線で指定された点は であり、 の場合、t = 1線で指定された点は であることに注意してください。Bt = 0A

ここで、 から新しい距離離れた点 に移動Bしたいと考えています。B'dA

 A                       B'            B
(+)---------------------(+)-----------(+)

 <========={ d }=========>

B'は、線上の他の点と同様に、前に示した方程式によっても支配されます。しかし、どのような値tを使用するのでしょうか? が 1 のときt、方程式は を指しB、これは|AB|から離れた単位ですA。したがって、tその指定の値B't=d/|AB|です。

|AB| を解く これを上記の式に代入することは、読者の課題として残されています。

于 2010-03-01T00:45:15.683 に答える
5

両方の軸に沿った差をパーセントで最小化できます(これは、ポイントを移動する量によって異なります)。

例えば:

Point2D.Double p1, p2;
//p1 and p2 inits

// you don't use abs value and use the still point as the first one of the subtraction
double deltaX = p2.getX() - p1.getX();
double deltaY = p2.getY() - p1.getY();

// now you know how much far they are
double coeff = 0.5; //this coefficient can be tweaked to decice how much near the two points will be after the update.. 0.5 = 50% of the previous distance

p1.setLocation(p1.getX() + coeff*deltaX, p1.getY() + coeff*deltaY);

それで、あなたはp1途中でに向かって移動しp2ました。避けるべき良いことabsは、どのポイントを移動し、どのポイントを静止させるかを選択した場合、テストを回避して生の係数を使用できることです。

于 2010-03-01T00:56:24.480 に答える
4

ベクターが助けに!

点 A と B が与えられます。(BA を実行して) A から B へのベクトル V を作成します。ベクトル V を単位ベクトルに正規化し、それを必要な距離 d で乗算し、最終的に結果のベクトルをポイント A に追加します。つまり:

  A_moved = A + |(B-A)|*d

ジャワ(っぽい)

  Vector2D a_moved = a.add(b.subtract(a).norm().multiply(d));

角度も厄介なトリガーも必要ありません。

于 2010-03-01T15:27:59.620 に答える
3
double angle = Math.atan2(landingCoordinate.y-coordinate.y, landingCoordinate.x-coordinate.x);

coordinate.x += Math.cos(angle)*distance;
coordinate.y += Math.sin(angle)*distance;

//Add 90 degress to the plane angle
plane.setAngle(angle + 1.57079633);
于 2010-03-01T15:20:05.353 に答える
0

このゲームでは、グリッド内の正方形を表すために整数座標が使用されます。このメソッドは、ここmove(int row, int col)に示すように、8 つの半基本方向のいずれかに 1 つの正方形を進めることによって、指定された行と列に向かって移動します

于 2010-03-01T01:57:08.153 に答える