Frage

mit drawLine() auf dem Grafikkontext eines modifizierten JPanel

Ich habe einige grundlegende Grafik-Software in Clojure / Java geschrieben. Das Plotten selbst funktioniert gut, aber ich bin gekommen, in eine Sackgasse, während zu versuchen, einen klickten Pixel zum nächsten Datenpunkt zu konvertieren.

Ich habe eine einfache Bijektion zwischen der Liste aller Pixel, die Marke Endpunkte meine Zeilen und meine tatsächlichen Rohdaten. Was ich brauche, ist ein Surjektion von allen Pixeln (etwa 1200x600 Pixel 2 ) meines Grafikfensters auf die Pixel in meiner Pixelliste, mir eine triviale Mapping aus, dass zu meinen eigentlichen Datenpunkten geben.

z.

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

Das ist die Situation, wie ich es jetzt stelle mir vor:

  • Ein Pixel wird in dem Hauptgrafikfenster geklickt, und das Mouselistener fängt das Ereignis und gibt mir die <x,y> Koordinaten der Aktion.

  • wird diese Information an eine Funktion übergeben, dass die Rendite ein Prädikat, das, ob ein Wert an sie übergeben bestimmt ist „gut genug“, und Filter, obwohl die Liste mit, dass pred und den ersten Wert nehmen es okays.

    • Möglicherweise anstelle eines Prädikats, gibt es eine Funktion, die die Liste der Pixelpunkte übergeben wird, und gibt eine Liste von Tupeln (x index), die anzeigen, wie gut der Punkt mit der Größe von x ist, und wo dieser Punkt mit index. Ich würde dies tun beide mit den x Punkte und die y Punkte. Ich habe dann Filter aber, dass und das mit dem max x finden, und nehmen, dass man den Punkt zu sein, die höchstwahrscheinlich derjenige der Benutzer gemeint sein soll.

Sind diese vernünftigen Lösungen für dieses Problem? Es scheint, dass die Lösung, die das Vertrauen ratings (Entfernung von pix-pt, vielleicht) beinhaltet auch Prozessor schwer sein kann, und ein bisschen Speicher schwer, wenn ich wieder alle Punkte im Speicher bin halten. Die andere Lösung, nur mit dem Prädikat, scheint nicht, wie es immer genau sein würde.

Dies ist ein gelöst Problem, da andere Grafikbibliotheken haben gezeigt, aber es ist schwer, Informationen über sie finden andere als in der Quelle für einige dieser Programme, und es muss einen besseren Weg geben dann durch die tausende von Zeilen von Java zu graben, das herauszufinden.

Ich bin für bessere Lösungen suchen, oder einfach nur allgemeine Hinweise und Ratschläge auf die, die ich angeboten habe, wenn möglich.

War es hilfreich?

Lösung

So vermute ich so etwas wie JFreeChart einfach nicht war es für Ihre Anwendung schneiden? Wenn Sie diesen Weg noch nicht gegangen sind, würde ich es vorschlagen, Check-out, bevor Sie Ihre eigene Rolle.

Wie auch immer, wenn Sie die Suche nach dem nächsten Punkt auf ein Mausereignis, immer den Punkt mit dem minimalen euklidischen Abstand (wenn sie unter einem gewissen Schwellenwert ist) und die meisten vorhersagbares Verhalten für den Benutzer, dass präsentiert geben. Der Nachteil ist, dass die euklidische Abstand ist relativ langsam für große Datenmengen. Sie können Tricks wie die Quadratwurzel zu ignorieren oder BSP Bäume es ein wenig zu beschleunigen. Aber wenn diese Optimierungen sogar notwendig sind, hängt davon ab, wie viele Datenpunkte mit dem Sie arbeiten. Profil eine etwas naive Lösung in einem typischen Fall, bevor sie in Optimierungsmodus gehen.

Andere Tipps

Ich denke, Ihr Ansatz ist anständig. Diese im Grunde erfordert nur eine Iteration durch Ihre Datenarray, ein wenig einfache Mathematik und keine Zuweisungen bei jedem Schritt so sollten sehr schnell sein.

Es ist wahrscheinlich so gut wie Sie sich erhalten, wenn Sie mit irgendeiner Form von räumlichem Partitionierungsschema wie ein Quadtree beginnen, die nur dann wirklich Sinn machen würden, wenn Ihre Daten Array sehr groß ist.

Einige Clojure Code, der helfen kann:

(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))))))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top