有没有办法检查给定点是否位于曲线上?我的意思是曲线的笔画而不是它的边界。
这是一个可以运行的简单测试程序:
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。
感觉这是一件微不足道的事情,但我无法弄清楚如何让它发挥作用。
请帮忙。
答案 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)
那么,您可以简单地检查鼠标坐标处(或附近)的像素是否为红色?如果情况变得更复杂,可能不是你在寻找什么。