Java中形状的快速联合

Nic*_*uun 5 java union geometry shape

我正在开发一个用于提取 SVG 图像轮廓的库。在 Java 中使用 Batik 使将 SVG 文件转换为扩展形状(java.awt.geom.Shape实例)的过程变得非常有趣——对于相对复杂的形状,我们在毫秒级进行此操作。但是,由于我需要一个组合轮廓,我java.awt.geom.Area使用.add(shape). 出乎意料的是,即使对于相对简单的形状,这也非常慢。“令人难以置信”是指在 36 秒内将 8 个形状加在一起,每个形状 6-10 个点。

运行的代码-Xrunhprof提示,大多数的时间都花在java.awt.geom.AreaOp.pruneEdges(..)java.lang.StrictMath.acos是最大的罪魁祸首。将替代实现 ( AreaX) 与结合FastMath仅产生微不足道的改进,而我对处理任意几何形状的 Java 库的搜索却是空洞的。

那么问题是,在没有这种疯狂的性能损失的情况下,在 Java 中创建形状联合的方法是什么?是否有一些库或方法可以帮助实现这个看似简单的操作?

fon*_*kap 5

您可以尝试创建一个java.awt.geom.Path2D(Path2D.FloatPath2D.Double),将您的形状附加到它并使用该路径创建一个区域。
这种方式比向区域添加形状要快得多,但我不能 100% 确定结果是否完全相同。
就像是:

            List<Shape> shapes = ....
            Path2D path = new Path2D.Float();
            for (Shape shape : shapes) {
              path.append(shape, false);
            }
            Area compound = new Area(path);
Run Code Online (Sandbox Code Playgroud)