Java中形状的快速结合

时间:2014-02-03 02:54:31

标签: java geometry union 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中创建形状联合的方法是什么?是否有一些图书馆或方法可以帮助实现这一点 - 看似简单的操作?

1 个答案:

答案 0 :(得分:3)

您可以尝试创建java.awt.geom.Path2DPath2D.FloatPath2D.Double),将形状附加到其中,然后使用该路径创建区域。
这种方式比向区域添加形状快得多,但我不能100%确定结果是否完全相同。
类似的东西:

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