Das Problem:
Die Punkte müssen exakt gleich sein, damit die "Maus über Punkt" Situation erkannt wird. Eine Lösung wäre, einen Bereich um den Punkt zu definieren.
Die Maus- und Bereichskoordinaten ändern sich jedoch mit dem Maßstab des Axes, was dazu führt, dass der Bereich mit größer werdendem Maßstab zu klein zum Anklicken wird und zu groß, falls der Maßstab kleiner wird
Dazu kommt die Schwierigkeit, dass eine der Achsen auch logarithmisch werden kann...
Gibt es vielleicht einen automatismus für dieses Problem?
Gruß, Christian
Zuletzt bearbeitet von Christian85 am 11.11.2008, 15:24, insgesamt einmal bearbeitet
du kannst mit 'Units' als Achseneigenschaft dir auch die Pixelposition zurückgeben lassen. Oder dir die maximale Abweichung über die Limits ausdrücken.
Leider wirkt sich set(handles.axes1, 'Units', 'Pixels') nur auf das Ergebnis von get(handles.axes1, 'Position') aus. 'CurrentPoint' gibt weiterhin unbeeinflusst die Mausposition in Achskoordinaten aus.
Das Problem wäre übrigens garkeines, wenn jedes Objekt, genauso wie das Hauptfenster, eine WindowButtonUpFcn und eine WindowButtonDownFcn besitzen würde
Die Idee von dib0r ist gut, funktioniert aber leider nur bei linearer Achseinteilung, deshalb habe ich versucht, irgendwie drumherum zu kommen.
Wenn es einem nur auf den Klick auf den Punkt ankommt (zum Beispiel um ihn zu verschieben), reicht es tatsächlich, für den Punkt eine ButtonDownFcn zu generieren die eine Art Marker an die WindowButtonMotionFcn übergibt. Aufgehoben wird der marker dann wieder von der Window_ButtonUpFcn.
Etwas QuicknDirty, aber bei mir funktioniert das Prinzip ganz gut.
Gruß, Christian
Ps: der Vorteil:
Der "anklickbare Bereich" bleibt immer gleich groß. So umgehe ich es, einen Bereich in Achskoordinaten definieren zu müssen, was spätestens bei nichtlinearer Achsteilung sehr schwierig wird.
Die Idee von dib0r ist gut, funktioniert aber leider nur bei linearer Achseinteilung
Hm... stimmt leider. Hab ich gar nicht berücksichtigt. Man könnt ja noch da was machen, wird dann aber so langsam unübersichtlich.
MfG
Stimmt irgendwie - ich hatte das eine Zeit lang so versucht und war relativ frustriert, wie sehr man sich dafür strecken muss und MatLab zeichnet ungerührt Quadrate in die wildeste Achseinteilung
Der Nachteil bei meiner Variante ist halt, dass das "drüberschweben" nicht erfasst wird...
ich habe jetzt nicht den ganzen Thread gelesen, sondern nur Deine Frage:
Du hast also ein Haufen von Punkten und möchtest bei einem Klick herausfinden welcher Punkt angeklickt wurde.
Du hast 2 Möglichkeiten um es zu realisieren.
1. Jeder Punkt wird einzeln geplotet, bekommt also auch eigenen Handle. Du vergibst jedem(!) Punkt, den Du zeichnest, eine "ButtonDownFcn".
Im Callback kannst Du abfragen von welchem Objekt der Callback kommt und geziehlt seine Position auslesen.
+ Sehr einfach und schnell
- Verbraucht Ressourcen, wenn mehrere Hundert Punkte erzeugt werden sollen.
2. Du plottest alle Punkte gleichzeitig und vergibst den einem Handle die ButtonDownFcn. Im Callback fragst Du die Koordinaten der Maus ab und berechnest den Abstand von der aktuellen Mausposition zu allen Punkten. Suchst nach dem Minimum und bestimmst daraus die Koordinaten von dem Punkt, der dem Klick am nähesten sich befindet.
+ ebenfalls schnell
+ verbraucht wenig Ressourcen
- nur bisschen aufwendiger, als die 1 Variante
oder muss ich die frage als neues thema stellen, damit sie gefunden und gelesen wird?
gruß
chris
Im Falle, wenn ein Thread bereits auf "beantwortet" gesetzt wurde, wäre besser einen neuen Thread zu öffnen. Falls notwendig, kannst Du den alten Thread über ein Link erwähnen...
ich hatte es inzischen durch viel Ausprobieren auch zum ersten deiner Vorschläge geschafft.
Funktioniert gut. Bei mir dürften maximal 20-30 Punkte erzeugt werden. Also ich denke ich bleibe dabei.
könntest du mal deinen code posten. ich muss einen spline durch 5-6 punkte legen und werd bald wahnsinnig
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.