在 Java 中绘制自动机的有向边
Draw directed edge of an automata in Java
我需要写一些类似graphviz的东西。我已经设法绘制节点,使它们不重叠,并将它们的中心与二次贝塞尔曲线连接起来,但我面临以下关于弯曲边缘方向性的问题:
如你所见,黄色的小三角形不太好看。我的代码如下:
g.setColor(Color.RED);
ArrowGraph arrow = graph.getArrows().get(0);
int x = (int)(arrow.getP1().getX() + arrow.getP2().getX()) / 2;
int y = (int)(arrow.getP1().getY() + arrow.getP2().getY()) / 2 + 50;
QuadCurve2D.Double curve = new QuadCurve2D.Double(arrow.getP1().getX() - 20, arrow.getP1().getY() - 20, x, y, arrow.getP2().getX() - 20, arrow.getP2().getY() - 20);
((Graphics2D)g).draw(curve);
int[] xPoints = new int[] {(int)arrow.getP2().getX() - 20, (int)arrow.getP2().getX() - 15, (int)arrow.getP2().getX() - 25};
int[] yPoints = new int[] {(int)arrow.getP2().getY() - 20, (int)arrow.getP2().getY() - 10, (int)arrow.getP2().getY() - 10};
g.setColor(Color.YELLOW);
g.fillPolygon(xPoints, yPoints, 3);
我知道的坐标:曲线的起止点和控制点。起点和终点基本上是节点的中心。
我想以某种方式将三角形调整为曲线,所以它在它的末端(最好在节点的边界)。知道我该怎么做吗?
您可以使用 FlatteningPathIterator 传递曲线并获取最后一段(实际上是路径上的最后一行)。
使用线来构建箭头三角形。
我需要写一些类似graphviz的东西。我已经设法绘制节点,使它们不重叠,并将它们的中心与二次贝塞尔曲线连接起来,但我面临以下关于弯曲边缘方向性的问题:
如你所见,黄色的小三角形不太好看。我的代码如下:
g.setColor(Color.RED);
ArrowGraph arrow = graph.getArrows().get(0);
int x = (int)(arrow.getP1().getX() + arrow.getP2().getX()) / 2;
int y = (int)(arrow.getP1().getY() + arrow.getP2().getY()) / 2 + 50;
QuadCurve2D.Double curve = new QuadCurve2D.Double(arrow.getP1().getX() - 20, arrow.getP1().getY() - 20, x, y, arrow.getP2().getX() - 20, arrow.getP2().getY() - 20);
((Graphics2D)g).draw(curve);
int[] xPoints = new int[] {(int)arrow.getP2().getX() - 20, (int)arrow.getP2().getX() - 15, (int)arrow.getP2().getX() - 25};
int[] yPoints = new int[] {(int)arrow.getP2().getY() - 20, (int)arrow.getP2().getY() - 10, (int)arrow.getP2().getY() - 10};
g.setColor(Color.YELLOW);
g.fillPolygon(xPoints, yPoints, 3);
我知道的坐标:曲线的起止点和控制点。起点和终点基本上是节点的中心。
我想以某种方式将三角形调整为曲线,所以它在它的末端(最好在节点的边界)。知道我该怎么做吗?
您可以使用 FlatteningPathIterator 传递曲线并获取最后一段(实际上是路径上的最后一行)。
使用线来构建箭头三角形。