在两个节点(圆)之间绘制边(线)
Drawing an Edge (Line) Between Two Nodes ( Circles)
我正在研究一个依赖图,它由多个节点和图中从一个节点到另一个节点的多个有向边组成。
我正在尝试通过将 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);
}
}
我可以画两个圆和一条线,但是我遇到的问题是用边连接这两个圆。
我在 canvas 上的随机位置绘制了每个节点,并想在这两个节点之间添加一条线。
该线具有 Point1(x1,y1) 和 Point2(x2,y2)。这些点应该是两个不同节点(圆)轮廓上的点
你有两个带中心的椭圆
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和结果:
我正在研究一个依赖图,它由多个节点和图中从一个节点到另一个节点的多个有向边组成。
我正在尝试通过将 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);
}
}
我可以画两个圆和一条线,但是我遇到的问题是用边连接这两个圆。
我在 canvas 上的随机位置绘制了每个节点,并想在这两个节点之间添加一条线。 该线具有 Point1(x1,y1) 和 Point2(x2,y2)。这些点应该是两个不同节点(圆)轮廓上的点
你有两个带中心的椭圆
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和结果: