Рисование ребра (линии) между двумя узлами (кругами)

Я работаю над графом зависимостей, который состоит из нескольких узлов и нескольких ребер, направленных от одного узла к другому в графе.

Я пытаюсь нарисовать график, добавляя n узлов в виде кругов и ребер между этими узлами в виде линии.

Я использую графическую библиотеку Java вместе с JPanel и Jframe.

В настоящее время это код, который я сделал:

public class LoopUnrolling extends JPanel{


static int length = 5;
static String graph[][] = new String[length][length];


@Override
public void paintComponent(Graphics g){

    super.paintComponent(g);

    Random random = new Random();

    int x1 = random.nextInt(500);
    int y1 = random.nextInt(100);

    int x2 = random.nextInt(500);
    int y2 = random.nextInt(100);

    g.setColor(Color.red);
    g.drawOval(x1,y1,30,40);
    g.drawOval(x2,y2,30,40);
    g.drawLine(x1, y1, x2, y2);



}
public static void main(String[] args) {

         LoopUnrolling paintObject = new LoopUnrolling();
         JFrame jf = new JFrame();
         jf.setTitle("Dependancy Graph");
         jf.setSize(600,400);
         jf.setVisible(true);
         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         jf.add(paintObject);
        }


 }

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

Я нарисовал каждый узел в случайном месте на холсте и хочу добавить линию между этими двумя узлами. На линии есть Point1(x1,y1) и Point2(x2,y2). Эти точки должны быть точками на контуре двух разных узлов (кругов).

Что такое LoopUnrolling и что вы расширяете? Пожалуйста, предоставьте свой полный код, а не просто небольшой неправильный фрагмент.

GAlexMES 28.05.2019 11:32

LoopUnrolling — это в основном название проекта.

Muhammad Yasir Javed 28.05.2019 11:33

Нет, это класс, который вы используете и добавляете в JFrame. Какова цель этого класса?

GAlexMES 28.05.2019 11:34

Обновил код.

Muhammad Yasir Javed 28.05.2019 11:35

Что именно вы хотите подключить? Круг или центр овалов?

GAlexMES 28.05.2019 11:37

Точка на контуре окружности1 и точка на контуре окружности2 с линией

Muhammad Yasir Javed 28.05.2019 11:39

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

GAlexMES 28.05.2019 11:50

Да, есть ли какая-то петля вокруг него? Возможно, используя другую форму, которая заканчивается овалом или кругом.

Muhammad Yasir Javed 28.05.2019 11:56

Вы можете найти центр овала, зная его высоту и ширину. Концы линий можно скрыть, нарисовав их за непрозрачными овалами. Вам не нужна математика, если вы не хотите иметь какие-то причудливые стрелки на концах строк.

IcedLance 28.05.2019 12:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
9
368
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

У вас есть два эллипса с центрами

 cx1 = x1 + w1/2, cy1 = y1 + h1/2 
 and 
 cx2 = x2 + w2/2, cy2 = y2 + h2/2 

где wxx и hxx - ширина и высота эллипса (третий и четвертый параметры drawOval)

Получить разностный вектор

 dx = cx2 - cx1
 dy = cy2 - cy1

нормализовать это

 len  = sqrt(dx*dx + dy*dy)
 dx = dx / len
 dy = dy / len

Теперь вычисляем точки на окружности

 r1 = 0.5 * w1 * h1 / sqrt(w1*w1*dy*dy+h1*h1*dx*dx)
 px1 = cx1 + r1 * dx
 py1 = cy1 + r1 * dy

 r2 = 0.5 * w2 * h2 / sqrt(w2*w2*dy*dy+h2*h2*dx*dx)
 px2 = cx2 - r2 * dx
 py2 = cy2 - r2 * dy

И нарисуйте отрезок (px1,py1)-(px2,py2)

Образец Реализация Делфи и результат:

Что такое r1 и r2?

Muhammad Yasir Javed 28.05.2019 12:04

Радиусы окружностей. Но у вас есть эллипсы с двумя полуосями, поэтому решение нужно изменить

MBo 28.05.2019 12:05

Исправлена ​​ошибка, теперь проверяется подход (добавлено 0,5 коэф.)

MBo 28.05.2019 15:22

Я очень благодарен за ваше подробное объяснение. Теперь код работает отлично, большое спасибо!

Muhammad Yasir Javed 28.05.2019 17:37

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