java – 在封闭的贝塞尔曲线中检测自我交叉

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

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...