2010-12-10 7 views
2

주어진 점이 곡선에 있는지 확인하는 방법이 있습니까? 나는 경계선이 아니라 커브의 선을 의미합니다. 마우스 그렇지 않으면 스트로크 (레드 라인)과 거짓을 초과하는 경우에만 나는 mouseMoved 인쇄 "true"를 원하는마우스 오버 커브

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(); 
    } 

} 

을 :

다음은 실행할 수있는 간단한 테스트 프로그램입니다.

그것은 할 수있는 사소한 것 같은 느낌,하지만 난 그것을 작동시킬 수있는 방법을 알아낼 수 없습니다.

도와주세요.

답변

3

Graphics Gems (by Andrew Glassner) 가장 가까운 점 온 커브 문제에 대한 해결책을 갖는다. 이 책에 대한 source code을 다운로드하고 NearestPoint.c을 살펴볼 수 있습니다. 또한 java translation의 C 코드를 찾았지만 제대로 작동하는지 보증 할 수 없습니다. 이 코드는 커서 점에서 곡선에 가장 가까운 점을 찾는 데 도움이됩니다.

곡선에 가장 가까운 점이 있으면 Point2D#distance을 사용하여 두 점 사이의 거리를 구할 수 있으며 거리가 미미할 경우 커서 점이 곡선에 나타납니다.

+0

감사합니다. 그것은 작동합니다! 코드에서 NullPointerException을 고쳐야했지만 누군가 초기화되지 않은 점의 setLocation을 시도했습니다 ... 개발자에게이 문제를 알리도록하겠습니다. – Artur

0

내가 수동으로 마우스 커서와 곡선 사이의 (짧은) 거리를 계산하려고 줄 - 비 사소한 계산하지만. 이 작업을 수행하는 두 합리적인 방법이

3

있습니다. 하나는 수학적으로 마우스 포인트에서 곡선까지의 거리를 계산하는 것입니다. 이는 사소한 연산이 아니며 CubiCurve2D에 의해 정의 된 커브의 수학적 정의를 정확히 알고 있어야하지만 사용자가이를 수행 할 수 있어야합니다.

두 번째 방법은 OpenGl이하는 것과 동일한 접근법을 사용하고 곡선을 어둡게하여 (가능한 경우 오프 스크린 비트 맵으로) 모든 그려진 픽셀을 설정 한 다음 마우스가있는 픽셀이 해당 픽셀에 있는지 확인하는 것입니다. 어떤 것을 택할 것인가는 사용 된 리소스와 개발자의 복잡성 사이의 균형입니다.

0

당신은 많은 짧은 선으로 곡선을 분할 할 수 있습니다 (베 지어 정의를 사용하여, 당신은 사소 그렇게 할 수), 다음 Line2D의 양쪽 모두의 방법 "거리"를 사용하여이 각 라인에 마우스 포인터의 거리를 계산한다. 그리고 그 거리의 최소값을 알게 될 때 마우스 포인터를 올려 놓을 지 말지를 말할 수 있습니다.

0

글쎄, 당신은 단순히의 픽셀 (또는 근처) 마우스 좌표 빨간색인지, 확인할 수 있습니다? 사건이 더 복잡해지면 아마도 당신이 찾고있는 것이 아닙니다.