我在窗格上有多个顶点绘制为圆形。我想绘制一个图形,所以我需要在Circles之间绘制边缘。 我需要能够在顶点之间绘制多条边,同时保持清晰。到现在为止,我正在使用Line,但如果我在相同的顶点之间绘制2 Line,我们就不会再看到它们了。 我还需要能够在顶点和自身之间绘制边缘。 有什么我可以使用,这会使这更容易吗? 我想过在每个顶点之间使用Path和添加新顶点时,每次都使用不同的东西,比如ArcTo或CurveTo等......但这似乎不是一个好主意,我想总是一样的顶点之间的连接(一条直线或略微弯曲的线)。
答案 0 :(得分:2)
我不明白为什么使用曲线是一个问题。改变参数应该产生不同的曲线。对于2个不同的顶点,二次曲线应该足够,为了将顶点连接到自身,您可以使用三次曲线。
// create connections between independent circles
private static Pane createPaths(double x1, double y1, double x2, double y2, int lineCount) {
Circle circle1 = new Circle(x1, y1, 5, Color.DODGERBLUE);
Circle circle2 = new Circle(x2, y2, 5, Color.DODGERBLUE);
double mx = (x1 + x2) / 2;
double my = (y1 + y2) / 2;
double dnX = y2 - y1;
double dnY = x1 - x2;
// normalize ortogonal
double length = Math.hypot(dnX, dnY);
dnX /= length;
dnY /= length;
Pane pane = new Pane();
for (int i = 0; i < lineCount; i++) {
double factor = calculateControlPointDistance(i, lineCount, length);
Path path = new Path(new MoveTo(x1, y1),
new QuadCurveTo(mx + factor * dnX, my + factor * dnY, x2, y2));
pane.getChildren().add(path);
}
pane.getChildren().addAll(circle1, circle2);
return pane;
}
private static final double DISTANCE = 100;
// connect circle to itself
private Pane createCycle(double x, double y, int count) {
Pane pane = new Pane();
final double angleStep = (count == 1 ? Math.PI / 2 : Math.PI / count);
for (int i = 0; i < count; i++) {
double angle = 2 * i * angleStep;
Path path = new Path(new MoveTo(x, y),
new CubicCurveTo(
x + Math.sin(angle) * DISTANCE,
y + Math.cos(angle) * DISTANCE,
x + Math.sin(angle + angleStep) * DISTANCE,
y + Math.cos(angle + angleStep) * DISTANCE,
x,
y));
pane.getChildren().add(path);
}
pane.getChildren().add(new Circle(x, y, 5, Color.DODGERBLUE));
return pane;
}
您可能需要将曲线的起点/终点坐标修改为圆的边缘以实现正交切线。