Рисование края (линии) между двумя узлами (кругами) - PullRequest
0 голосов
/ 28 мая 2019

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

Я пытаюсь нарисовать визуализацию графа, добавив 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).Эти точки должны быть точками на двух разных контурах узлов (кругов)

1 Ответ

1 голос
/ 28 мая 2019

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

 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)

Пример Реализация Delphi и результат: enter image description here

...