ピクセルをデータにマッピングします
質問
Clojure/Javaでいくつかの基本的なグラフ化ソフトウェアを書きました drawLine()
修正されたjPanelのグラフィックコンテキストについて。プロット自体はうまく機能していますが、クリックしたピクセルを最も近いデータポイントに変換しようとしている間、私は行き詰まりになりました。
すべてのピクセルのリストの間に、ラインのエンドポイントをマークするすべてのピクセルのリストと実際の生データの間に単純なバイジェンスがあります。私が必要なのは、すべてのピクセルからの抑制です(たとえば、1200x600 px2)私のグラフウィンドウのピクセルリストのピクセルへのウィンドウのため、実際のデータポイントへの些細なマッピングを提供します。
例えば
<x,y>(px) ----> <~x,~y>(pixel points) ----> <x,y>(data)
これは私が今それを想像しているような状況です:
メイングラフウィンドウでピクセルがクリックされ、Mouselistenerがそのイベントをキャッチし、
<x,y>
アクションの座標。その情報は、それに渡された値が「十分に良い」かどうかを決定する述語を返す関数に渡され、そのPredでリストをフィルタリングし、最初の値をOKESにします。
- おそらく、述語の代わりに、ピクセルポイントのリストに渡され、タプルのリストを返す関数を返します
(x index)
これは、ポイントがどれほど良いかを示していますx
, 、そしてその点がどこにあるのかindex
. 。 XポイントとYポイントの両方でこれを行います。それから私はそれをフィルタリングして、最大xのあるものを見つけ、それをユーザーが意味するものである可能性が最も高いポイントと見なします。
- おそらく、述語の代わりに、ピクセルポイントのリストに渡され、タプルのリストを返す関数を返します
この問題に対するこれらの合理的な解決策はありますか?信頼評価(PIX-PTからの距離)を含むソリューションは、プロセッサが重すぎて、メモリ内のすべてのポイントを再び保持している場合、少しメモリが重いようです。述語のみを使用する他のソリューションは、常に正確であるとは思われません。
これは 解決した 問題、他のグラフライブラリが示しているように、これらのプログラムのいくつかのソース以外の情報を見つけるのは難しいです。そして、これを見つけるために何千ものJavaを掘り下げるより良い方法が必要です。
可能であれば、より良いソリューション、または私が提供したものに関する一般的なポインターとアドバイスを探しています。
解決
だから私はようなものを推測しています jfreechart あなたのアプリのためにそれをカットしていませんでしたか?あなたがまだその道を下っていないなら、私はあなた自身の道を転がそうとする前にそれをチェックアウトすることをお勧めします。
とにかく、マウスイベントに最も近いポイントを探しているなら、最小値でポイントを取得します ユークリッド距離 (それが何らかのしきい値を下回っている場合)およびそれを提示することは、ユーザーにとって最も予測可能な動作を与えます。欠点は、ユークリッドの距離が大規模なデータセットでは比較的遅いことです。平方根を無視したり、 BSPツリー 少しスピードアップします。しかし、それらの最適化が必要でさえある場合、実際に作業しているデータポイントの数に依存します。最適化モードに入る前に、典型的なケースでやや素朴なソリューションをプロファイルします。
他のヒント
あなたのアプローチはまともだと思います。これは基本的に、データアレイを介した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))))))