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 中创建形状联合的方法是什么?是否有一些库或方法可以帮助实现这个看似简单的操作?
您可以尝试创建一个java.awt.geom.Path2D(Path2D.Float或Path2D.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)
| 归档时间: |
|
| 查看次数: |
1647 次 |
| 最近记录: |