在两个节点(圆)之间绘制一条边(线)

时间:2019-05-28 09:22:01

标签: java geometry 2d drawing p5.js

我正在研究一个依赖图,该图由多个节点和图中一个节点到另一个节点的多个有向边组成。

我试图通过将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 个答案:

答案 0 :(得分: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)

示例Delphi implementation和结果: enter image description here