鼠标悬停在曲线上

时间:2010-12-10 13:58:38

标签: 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;
    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。

感觉这是一件微不足道的事情,但我无法弄清楚如何让它发挥作用。

请帮忙。

5 个答案:

答案 0 :(得分:3)

有两种合理的方法可以做到这一点。一种是在数学上计算出从鼠标点到曲线的距离。这不是一个简单的操作,并且涉及完全了解CubiCurve2D定义的曲线的数学定义,但考虑到您应该能够做到。

第二种方法是采用与OpenGl相同的方法并将曲线变暗(可能是屏幕外的位图),设置所有绘制的像素,然后找出鼠标所在的像素是否在那些像素上。您选择的可能是资源使用与开发人员复杂性的权衡。

答案 1 :(得分:3)

Graphics Gems (by Andrew Glassner)有一个最近点曲线问题的解决方案。您可以下载该书的source code,然后查看NearestPoint.c。我还找到了java translation的c代码,但不能保证它有效。此代码将帮助您从光标点找到曲线上的最近点。

一旦曲线上有最近的点,就可以使用Point2D#distance找到两点之间的距离,如果距离可以忽略不计,则光标点在曲线上。

答案 2 :(得分:0)

我会尝试手动计算鼠标光标和曲线之间的(最短)距离 - 尽管这是一项非平凡的计算。

答案 3 :(得分:0)

您可以将曲线分成许多短线(使用Bezier定义,您可以轻松地执行此操作),然后使用Line2D的方法“距离”计算鼠标指针到每条线的距离。当你知道距离的最小值时,你可以说,你的鼠标是否指向它。

答案 4 :(得分:0)

那么,您可以简单地检查鼠标坐标处(或附近)的像素是否为红色?如果情况变得更复杂,可能不是你在寻找什么。