gpt4 book ai didi

java - 检测封闭贝塞尔曲线中的自交叉

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:58:16 25 4
gpt4 key购买 nike

我通过将三次贝塞尔曲线拼接在一起创建了一个“ 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, 0, 100, 0, 150, 50, 200, 100), true);
p.append(new CubicCurve2D.Double(200, 100, 200, 150, 150,0, 50, 100), true);
p.append(new CubicCurve2D.Double(100, 100, 100, 50, 50, 50, 0, 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 - 检测封闭贝塞尔曲线中的自交叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2139292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com