「最適な交点を見つける」実装は間違った結果をもたらします

金魚

こんにちは私は元の質問が次のリンクで見つけることができますが、私はそれを私の実装に関連付けていなかったので保留にされたので、今これを行います。

https://stackoverflow.com/questions/40030999/find-best-collision-point?noredirect=1#comment67383779_40030999

別のスレッドでこの問題の解決策を見つけましたが、出力は妥当なように見えますが、これでは常に間違った結果が得られます...

緯度/経度座標を持つ2つの移動オブジェクトの交差

私のコードは単純明快です。問題を特定するのに役立つポイントクラス(ポイントは常に正確な整数上にあるため、java.awt.Pointではありません)があります。

public static class Point {
    /**
     * the x position of this position
     */
    private int x;
    /**
     * the y position of this position
     */
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    /**
     * calculates the Euclidean distance between this position and another one.
     *
     * @param point the position to which the distance should be calculated.
     * @return the Euclidean distance
     */
    public int getDistance(Point point) {
        int dx = Math.abs(x - point.getX());
        int dy = Math.abs(y - point.getY());
        return (int) Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
    }

    /**
     * calculates the angle between two points.
     *
     * @param target the point to which the angle should be calculated
     * @return the angle in degrees
     */
    public double getAngle(Point target) {
        double angle = Math.toDegrees(Math.atan2(target.y - y, target.x - x));
        if (angle < 0) {
            angle += 360;
        }
        return angle;
    }

    public Point getBestIntersectionPoint(int mySpeed, Point target, int targetSpeed, Point targetsTarget) {
        double distance = getDistance(target);

        double angle = 180 - Math.abs(target.getAngle(this) - target.getAngle(targetsTarget));

        double a = Math.pow(mySpeed, 2) - Math.pow(targetSpeed, 2);
        double b = 2 * distance * targetSpeed * Math.cos(Math.toRadians(angle));
        double c = -Math.pow(distance, 2);

        System.out.println("a: " + a);
        System.out.println("b: " + b);
        System.out.println("c: " + c);

        //Finding out the roots
        double temp1 = Math.sqrt((Math.pow(b, 2)) - 4 * a * c);

        double root1 = (-b + temp1) / (2 * a);
        double root2 = (-b - temp1) / (2 * a);

        Point intersection1 = target.getPositionInTurns(targetsTarget, targetSpeed, root1);
        Point intersection2 = target.getPositionInTurns(targetsTarget, targetSpeed, root2);
        int distance1 = intersection1.getDistance(target);
        int distance2 = intersection2.getDistance(target);

        int targetDistance = target.getDistance(targetsTarget);
        System.out.println(angle + " - " + intersection1 + "; " + intersection2);
        return null;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Point)) return false;

        Point point = (Point) o;

        if (getX() != point.getX()) return false;
        return getY() == point.getY();
    }
}

ここでの問題は、メソッド「getBestIntersectionPoint」です。たとえば、オブジェクト1が座標(x = 1100、y = 1200)にあり、オブジェクト2が(x = 8250、y = 4500)にあり、オブジェクト3が(x = 8250、y = 8999)にあるとすると、速度は同じに保たれます。他のスレッドの写真のように。正しい交点はほぼ上にある必要があります(x = 8250、y = 5000)。しかし、この実装では、このポイントにさえ近くない2つの交差点が得られます...

ポイント{x = 8250、y = -4738}; ポイント{x = 8250、y = 8538}

金魚

thx Salixが助けてくれましたが、数式にいくつかの間違いがありました。この問題を解決するのに少し時間がかかりましたが、これがそのトリックを実行する実装済みのメソッドです。

public Point getBestIntersectionPoint(double v1, Point p2, double v2, Point p3) {
        int diffX = p3.getX() - p2.getX();
        int diffY = p3.getY() - p2.getY();

        Point u = new Point(
                diffX == 0 ? 0 : diffX / Math.abs(diffX),
                diffY == 0 ? 0 : diffY / Math.abs(diffY));

        double p1x = getX();
        double p1y = getY();

        double p2x = p2.getX();
        double p2y = p2.getY();

        double a = v1 * v1 - v2 * v2 * (u.getX() * u.getX() + u.getY() * u.getY());
        double b = (v2 * (u.getX() * (2 * p1x - 2 * p2x) + u.getY() * (2 * p1y - 2 * p2y)));
        double c = -p2x * p2x - p2y * p2y - p1x * p1x - p1y * p1y + 2 * p2x * p1x + 2 * p2y * p1y;

        double temp = Math.sqrt(Math.pow(b, 2) - 4 * a * c);
        double t1, t2; //This is now a double, too.
        t1 = (-b + temp) / (2 * a);
        t2 = (-b - temp) / (2 * a);

        Point s2_1 = new Point(
                (int) (t1 * v2 * u.getX() + p2x),
                (int) (t1 * v2 * u.getY() + p2y));
        Point s2_2 = new Point(
                (int) (t2 * v2 * u.getX() + p2x),
                (int) (t2 * v2 * u.getY() + p2y));

        Point ut1 = new Point((int) (s2_1.getX() - p2x), (int) (s2_1.getY() - p2y));
        ut1.setX(ut1.getX() / Math.abs(ut1.getX()));
        ut1.setY(ut1.getY() / Math.abs(ut1.getY()));

        Point ut2 = new Point((int) (s2_2.getX() - p2x), (int) (s2_2.getY() - p2y));
        ut2.setX(ut2.getX() / Math.abs(ut2.getX()));
        ut2.setY(ut2.getY() / Math.abs(ut2.getY()));

        return ut1.equals(u) ? s2_1 : ut2.equals(u) ? s2_2 : null;
    }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

