3

drawLine()変更されたJPanelのグラフィックスコンテキストを使用して、Clojure/Javaでいくつかの基本的なグラフ作成ソフトウェアを作成しました。プロット自体はうまく機能していますが、クリックしたピクセルを最も近いデータポイントに変換しようとすると、行き詰まりになりました。

線の終点を示すすべてのピクセルのリストと実際の生データの間に単純な全単射があります。必要なのは、グラフウィンドウのすべてのピクセル(たとえば、1200x600 px 2)からピクセルリスト内のピクセルへの全射であり、それから実際のデータポイントへの簡単なマッピングが得られます。

例えば

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

これは私が今想像している状況です:

  • メイングラフウィンドウでピクセルがクリックされると、MouseListenerがそのイベントをキャッチし<x,y>、アクションの座標を教えてくれます。

  • その情報は、渡された値が「十分に良い」かどうかを判断する述語を返す関数に渡され、その述語でリストをフィルタリングして、最初の値を取得します。

    • おそらく、述語の代わりに、ピクセルポイントのリストが渡される関数を返し、(x index)ポイントがの大きさでどれだけ優れているかx、およびそのポイントが。でどこにあるかを示すタプルのリストを返しますindex。これは、xポイントとyポイントの両方で行います。次に、それをフィルタリングして、最大xを持つものを見つけ、その1つを、ユーザーが意図したものである可能性が最も高いポイントと見なします。

この問題に対するこれらの合理的な解決策はありますか?信頼性評価(おそらくpix-ptからの距離)を含むソリューションは、プロセッサが多すぎる可能性があり、すべてのポイントをメモリに再度保持すると、メモリが少し重くなる可能性があります。述語だけを使用する他の解決策は、常に正確であるとは限らないようです。

他のグラフライブラリが示しているように、これは解決された問題ですが、これらのプログラムのいくつかのソース以外でそれに関する情報を見つけるのは困難であり、Javaの数千行を掘り下げるよりも良い方法が必要ですこれを見つけるために。

私はより良い解決策、または可能であれば私が提供したものに関する一般的な指針とアドバイスを探しています。

4

2 に答える 2

1

だから私はJFreeChartのようなものがあなたのアプリのためにそれをカットしていなかったと思いますか?あなたがまだその道を進んでいないのなら、私はあなた自身を転がそうとする前にそれをチェックすることを提案するでしょう。

とにかく、マウスイベントに最も近いポイントを探している場合は、ユークリッド距離が最小のポイントを取得し(しきい値を下回っている場合)、それを提示すると、ユーザーにとって最も予測可能な動作が得られます。欠点は、大きなデータセットではユークリッド距離が比較的遅いことです。平方根やBSPツリーを無視するなどのトリックを使用して、少し高速化できます。ただし、これらの最適化が必要かどうかは、実際に使用しているデータポイントの数によって異なります。最適化モードに入る前に、一般的なケースでややナイーブなソリューションをプロファイリングします。

于 2010-08-11T13:57:23.140 に答える
0

あなたのアプローチはまともだと思います。これは基本的に、データ配列を1回繰り返すだけで、少し簡単な計算が必要で、各ステップでの割り当てがないため、非常に高速である必要があります。

四分木などの何らかの形式の空間分割スキームを使い始めない限り、これはおそらく得られるものと同じくらい良いでしょう。これは、データ配列が非常に大きい場合にのみ実際に意味があります。

役立つ可能性のある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))))))
于 2010-08-11T15:03:34.347 に答える