Круговое векторное преобразование - PullRequest
0 голосов
/ 22 марта 2019

Привет

У меня есть программа, в которой вы перетаскиваете круги на сцене, используя JavaFX.Я не хочу, чтобы круги сталкивались друг с другом, поэтому я добавил алгоритм столкновения, чтобы проверить, что теперь работает.Что меня озадачивает, так это то, что я хочу сделать потом.

Если два круга перекрываются, я хочу сделать вектор между серединой двух и преобразовать перемещенный круг в направлении вектора, пока они больше не перекрываются.

Mouse dropped. Detected collision and transform second circle.

            for (Stone stn:getCurrentScenario().getStones()) {
                if (stn.circle == circle) continue;

                double x1 = stn.circle.getTranslateX();
                double y1 = stn.circle.getTranslateY();
                double r1 = stn.circle.getRadius()+stn.circle.getStrokeWidth();

                double x2 = circle.getTranslateX();
                double y2 = circle.getTranslateY();
                double r2 = circle.getRadius();

                double distSq = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
                double radSumSq = (r1 + r2) * (r1 + r2);


                if (!(distSq != radSumSq && distSq > radSumSq)) {
                    System.out.println("Collision.");
                    // Transform "circle".

                }

            }

1 Ответ

0 голосов
/ 22 марта 2019

В итоге я пропустил векторную идею и вместо этого пошел по углу.Собираюсь сохранить заголовок, если кто-то столкнется с подобной проблемой:

    double newX = circle.getTranslateX();
    double newY = circle.getTranslateY();


    for (Stone stn:getCurrentScenario().getStones()) {
        if (stn.circle == circle) continue;

        double x1 = stn.circle.getTranslateX();
        double y1 = stn.circle.getTranslateY();
        double r1 = stn.circle.getRadius()+stn.circle.getStrokeWidth();

        double x2 = newX;
        double y2 = newY;
        double r2 = circle.getRadius();

        double distSq = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
        double radSumSq = (r1 + r2) * (r1 + r2);


        if (!(distSq != radSumSq && distSq > radSumSq)) {
            double angle = Math.atan2(x1-x2,y1-y2);
            newX = x1 - Math.sin(angle) * (circle.getRadius() + circle.getStrokeWidth() + stn.circle.getRadius() + .01);
            newY = y1 - Math.cos(angle) * (circle.getRadius() + circle.getStrokeWidth() + stn.circle.getRadius() + .01);



        }
    }
    for (Stone stn:getCurrentScenario().getStones()) {
        if (stn.circle == circle) continue;
        double x1 = stn.circle.getTranslateX();
        double y1 = stn.circle.getTranslateY();
        double r1 = stn.circle.getRadius()+stn.circle.getStrokeWidth();

        double x2 = newX;
        double y2 = newY;
        double r2 = circle.getRadius();

        double distSq = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
        double radSumSq = (r1 + r2) * (r1 + r2);

        if (!(distSq != radSumSq && distSq > radSumSq)) {
            newX = oldX;
            newY = oldY;
            break;
        }
    }

    circle.setTranslateX(newX);
    circle.setTranslateY(newY);

Я сделал этот кусок кода, просто чтобы убедиться, что он работает как задумано.Собираюсь улучшить это сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...