【问题标题】:How to draw absolutely custom shape in Java?如何在 Java 中绘制绝对自定义的形状?
【发布时间】:2013-12-01 17:44:06
【问题描述】:

Java2D API 支持的最复杂的形状是贝塞尔线段。假设我要绘制有理线段(每个控制点都有一个权重,整个渲染公式略有不同)。

如何做到这一点?

是否可以扩展渲染引擎以绘制更复杂的形状?

更新

实现自定义形状的常用方法是实现Shape 接口。该接口具有返回PathIteratorPathIterator 迭代段类型的关键方法。只有 5 种细分类型。其中最弯曲的是SEG_CUBICTO,这是标准的贝塞尔曲线,有4个控制点(包括开始和结束2个)。

如果我对贝塞尔曲线应用线性分数变换,每个控制点都会获得一个权重,作为其坐标的补充,贝塞尔曲线会转向 NURBS(不确定,未能学习确切的术语)。无论如何,曲线的公式与贝塞尔曲线不同。

【问题讨论】:

  • 我不是 java2d 专家,但基于 javadocs,所有形状都实现了Shape 接口,所以如果你想要复杂和定制的东西,我可以这么说
  • 是的,但是Shape返回PathIterator,而PathIterator只返回固定数量的段类型,其中最复杂的是SEG_CUBICTOdocs.oracle.com/javase/7/docs/api/java/awt/geom/…
  • 看看这个例子,也许这会给你一些想法82.157.70.109/mirrorbooks/javaexamples/…
  • 没有办法,您的Shape 实现必须将曲线转换为一系列直线、四边形或三次曲线。但是如果行足够短,那么逐点迭代没有区别。
  • @Holger 理论上可以重新定义或子类化一些底层渲染类,就像使用 Sound API 一样。

标签: java graphics java-2d bezier nurbs


【解决方案1】:

您无法真正扩展渲染引擎:您可以创建 Graphics/Graphics2D 子类,但您无法控制实例化,因此您无法强制绘图框架将您的子类传递给绘画方法。

您可以做的是创建 Shape 的 RationalShape 实现,该实现具有绘制您喜欢的任何东西的方法,并返回一个使用贝塞尔样条曲线近似它的 PathIterator。作为 Photoshop 等图形程序的用户,我发现使用 Bézier 样条曲线可以很好地逼近每条曲线,我不知道这种逼近背后的数学有多复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多