有没有一种方法可以检查给定的点是否位于曲线上?我指的是曲线的笔划,不是它的边界。
下面是一个您可以运行的简单测试程序:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.JFrame;
public class Test extends Canvas implements MouseMotionListener {
private JFrame frame;
private CubicCurve2D curve;
private static final int OFFSET = 1000;
public Test() {
frame = new JFrame();
addMouseMotionListener(this);
setPreferredSize(new Dimension(800, 600));
setBackground(Color.WHITE);
frame.add(this);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
curve = new CubicCurve2D.Double(10, 100, 700, -500
+ Math.random() * OFFSET, -500 + Math.random() * OFFSET, 700,
590, 500);
g2.setPaint(Color.RED);
g2.setStroke(new BasicStroke(2));
g2.draw(curve);
g2.setPaint(Color.lightGray);
g2.fill(curve);
}
@Override
public void mouseMoved(MouseEvent e) {
System.out.println(curve.contains(e.getX(), e.getY()));
}
@Override
public void mouseDragged(MouseEvent e) {}
public static void main(String[] args) {
new Test();
}
}我希望mouseMoved仅当鼠标在笔划(红线)上时打印"true“,否则打印false。
这感觉像是一件微不足道的事情,但我不知道如何才能让它工作。
请帮帮忙。
发布于 2010-12-10 23:29:55
对于曲线上最近点问题,Graphics Gems (by Andrew Glassner)有一个解决方案。您可以下载该书的source code并查看NearestPoint.c。我还找到了一个c代码的java translation,但不能保证它能正常工作。此代码将帮助您找到曲线上距光标点最近的点。
在曲线上找到最近的点后,可以使用Point2D#distance找到两点之间的距离,如果该距离可以忽略不计,则光标点位于曲线上。
发布于 2010-12-10 22:23:12
有两种合理的方法可以做到这一点。一种是用数学方法计算出鼠标指针到曲线的距离。这不是一个微不足道的操作,需要准确地知道由CubiCurve2D定义的曲线的数学定义,但前提是您应该能够做到这一点。
第二种方法是采用与OpenGl相同的方法,修改曲线(可能是屏幕外的位图),设置所有绘制的像素,然后找出鼠标所在的像素是否在这些像素中。您所选择的可能是所使用的资源与开发人员复杂性之间的权衡。
发布于 2010-12-10 22:14:42
我会尝试手动计算鼠标光标和曲线之间的(最短)距离--尽管这不是一个微不足道的计算。
https://stackoverflow.com/questions/4409491
复制相似问题