我通过一起修补立方贝塞尔曲线创建了一个“blob”形状(下面的截图).我想能够检测到曲线已经横过本身或另一条曲线的情况,并且想知道是否有推荐的方法或已知的算法来执行此操作?
有一个想法是使用FlatteningPathIterator将形状分解为直线段,然后检测给定的段是否与另一段交叉,但是我是否有更好的方法(因为这将具有二次性能)感兴趣.如果我追求这种方法是在Java中的库函数来检测两个线段是否重叠?
谢谢.
没有交叉
No Crossover http://www.freeimagehosting.net/uploads/7ad585414d.png
交叉
Crossover http://www.freeimagehosting.net/uploads/823748f8bb.png
解决方法
我实际上找到了一个使用内置Java2D功能的工作解决方案,并且非常快速…
只需在曲线中创建一个Path2D,然后在Path2D中创建一个区域,并调用Area.isSingular()方法;
它工作…看到这个小例子.
import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Area; import java.awt.geom.CubicCurve2D; import java.awt.geom.Path2D; import javax.swing.JFrame; import javax.swing.JPanel; public class Test { @SuppressWarnings("serial") public static void main(String[] args) { JFrame f = new JFrame("Test"); JPanel c = new JPanel() { Area a; Path2D p; { p = new Path2D.Double(); p.append(new CubicCurve2D.Double(0,100,150,50,200,100),true); p.append(new CubicCurve2D.Double(200,true); p.append(new CubicCurve2D.Double(100,0),true); a = new Area(p); setPreferredSize(new Dimension(300,300)); } @Override protected void paintComponent(Graphics g) { g.setColor(Color.black); ((Graphics2D)g).fill(p); System.out.println(a.isSingular()); } }; f.setContentPane(c); f.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); } }