2010-08-11 2 views
3

수정 된 JPanel의 그래픽 컨텍스트에서 drawLine()을 사용하여 Clojure/Java의 기본 그래프 소프트웨어를 작성했습니다. 플롯 그 자체는 훌륭하게 작동하지만, 클릭 한 픽셀을 가장 가까운 데이터 포인트로 변환하려고 시도하는 중에 저는 어려움에 처했습니다.데이터에 픽셀 매핑

필자는 라인의 끝점과 실제 실제 데이터를 표시하는 모든 픽셀 목록 사이에 간단한 bijection을 사용합니다. 내 그래프 창에있는 모든 픽셀 (예 : 1200x600 픽셀)의 모든 픽셀을 내 픽셀 목록의 픽셀로 투영하여이를 실제 데이터 포인트로 사소한 매핑을 제공합니다.

<x,y>(px) ----> <~x,~y>(pixel points) ----> <x,y>(data) 

내가 지금 상상하고있어 같은 상황 :

  • 픽셀 메인 그래프 창에서 클릭하고, MouseListener를 해당 이벤트를 잡아 내게의 <x,y> 좌표를 제공한다 동작.

  • 이 정보는 전달 된 값이 "충분 함"인지 여부를 결정하는 조건부를 반환하는 함수로 전달되고 해당 pred와 함께 목록을 필터링하고 첫 번째 값을 가져옵니다.

    아마도
    • 대신 술어, 그것은 픽셀 포인트의 목록을 전달하는 기능을 반환하고 포인트 x의 크기와 얼마나 잘 나타내는 튜플 (x index)의 목록을 반환, 어디 그 점은 index입니다. 나는 x 점과 y 점 모두로 이것을 할 것입니다. 그런 다음 필터링하여 max x가있는 필터를 찾아서 사용자가 의도 한 것일 확률이 가장 높은 점을 취합니다.

이러한 문제에 대한 합리적인 해결책이 있습니까? 신뢰도 (pix-pt로부터의 거리, 아마도)가 포함 된 솔루션은 너무 무거운 프로세서 일 수도 있고, 메모리의 모든 포인트를 다시 지탱한다면 무거운 비트 메모리 일 수도 있습니다. 술어 만 사용하는 다른 해결책은 항상 정확할 것 같지 않습니다.

다른 그래픽 라이브러리에서 보여 주었 듯이 이것은 으로 해결되었습니다. 그러나 일부 프로그램 소스 이외의 정보를 찾기가 어렵습니다. 더 좋은 방법을 찾아야합니다. 이것을 찾아내는 수천 줄의 자바.

가능한 경우 제공하신 솔루션에 대한 더 나은 솔루션 또는 일반적인 포인터와 조언을 찾고 있습니다.

답변

1

그래서 나는 JFreeChart과 같은 것을 추측하고 있습니다. 앱을 위해 자르지 않았습니까? 아직 그 길을 내려 가지 않았다면, 나는 너의 것을 굴리려고 시도하기 전에 그것을 조사 할 것을 제안 할 것이다.

어쨌든 마우스 이벤트에 가장 가까운 지점을 찾고있는 경우 최소 문단이 Euclidean distance (임계 값 미만인 경우)을 가져 와서 제시하면 사용자에게 가장 예측 가능한 동작을 제공합니다. 단점은 큰 데이터 세트의 경우 유클리드 거리가 상대적으로 느리다는 것입니다. 제곱근을 무시하는 것과 같은 속임수 또는 BSP trees을 사용하여 약간 속도를 높일 수 있습니다. 그러나 이러한 최적화가 필요한 경우 실제로 작업하는 데이터 요소의 수에 따라 달라집니다. 최적화 모드로 들어가기 전에 다소 일반적인 해결책을 제시하십시오.

+0

JFreeChart는 내가 처리하지 않은 복잡한 레이어를 추가 한 것이지만, 대부분은 너무 느렸다. 나는 수천 개의 포인트를 여러 번 다시 그려 넣고있다. 유클리드 거리가 의미가 있습니다. 그것은 본질적으로 제가 지금하고있는 것입니다 만, 그것을 sqrt (sq xdiff) (sq ydiff) 메쏘드로 바꾸면 도움이됩니다. 고맙습니다! – Isaac

+0

@Isaac : 와우. 그래서 실제로 모든 포인트를 여러 번 다시 그려 넣고 있습니까? 가속화 곡면을 아직 사용하지 않은 채로 사용하는 것이 가치가 있습니다. 또한 수천 점을 찾고 대화식 응답을 원한다면 BSP 나무와 같은 공간 최적화가 필요합니다. 그것은 또한 쓸데없는 큰 실수가 될 것입니다. BSP는 비교적 잘 병렬 처리합니다. 솔루션을 자세히 검토하면서 계속 업데이트 해주십시오. 나는 네가 끝내는 것에 관심이있다. –

+0

팁을 주셔서 감사합니다. 표면을 가속하십시오. 나는 드로잉 속도를 높이려고 할 때, 그걸 보일지도 모른다. 지금 당장은 문제가되지 않습니다. 나는 일반적으로 초당 수천 개 이상의 포인트를 다시 그려 내지 않으며, 그다지 다루기가 어렵지 않습니다. 위키 피 디아 (Wikipedia) 기사에서 BSP에 관해서는 특히 적용할만한 것 같지 않습니다. 아마도 뭔가를 놓친 것입니까? – Isaac

0

나는 당신의 접근 방식이 적절하다고 생각합니다. 이것은 기본적으로 데이터 배열을 통해 하나의 반복 만 필요합니다. 각 단계마다 약간의 수학과 할당이 필요하지 않으므로 매우 빨라야합니다.

quadtree와 같은 공간 파티셔닝 스키마를 사용하기 시작하지 않으면 데이터 배열이 매우 큰 경우에만 유용 할 것입니다. 도움이 될 수

일부의 Clojure 코드 :

(defn squared-distance [x y point] 
    (let [dx (- x (.x point)) 
     dy (- y (.y point))] 
    (+ (* dx dx) (* dy dy)))) 

(defn closest 
    ([x y points] 
    (let [v (first points)] 
     (closest x y (rest points) (squared-distance x y v) v))) 
    ([x y points bestdist best] 
    (if (empty? points) 
     best 
     (let [v (first points) 
      dist (squared-distance x y v)] 
     (if (< dist bestdist) 
      (recur x y (rest points) dist v) 
      (recur x y (rest points) bestdist best)))))) 
+0

고마워요! 이 경우에는 거리가 너무 잘 작동하지 않습니다. 그러나 공간적 파티션이 보일지도 모릅니다. – Isaac