当前位置: 首页 > 知识库问答 >
问题:

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

连时铭
2023-03-14

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

JavaFX有一些2D形状,如矩形、椭圆形等。它也有三次和四次曲线,实现为贝塞尔曲线。搜索自定义形状没有帮助,因为我所找到的只是一些形状元素的例子,如路径,并将它们放在一起绘制自定义形状,如心形或菱形。搜索关于如何通过扩展shape类来实现新形状的信息就更没用了。

我要画的是任意阶任意长的B样条曲线。我知道如何计算和实现样条本身,但我不知道如何实现它们作为一个新的形状,或形状包装。

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

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

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

希望有人能帮帮我。

你真诚的Thorsten

共有2个答案

傅越
2023-03-14

我试图做类似的事情,但我没有尝试扩展Shape,而是尝试扩展PathElement。我这样做是为了实现一个nurbsTo方法,它允许我绘制NURBS或B样条曲线。PathElement是一个抽象类,希望您覆盖:

void addTo(NGPath)

它不是公共的,所以如果您想这样做,您的新类必须在javafx/scene/shape包中。所以基本上,你不能这样做。看到这篇文章,我快速地看了看写一个扩展形状的调用是否可行,正如托尔斯滕正确指出的那样,这看起来像是一条艰难的路径,所以我没有继续下去。

我采用的方法是使我的 NURBS 类生成一组 MoveTo 命令。我以足够的增量值迭代U(t)以获得足够的点,以便曲线看起来平滑。这可能是完成Thorsen发布的需求的最合理方法。如果你看看像Circle这样的东西的javafx实现,它在内部也在做同样的事情。默认情况下,Circle 类计算圆形形状上的 64 个点并绘制线条。对于大多数NURBS和B-样条曲线,我发现100个点看起来不错且平滑,但这当然取决于所使用的程度,控制点和节点。

丁良骏
2023-03-14

我想看看JSilhoutte是如何实现它们的形状的。

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

@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样条曲线。

 类似资料:
  • 目前 Mars 支持自定义 xlog 的加密部分和长短连协议加解包部分。需要强调的是想要自定义这些扩展,需要在本地编译 Mars 才可以,编译方法见 Mars Android 接入指南 和 Mars iOS/OS X 接入指南 中的编译部分。切记,在自定义实现时,可以增加函数,但是不能删除头文件中已有的函数,也不能修改头文件中的函数原型。 自定义 xlog 加密 xlog 的具体实现可以参考微信终

  • 当我们在开发某些东西时,经常会需要我们自己的 error 类来反映在我们的任务中可能出错的特定任务。对于网络操作中的 error,我们需要 HttpError,对于数据库操作中的 error,我们需要 DbError,对于搜索操作中的 error,我们需要 NotFoundError,等等。 我们自定义的 error 应该支持基本的 error 的属性,例如 message,name,并且最好还有

  • 问题内容: 我正在阅读另一个SO问题,即Swift do-try-catch语法。在他的回答中, rickster 为OP的自定义类创建了扩展。 Konrad77 评论说,这是“保持代码整洁的好方法。” 我尊重他们的知识,这使我相信我在自己的代码中遗漏了一点。 除了为我创建的类创建扩展之外,还有其他好处(除了整洁)还是原因?我可以将相同的功能直接放入类中。如果我是唯一使用该类的人,或者其他人将使用

  • 本文向大家介绍Java如何实现自定义异常类,包括了Java如何实现自定义异常类的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java如何实现自定义异常类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自定义异常类步骤   创建一个类继承异常父类Exception   在具体的实现方法首部抛出异常类(自己创建的那个类),throws的

  • 通过Envoy架构很容易扩展网络过滤器和HTTP过滤器。 有关如何添加网络过滤器和构建库并建立依赖关系的示例,请参见envoy-filter-example。 返回

  • 用户自定义扩展是用户自己创建的 JavaScript 文件,对 Selenium IDE 现有的功能进行定制以及功能扩展。通常这种定制和扩展是以自定义命令的形式来体现的,当然也不仅限于命令。 这里可以找到很多有用的扩展。 注意:这部分信息已经过时,我们将很快修改。 也许最受欢迎的 Selenium IDE 扩展就是流程控制,流程控制扩展将提供 while 循环和条件判断。这个扩展是 goto_se