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

前端之家收集整理的这篇文章主要介绍了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);
}
}

猜你在找的Java相关文章