首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >鼠标悬停在曲线上

鼠标悬停在曲线上
EN

Stack Overflow用户
提问于 2010-12-10 21:58:38
回答 5查看 624关注 0票数 3

有没有一种方法可以检查给定的点是否位于曲线上?我指的是曲线的笔划,不是它的边界。

下面是一个您可以运行的简单测试程序:

代码语言:javascript
运行
复制
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。

这感觉像是一件微不足道的事情,但我不知道如何才能让它工作。

请帮帮忙。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-10 23:29:55

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

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

票数 3
EN

Stack Overflow用户

发布于 2010-12-10 22:23:12

有两种合理的方法可以做到这一点。一种是用数学方法计算出鼠标指针到曲线的距离。这不是一个微不足道的操作,需要准确地知道由CubiCurve2D定义的曲线的数学定义,但前提是您应该能够做到这一点。

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

票数 3
EN

Stack Overflow用户

发布于 2010-12-10 22:14:42

我会尝试手动计算鼠标光标和曲线之间的(最短)距离--尽管这不是一个微不足道的计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4409491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档