Переместить объект в круг

Как вы можете видеть на изображении, у меня есть объекты p1 и p2 с координатами (x, y), значения которых мне известны, и я знаю радиус всех этих круговых объектов.

Однако я хочу рассчитать новую позицию x, y, которая будет центральной точкой p3. По сути, как вы можете видеть, это позиция p2 + радиус.

Я делаю это для java-игры, основанной на libgdx. Буду признателен за любые указания/примеры по математике или языку Java.

enter image description here

См. stackoverflow.com/questions/11462239/…, который содержит ссылку на en.wikipedia.org/wiki/Полярная_координатная_система.

Franck 17.05.2022 21:43

А следующие ссылки содержат код для преобразования между полярными координатами и координатами x-y: stackoverflow.com/questions/49576502/…

Franck 17.05.2022 21:52

Спасибо за эти ссылки, я уже нашел некоторые из них. Честно говоря, относительно первой ссылки из stackoverflow и того ответа, в котором говорится: a1 = 28*(π/180) где 28 - это угол перемещения в случае этого вопроса, и это значение переменной, которого у меня нет в моем случае. В моем случае я знаю только позиции и радиус. Но я верю, что придумаю что-нибудь из других ссылок, которые вы предоставили. :)

Kapparino 17.05.2022 21:57
a1 = 28*(π/180) — это преобразование 28 градусов в соответствующее количество радиан (360° = 2π). Расстояние от p2 до p3 можно выразить как путь по большому кругу (в радианах) или как угол между прямыми p1p2 и p1p3 (в градусах).
Franck 18.05.2022 00:56
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
4
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

См. комментарии к коду для объяснения.

import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import javax.swing.*;

class CenteredCircle extends Ellipse2D.Double {
    CenteredCircle(double x, double y, double radius) {
        super(x - radius, y - radius, 2 * radius, 2 * radius);
    }   
}

public class CircleDemo extends JFrame {
    public CircleDemo() {
            int width = 640; int height = 480;
            setSize(new Dimension(width, height));
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);
    
            JPanel p = new JPanel() {
                @Override
                public void paintComponent(Graphics g) {
                    Graphics2D g2d = (Graphics2D) g;
                    double radius = 130.0;
                    double[] p1 = { width/2, height/2 };

                    // big circle
                    Shape circle2 = new CenteredCircle(p1[0], p1[1], radius);
                    g2d.draw(circle2);                    

                    // 12 small circles
                    for (int angle = 0; angle < 360; angle += 30) {
                        // this is the magic part
                        // a polar co-ordinate has a length and an angle
                        // by changing the angle we rotate
                        // the transformed co-ordinate is the center of the small circle
                        double[] coord = polarToCartesian(radius, angle);
                        // draw line just for visualization
                        Line2D line = new Line2D.Double(p1[0], p1[1], p1[0] + coord[0], p1[1] + coord[1]);
                        g2d.draw(line);
                        // draw the small circle
                        Shape circle = new CenteredCircle(p1[0] + coord[0], p1[1] + coord[1], radius/4);
                        g2d.draw(circle);  
                    }
                }
            };
            setTitle("Circle Demo");
            this.getContentPane().add(p);
        }
    public static void main(String arg[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new CircleDemo();
            }
        });
    }    
    static double[] polarToCartesian(double r, double theta) {
        theta = (theta * Math.PI) / 180.0; // multiply first, then divide to keep error small
        return new double[]{ r * Math.cos(theta), r * Math.sin(theta) };
    }
    // not needed, just for completeness
    public static double[] cartesianToPolar(double x, double y) {
        return new double[]{ Math.sqrt(x * x + y * y), (Math.atan2(y, x) * 180) / Math.PI };
    }    
}

enter image description here

Теперь у меня есть более качественное изображение! Спасибо за этот пример!

Kapparino 17.05.2022 23:50

Другие вопросы по теме