私のクイックソートの実装は間違った結果をもたらします

分類Dev

GROUP BYMONTHは間違った結果をもたらします

分類Dev

Timedelta操作は間違った結果をもたらします

分類Dev

OpenGL:シェーダーに実装されたBlinn-Phongモデルは間違った結果をもたらします

分類Dev

AMPL IPOPTは、解決結果が「解決」されている間、間違った最適解を提供します

分類Dev

OpenMPの崩壊は間違った結果をもたらします

分類Dev

モジュラスは間違った結果をもたらしますか?

分類Dev

Timedeltaとの時差は間違った結果をもたらします

分類Dev

Pythonのreplace関数は間違った結果をもたらします

分類Dev

正規表現は間違った結果をもたらします

分類Dev

iter_swapは間違った結果をもたらします

分類Dev

Google SheetsVALUE関数は間違った結果をもたらします

分類Dev

AES復号化は間違った結果をもたらします

分類Dev

Round(0.005)は間違った結果をもたらしますか?

分類Dev

ソート配列は間違った結果をもたらします

分類Dev

間違った実装は、ハッシュテーブルを使用してレコードを検索します。結果が見つかりません?

分類Dev

行を減算するパンダは間違った結果をもたらします

分類Dev

フィルタ結果から間違った動作を見つける

分類Dev

パンダを使ったアイテムの再割り当ては間違った結果をもたらします

分類Dev

大きな構造体変数を持つcudaカーネル関数は間違った結果をもたらします

分類Dev

SQL結合テーブルは間違った結果をもたらします

分類Dev

PHPの `hex2bin`のNode.js / JS実装は、間違った結果を返します。同じ結果を得る方法は?

分類Dev

削減のためのOpenMP並列は間違った結果をもたらします

分類Dev

セレンは間違った元素、存在すらしていない元素を見つけます

分類Dev

scipyスパース行列のsklearntrain_test_splitは間違った結果をもたらします

分類Dev

イングレス乗算は間違った結果をもたらします

分類Dev

Eigenでのスパース行列の乗算は、間違った結果をもたらしますか?

分類Dev

Pythonの「decimal」パッケージは間違った結果をもたらします

分類Dev

ソートアルゴリズムは間違った結果をもたらします

Related 関連記事

  1. 1

    私のクイックソートの実装は間違った結果をもたらします

  2. 2

    GROUP BYMONTHは間違った結果をもたらします

  3. 3

    Timedelta操作は間違った結果をもたらします

  4. 4

    OpenGL:シェーダーに実装されたBlinn-Phongモデルは間違った結果をもたらします

  5. 5

    AMPL IPOPTは、解決結果が「解決」されている間、間違った最適解を提供します

  6. 6

    OpenMPの崩壊は間違った結果をもたらします

  7. 7

    モジュラスは間違った結果をもたらしますか?

  8. 8

    Timedeltaとの時差は間違った結果をもたらします

  9. 9

    Pythonのreplace関数は間違った結果をもたらします

  10. 10

    正規表現は間違った結果をもたらします

  11. 11

    iter_swapは間違った結果をもたらします

  12. 12

    Google SheetsVALUE関数は間違った結果をもたらします

  13. 13

    AES復号化は間違った結果をもたらします

  14. 14

    Round(0.005)は間違った結果をもたらしますか?

  15. 15

    ソート配列は間違った結果をもたらします

  16. 16

    間違った実装は、ハッシュテーブルを使用してレコードを検索します。結果が見つかりません?

  17. 17

    行を減算するパンダは間違った結果をもたらします

  18. 18

    フィルタ結果から間違った動作を見つける

  19. 19

    パンダを使ったアイテムの再割り当ては間違った結果をもたらします

  20. 20

    大きな構造体変数を持つcudaカーネル関数は間違った結果をもたらします

  21. 21

    SQL結合テーブルは間違った結果をもたらします

  22. 22

    PHPの `hex2bin`のNode.js / JS実装は、間違った結果を返します。同じ結果を得る方法は?

  23. 23

    削減のためのOpenMP並列は間違った結果をもたらします

  24. 24

    セレンは間違った元素、存在すらしていない元素を見つけます

  25. 25

    scipyスパース行列のsklearntrain_test_splitは間違った結果をもたらします

  26. 26

    イングレス乗算は間違った結果をもたらします

  27. 27

    Eigenでのスパース行列の乗算は、間違った結果をもたらしますか?

  28. 28

    Pythonの「decimal」パッケージは間違った結果をもたらします

  29. 29

    ソートアルゴリズムは間違った結果をもたらします

ホットタグ

アーカイブ