WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Feststellen, wann Mauszeiger über einem bestimmten Punkt is

 

Christian85
Forum-Anfänger

Forum-Anfänger



Beiträge: 37
Anmeldedatum: 01.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 14:58     Titel: Feststellen, wann Mauszeiger über einem bestimmten Punkt is
  Antworten mit Zitat      
Moin!

Ich habe eine kleine Denkblockade - und zwar geht es darum, festzustellen, wann der Mauszeiger sich über einem bestimmten Punkt im Axes befindet.

Es geht dabei um einen geplotten Punkt mit "square"-Marker. Wenn sich die Maus im Square befindet, soll eine Variable von 0 auf 1 gesetzt werden.

Die Mausposition und die Position des Punktes lassen sich folgendermaßen ermitteln:
Code:

axes(handles.axes1);
hpunkt = plot(3,1,'blacks');
set(handles.axes1, 'Xlim', [0 6]);
set(handles.axes1, 'Ylim', [-1 3]);

mauspos = get(handles.axes1, 'CurrentPoint');
punktpos = [get(hpunkt, 'XData') get(hpunkt, 'YData')];
 


Der Abgleich müsste in der WindowButtonMotionFcn erfolgen
Code:

if [mauspos(1,1) mauspos(1,2)] == punktpos
display('hover');
end
 


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
Private Nachricht senden Benutzer-Profile anzeigen


dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 15:03     Titel:
  Antworten mit Zitat      
Hallo,

du kannst mit 'Units' als Achseneigenschaft dir auch die Pixelposition zurückgeben lassen. Oder dir die maximale Abweichung über die Limits ausdrücken.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Christian85
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 37
Anmeldedatum: 01.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 15:32     Titel:
  Antworten mit Zitat      
Hallo!

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 Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
Christian85
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 37
Anmeldedatum: 01.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 15:40     Titel:
  Antworten mit Zitat      
Ich bin jetzt gerade auf den Trichter gekommen, dass ganze über die 'ButtonDownFcn' des Squares zu lösen.

Also Square anklicken -> 'ButtonDownFcn' und 'WindowButtonDownFcn' springen an.
Maustaste loslassen -> 'WindowButtonUpFcn' springt an.

Das spart die Abfragerei - wenn alles klappt, poste ich morgen die Lösung. Very Happy

Bis dahin sind elegantere Vorschläge natürlich willkommen Wink

Gruß, Christian
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 18:04     Titel:
  Antworten mit Zitat      
Hallo,

hm. Tatsächlich. Naja, das mit ButtonDownFcn ist aber etwas anderes Razz

Egal.
Code:

ax = axes('Position',[0 0 1 1]);

[...]
% in der Callback-Funktion

set(ax,'Units','Pixels');
ax_dim = get(ax,'Position');
ax_xlim = get(ax,'XLim');
ax_ylim = get(ax,'YLim');

cp = get(gca,'CurrentPoint');
cp_px = [cp(1,1)*ax_dim(3)/diff(xlim) cp(1,2)*ax_dim(4)/diff(ylim)];
Sollte eigentlich auch definieren. Im Prinzip normalisieren ( /diff(xlim) ) und danach in Pixelkoordinaten umwandeln ( * ax_dim(3) ).

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Christian85
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 37
Anmeldedatum: 01.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2008, 14:00     Titel:
  Antworten mit Zitat      
Hallo!

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.

Also Punkt drucken und ButtonDownFcn definieren:
Code:

global hpunkt

axes(handles.axes1);
set(handles.axes1, 'XLim', [0,4]);
set(handles.axes1, 'YLim', [0,4]);

hpunkt = plot(2,2,'blacks');
set(hpunkt, 'ButtonDownFcn', @PunktButtonDownFcn);

function PunktButtonDownFcn(hObject, eventdata, handles)
global marker

marker = 1;
 


In der WindowButtonDownFcn überprüfen, ob der Klick auf den Punkt da ist - wenn ja, setze Punkt auf MauszeigerPosition
Code:

global marker
global hpunkt

if marker == 1
cp = get(handles.axes1, 'CurrentPoint');
set(hpunkt, 'XData', cp(1,1));
set(hpunkt, 'YData', cp(1,2));
end
 



Der Marker wird auf 0 gesetzt, wenn die Maustaste losgelassen wird - also in der WindowButtonUpFcn
Code:

global marker

marker = 0;
 


Etwas QuicknDirty, aber bei mir funktioniert das Prinzip ganz gut. Very Happy

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2008, 15:16     Titel:
  Antworten mit Zitat      
Christian85 hat Folgendes geschrieben:
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Christian85
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 37
Anmeldedatum: 01.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2008, 16:15     Titel:
  Antworten mit Zitat      
dib0r hat Folgendes geschrieben:
Christian85 hat Folgendes geschrieben:
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 Laughing

Der Nachteil bei meiner Variante ist halt, dass das "drüberschweben" nicht erfasst wird...
Private Nachricht senden Benutzer-Profile anzeigen
 
chris2.3sportline
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 09.03.09
Wohnort: ---
Version: R2009a
     Beitrag Verfasst am: 10.03.2009, 22:39     Titel:
  Antworten mit Zitat      
Hi,
sorry fürs rauskramen älterer themen.
ich bin ganz neu hier und ganz neu in MATLAB.

den code, der 3 beiträge weiter oben steht, verwende ich so ähnlich auch.
allerdings befinden sich bei mir einige punkte in den achsen.

hpunkt(1)
hpunkt(2)
..
hpunkt(i)

wie kann ich denn nun geschickt herausfinden, welcher punkt angeklickt wurde um diesen dann zu verschieben?

hat dazu jemand eine idee?

vielen dank schon einmal!
Private Nachricht senden Benutzer-Profile anzeigen
 
chris2.3sportline
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 09.03.09
Wohnort: ---
Version: R2009a
     Beitrag Verfasst am: 16.03.2009, 09:22     Titel:
  Antworten mit Zitat      
hmm, da hat wohl niemand eine idee.

oder muss ich die frage als neues thema stellen, damit sie gefunden und gelesen wird?

gruß
chris
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 19.03.2009, 10:49     Titel:
  Antworten mit Zitat      
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


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 19.03.2009, 15:18     Titel:
  Antworten mit Zitat      
chris2.3sportline hat Folgendes geschrieben:
hmm, da hat wohl niemand eine idee.

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...

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
chris2.3sportline
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 09.03.09
Wohnort: ---
Version: R2009a
     Beitrag Verfasst am: 20.03.2009, 13:42     Titel:
  Antworten mit Zitat      
Danke für deine Antwort.

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
ehpsg
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 20.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2011, 18:07     Titel:
  Antworten mit Zitat      
@chris2.3sportline

könntest du mal deinen code posten. ich muss einen spline durch 5-6 punkte legen und werd bald wahnsinnig
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.