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,因为在代码中有人试图设置未初始化点的位置。。。我会让开发者知道这个问题。