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

Bilddarstellung per Mausklick ändern

 

LoKiaK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2016, 00:28     Titel: Bilddarstellung per Mausklick ändern
  Antworten mit Zitat      
Hallo,
ich bin noch neu in der GUI-Programmierung, und könnte an folgender Stelle Hilfe gebrauchen: ich habe vier NxN-Matrizen, die ich graphisch einzeln ausgebe über

Code:

new=mat2gray(abs(Matrix X));        
imshow(new);


Es wäre praktisch, wenn ich mich einfach zwischen den vier Ausgaben durchklicken könnte, wenn also der Fensterinhalt wechselt, wenn ich in das Fenster klicke (vllt sogar vor und zurück mit der linken und rechten Maustaste).

Für Ratschläge wäre ich dankbar.
Gruß


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.12.2016, 01:33     Titel: Re: Bilddarstellung per Mausklick ändern
  Antworten mit Zitat      
Hallo LoKiaK,

Du kannst die WindowButonDownFcn der figure dafür verwenden. Die dort definierte Funktion wird bei einem Mausklick in die Figre aufgerufen. Das Image-Objekt selbst hat auch eine ButtonDownFcn.

Entweder Du erstellst 4 Images und holst per uistack das jeweilige nach vorne. Oder Du erstellst nur ein Image-Objekt und speicherst die 4 Bilder in den UserData oder per guidata in der Figure. Dann setzt Du nur die 'CData'-Eigenschaft des Image-Objekts bei den Maus-Klicks.

Suche nach diesen Stichworten im Netz und probiere es mal aus. Es tauchen sicherlich noch mehr konkrete Fragen auf, die Du hier dann ja gerne wieder stellen kannst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
LoKiaK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2016, 12:30     Titel: Re: Re: Bilddarstellung per Mausklick ändern
  Antworten mit Zitat      
Hi Jan,
danke für Deine Hilfe.
Ich habe in einem 1sten Schritt folgendes versucht:

main.m
Code:

X1=rand(N,N);
h=imagesc(X1);
colormap(gray);
set(gcf, 'WindowButtonDownFcn', @myfun);
 


function myfun
Code:

function myfun(h, e)
disp('click!')
N = 10;
X=rand(N,N);
set(h,'CData',X);
 


Wenn ich in der main.m über CData den Inhalt neu setze ist das kein Problem, mit der Funktion klappt das aber noch nicht. Ich hätte gedacht, dass sich in h das handle auf das image befindet, sodass ich über die set-Funktion den Inhalt austauschen kann. Funktioniert aber nicht. Mal schaun woran es hapert.

Was wird überhaupt mit 'e' übergeben?

Gruß
 
LoKiaK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2016, 13:35     Titel: Nachtrag Re: Re: Bilddarstellung per Mausklick ändern
  Antworten mit Zitat      
So funktioniert es:
Code:

function myfun(hh, e)
disp('click!')

N = 10;
X=rand(N,N);

u=get(hh,'Child');  %-> axes
uu=get(u,'Child'); %-> image
set(uu,'CData',X);
 


Warum ist mir noch nicht klar, das ist jetzt das Ergebnis intuitiven Rumprobierens, aber nun gut.
Gruß
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.12.2016, 14:44     Titel: Re: Re: Bilddarstellung per Mausklick ändern
  Antworten mit Zitat      
Hallo LoKiaK,

Es ist hoffnungsfroh anzunehmen, dass der erste Handle schon das AXES-Objekt sein wird. Sicherer und flexibeler ist es, das auch explizit auszuschreiben.

Code:
FigureH = figure;

X1=rand(N,N);
ImageH = imagesc(X1);
colormap(gray);
set(FigureH, 'WindowButtonDownFcn', {@myfun, ImageH});
 


Code:
function myfun(ObjectH, EventData, ImageH)
disp('click!')
N = 10;
X=rand(N,N);
set(ImageH, 'CData', X);

Der erste Input eines event-Callbacks ist immer das Objekt, welches das Event ausgelöst hat, hier ist ObjectH also die Figure, nicht das Image. Deshalb habe ich hier das Image einfach als 3. Input mit übergeben.

Alternative:
Code:
handles.FigureH = figure;
X1=rand(N,N);
Handles.ImageH = imagesc(X1);
colormap(gray);
set(FigureH, 'WindowButtonDownFcn', @myfun);
guidata(FigureH, handles);

function myfun(ObjectH, EventData)
handles = guidata(ObjectH);
...
set(handles.ImageH, 'CData', X);


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
LoKiaK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2016, 20:46     Titel: Re: Re: Re: Bilddarstellung per Mausklick ändern
  Antworten mit Zitat      
Hallo Jan,
danke für Deine Hilfe. Ich verstehe noch nicht ganz die Verknüpfung von figure und image. Ich hätte gedacht, dass wenn ich eine image-Instanz erzeuge, dass ich damit automatisch eine figure bekomme. Wofür benötige ich "zusätzlich" noch das figure-Objekt?
Wenn ich Deine Alternative blind übernehme bekomme ich eine Fehlermeldung, folgendes funktioniert:
Code:

X1=rand(N,N);
handles.FigureH = figure;
handles.ImageH = imagesc(X1);
colormap(gray);
set(handles.FigureH, 'WindowButtonDownFcn', @myfun);
guidata(handles.FigureH, handles);
 

Ist das so in Deinem Sinne?
Gruß
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.12.2016, 11:51     Titel: Re: Re: Re: Bilddarstellung per Mausklick ändern
  Antworten mit Zitat      
Hallo LoKiaK,

Ja, ich hatte einen Tippfehler : "Handles" statt "handles".
Wann immer Du einen Fehler erwähnst im Forum, post die vollständige Fehlermeldung dazu.

Wenn man image or plot eingibt, wird automatisch ein AXESD-Objekt dazu erzeugt. Ein AXES fügt dann wieder automatisch eine FIGURE ein, wenn noch keine offen ist. Das ist zwar praktisch und man kann die Handles später auch per gca und gcf erhalten. Wenn aber zwischendurch ein GUI-Callback eine weitere Figure erzeugt, hat man die Grafiken plötzlich im Warn-Dialog eingezeichnet.

Deshalb ist es grundsätzlich sicherer, die FIGUREs und AXES explizit zu erzeugen und sich die Handles zu merken. Bei einem 10-Zeiler sieht das noch unnötig aus, wenn man aber den Code mal auf 150'000 Zeilen aufgebohrt hat, ist es sehr schwierig, solche Nachlässigkeiten später wieder zu bereinigen.

Ja, Dein Code sollte so funktionieren.

Gruß, Jan
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 - 2024 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.