如何扩展JavaFX Shape类以实现自定义形状

时间:2016-03-18 13:20:57

标签: java javafx shape

我正在开发一个应用程序,以模拟某些特定问题的2D几何体。当然,我想在屏幕上绘制该几何图形,供用户实际看到它。

JavaFX有一些2D形状,如矩形,椭圆等。它还有立方和四次曲线,实现为贝塞尔曲线。搜索自定义形状并没有帮助,因为我发现的所有内容都是采用路径等形状元素并将它们组合在一起绘制自定义形状(如心形或菱形)的示例。通过扩展Shape类来搜索有关如何实现新形状的信息甚至没那么有用。

我想要绘制的是任意顺序和长度的B样条曲线。我知道如何计算和实现Splines本身,但我不知道如何将它们实现为新的Shape或Shape Wrapper。

我查看了JavaFX的源代码和纪录片。似乎这些形状本身就是某种包装类。例如。 Ellipse类包含一个椭圆作为成员,它是几何包的一部分。这种递归相当远。

现在JavaFX必须使用某种方法来实际绘制曲线,但我无法找到它。

那么如何扩展JavaFX Shape以创建例如样条曲线?什么方法/类是Java绘制它的关键?

我希望有人可以帮助我。

你真诚的托尔斯滕

1 个答案:

答案 0 :(得分:0)

我要看一下JSilhoutte如何实现它们的形状。

例如,

Cross不会扩展Shape,而是通过创建两个矩形并使用Shape组合来生成表示十字的Shape.union。以下是相关方法:

@Override
protected void calculateShape() {
        double cx = getCenterX();
        double cy = getCenterY();
        double r = getRadius();
        double n = validateRoundness(getRoundness());
        double w = validateWidth(getWidth(), r);

        double arcWH = w * n;
        Rectangle beam1 = new Rectangle(cx - r, cy - (w / 2), r * 2, w);
        Rectangle beam2 = new Rectangle(cx - (w / 2), cy - r, w, r * 2);
        beam1.setArcWidth(arcWH);
        beam1.setArcHeight(arcWH);
        beam2.setArcWidth(arcWH);
        beam2.setArcHeight(arcWH);
        Shape shape = Shape.union(beam1, beam2);

        shape.getStyleClass().addAll("silhouette", "silhoutte-cross");

        setShape(shape);
}

因此,您可以使用Shape.union将多个CubicCurve / QuadCurve形状组合在一起,以创建任意顺序和长度的B样条曲线。