Я работаю над графом зависимостей, который состоит из нескольких узлов и нескольких ребер, направленных от одного узла к другому в графе.
Я пытаюсь нарисовать график, добавляя 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 — это в основном название проекта.
Нет, это класс, который вы используете и добавляете в JFrame. Какова цель этого класса?
Обновил код.
Что именно вы хотите подключить? Круг или центр овалов?
Точка на контуре окружности1 и точка на контуре окружности2 с линией
А, хорошо, я вижу. Ваша проблема в том, что ваши координаты определяют верхний левый угол квадрата вокруг вашего овала. Это означает, что вы не можете использовать их для рисования линии. Ваша проблема больше математическая, чем проблема Java.
Да, есть ли какая-то петля вокруг него? Возможно, используя другую форму, которая заканчивается овалом или кругом.
Вы можете найти центр овала, зная его высоту и ширину. Концы линий можно скрыть, нарисовав их за непрозрачными овалами. Вам не нужна математика, если вы не хотите иметь какие-то причудливые стрелки на концах строк.
У вас есть два эллипса с центрами
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?
Радиусы окружностей. Но у вас есть эллипсы с двумя полуосями, поэтому решение нужно изменить
Исправлена ошибка, теперь проверяется подход (добавлено 0,5 коэф.)
Я очень благодарен за ваше подробное объяснение. Теперь код работает отлично, большое спасибо!
Что такое LoopUnrolling и что вы расширяете? Пожалуйста, предоставьте свой полный код, а не просто небольшой неправильный фрагмент.