Мышь над кривой - PullRequest
       4

Мышь над кривой

3 голосов
/ 10 декабря 2010

Есть ли способ проверить, лежит ли данная точка на кривой? Я имею в виду штрих кривой, а не ее границы.

Вот простая тестовая программа, которую вы можете запустить:

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 ]

3 голосов
/ 10 декабря 2010

Graphics Gems (автор Andrew Glassner) имеет решение для задачи о ближайшей точке на кривой.Вы можете скачать исходный код для книги и взглянуть на NearestPoint.c.Я также нашел Java-перевод кода C, но не могу гарантировать, что он работает.Этот код поможет вам найти ближайшую точку на кривой от точки курсора.

Получив ближайшую точку на кривой, вы сможете найти расстояние между двумя точками, используя Point2D # distance и если расстояние пренебрежимо мало, точка курсора находится на кривой.

3 голосов
/ 10 декабря 2010

Есть два разумных способа сделать это.Одним из них является математическое определение расстояния от точки мыши до кривой.Это не тривиальная операция, и включает в себя точное знание математического определения кривой, определенной CubiCurve2D, но с учетом того, что вы должны быть в состоянии это сделать.

Второй - использовать тот же подход, что и OpenGl, ичтобы сделать кривую (возможно, за пределами растрового изображения), установив все нарисованные пиксели, а затем выяснить, находится ли пиксель, на котором находится мышь, на этих пикселях.То, что вы выберете, вероятно, является компромиссом между используемыми ресурсами и сложностью разработчика.

0 голосов
/ 10 декабря 2010

Ну, вы можете просто проверить, красный ли пиксель в (или около) координатах мыши? Вероятно, не то, что вы ищете, если дело становится более сложным.

0 голосов
/ 10 декабря 2010

Вы можете разбить свою кривую на множество коротких линий (используя определение Безье, вы можете сделать это тривиально), а затем вычислить расстояние от указателя мыши до каждой из этих линий, используя метод Line2D «расстояние».И когда вы узнаете минимум этих расстояний, вы сможете сказать, указатель мыши на нем или нет.

0 голосов
/ 10 декабря 2010

Я бы попытался вычислить (самое короткое) расстояние между курсором мыши и вашей кривой вручную, хотя это нетривиальный расчет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...