我通过一起修补立方贝塞尔曲线创建了一个“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);
}
}