我正在开发一个用于提取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中创建形状联合的方法是什么,而不会带来这种疯狂的性能损失?有没有一些库或方法可以帮助这个看似简单的操作的执行?
发布于 2014-02-19 02:01:27
您可以尝试创建一个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);https://stackoverflow.com/questions/21519007
复制相似问题