在节点之间绘制多条线,同时使用javafx保持其清洁

时间:2018-04-22 00:40:09

标签: javafx

我在窗格上有多个顶点绘制为圆形。我想绘制一个图形,所以我需要在Circles之间绘制边缘。 我需要能够在顶点之间绘制多条边,同时保持清晰。到现在为止,我正在使用Line,但如果我在相同的顶点之间绘制2 Line,我们就不会再看到它们了。 我还需要能够在顶点和自身之间绘制边缘。 有什么我可以使用,这会使这更容易吗? 我想过在每个顶点之间使用Path和添加新顶点时,每次都使用不同的东西,比如ArcTo或CurveTo等......但这似乎不是一个好主意,我想总是一样的顶点之间的连接(一条直线或略微弯曲的线)。

1 个答案:

答案 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;
}

您可能需要将曲线的起点/终点坐标修改为圆的边缘以实现正交切线。