Java 鼠标悬停在曲线上
有没有办法检查给定点是否位于曲线上?我指的是曲线的笔划,不是它的边界 下面是一个可以运行的简单测试程序:Java 鼠标悬停在曲线上,java,graphics,Java,Graphics,有没有办法检查给定点是否位于曲线上?我指的是曲线的笔划,不是它的边界 下面是一个可以运行的简单测试程序: 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; pr
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”
这感觉像是一件小事,但我不知道如何才能让它发挥作用
请提供帮助。我会尝试手动计算鼠标光标和曲线之间的(最短)距离-尽管这是一个非常简单的计算。有两种合理的方法可以做到这一点。一种是通过数学计算出鼠标点到曲线的距离。这不是一个简单的操作,它涉及到准确地知道CubiCurve2D定义的曲线的数学定义,但是假设您应该能够做到这一点
第二种方法是采用OpenGl所采用的方法,对曲线(可能是屏幕外位图)进行涂色,设置所有绘制的像素,然后确定鼠标所在的像素是否位于这些像素的eof上。您所选择的可能是所用资源与开发人员复杂性之间的折衷。您可以将曲线分割为许多短线(使用贝塞尔定义,您可以轻松地完成这项工作),然后使用Line2D的“距离”方法计算从鼠标指针到每条线的距离。当你知道最小距离时,你就可以说,你的鼠标指针是否在上面。好吧,你可以简单地检查一下,鼠标坐标处(或附近)的像素是否是红色的?如果情况变得更复杂,可能不是您想要的。有一个解决曲线上最近点问题的方法。您可以下载这本书的,并查看
NearestPoint.c
。我还发现了一些c代码,但不能保证它能正常工作。此代码将帮助您找到曲线上距离光标点最近的点
一旦在曲线上找到最近的点,就可以使用查找两点之间的距离,如果距离可以忽略不计,则光标点位于曲线上。非常感谢!它起作用了!虽然我必须修复NullPointerException,因为在代码中有人试图设置未初始化点的位置。。。我会让开发者知道这个问题。