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

Bounding Box eines Axes-Objekts ermitteln

 

Mircode
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2011, 15:50     Titel: Bounding Box eines Axes-Objekts ermitteln
  Antworten mit Zitat      
Hallo!

Das Thema ist verwandt mit meinem letzten Thread. Wie bekomme ich die "bounding box" eines axes-Objektes heraus? Der Text von den axis lables und so weiter soll dabei ignoriert werden. Über einen kleinen Kniff lässt sich diese Begrenzung zeigen, aber ihre Koordinaten erhalte ich so nicht.

Code:

hf=figure;

ha=axes('projection','perspective','units','normalized','position',[0.2,0.2,0.6,0.6]);

view(78,52);

T1=text('units','normalized','position',[0,0]);
T2=text('units','normalized','position',[1,0]);
T3=text('units','normalized','position',[0,1]);
T4=text('units','normalized','position',[1,1]);

set([T1,T2,T3,T4],'string','+','horizontalalignment','center','fontsize',20,'color',[0,0.7,0])

a1=annotation('rectangle',get(ha,'position'),'edgecolor',[1,0,0]);
a2=annotation('rectangle',get(ha,'outerposition'),'edgecolor',[0,0,1]);

title('Title')

while ishandle(ha)
   set(a1,'position',get(ha,'position'))
   set(a2,'position',get(ha,'outerposition'))
   pause(0.3)
end
 


Das sieht dann so aus:



Die grünen Kreuze repräsentieren die Ecken der "echten" Begrenzung vom axes-Objekt. Ich habe in Paint auf nem Screenshot die Kreuze mit Linien verbunden, sie umrahmen exakt die Ecken der weißen Box. In dem oberen Bild stimmt es noch fast so halb mit der position-Eigenschaft überein. Aber man kann mit dem Hand-, dem Lupen-, und dem 3D-Rotate-Werkzeug rumspielen und es völlig verschieben, ohne dass sich position ändert:



Wie komme ich an die Koordinaten dieses tatsächlichen Rahmens in figure-Koordinaten, so dass ich zum Beispiel ein annotation-Rechteck dort malen kann?

Wäre schön wenn jemand eine Antwort kennt.

MfG,
Mircode
Private Nachricht senden Benutzer-Profile anzeigen


Mircode
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2011, 00:43     Titel:
  Antworten mit Zitat      
Ich habe jetzt eine Lösung aber sie ist umständlichstmöglich.

Code:

function xywh = axesboundingbox(haxes)

% figure position on screen

hfig=get(haxes,'parent');
figure(hfig);
oldunits=get(hfig,'units');
set(hfig,'units','pixel');
pf=get(hfig,'position');
set(hfig,'units',oldunits);

ps=get(0,'screensize');

x0=pf(1);
y0=ps(4)-pf(2)-pf(4);
lx=pf(3);
ly=pf(4);

% click into figure

pause(0.1)
eval(['!click ' int2str(x0+0.3*lx) ' ' int2str(y0+0.7*ly)]);
pause(0.1)

p3d=get(haxes,'currentpoint');
p3d=p3d(2,:);

% create text object there and measure position in bounding box coordinates

T1=text('position',p3d,'string','+','horizontalalignment','center');
set(T1,'units','normalized')
P1ax=get(T1,'position');
P1ax=P1ax(1:2);

% point in figure coordinates

P1fig=get(hfig,'currentpoint');

% second click into figure

pause(0.1)
eval(['!click ' int2str(x0+0.7*lx) ' ' int2str(y0+0.3*ly)]);
pause(0.1)

p3d=get(haxes,'currentpoint');
p3d=p3d(2,:);

% create text object there and measure position in bounding box coordinates

T2=text('position',p3d,'string','+','horizontalalignment','center');
set(T2,'units','normalized')
P2ax=get(T2,'position');
P2ax=P2ax(1:2);

% point in figure coordinates

P2fig=get(hfig,'currentpoint');

% calculate bounding box from these two pieces of information

realcorner1=-P1ax./(P2ax-P1ax).*(P2fig-P1fig)+P1fig;
realcorner2=([1 1]-P1ax)./(P2ax-P1ax).*(P2fig-P1fig)+P1fig;

realsize=realcorner2-realcorner1;

xywh=[realcorner1 realsize];

delete([T1,T2])

end
 


Voraussetzung ist, dass man Mausklicks simulieren kann. Dafür habe ich mir mit AutoIt3 ein externes Programm Click.exe geschrieben. Es bekommt die Bildschirmkoordinaten als Kommandozeilenparameter und muss dann dort einen Klick ausführen.

Wirklich traurig wenn es keine elegantere Lösung gibt, so abwegig ist die Aufgabe eigentlich nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.01.2011, 02:53     Titel:
  Antworten mit Zitat      
Hallo Mircode,

Da hast Du Dir ein kniffeliges Problem ausgesucht.
Zunächst finde ich Deine Lösung prima. Nicht elegant, aber ausgebufft!

Den Maus-Klick kann man auch innerhalb von Matlab simulieren:
Code:
robot = java.awt.robot;
robot.mouseMove(x, y);
robot.mousePress(java.awt.event.InputEvent.BUTTON1_MASK);
robot.mouseRelease(java.awt.event.InputEvent.BUTTON1_MASK);
 

Dann habe ich aber noch dies gefunden:
[code]
% Zum Stöbern in den geheimen Features:
set(0, 'HideUndocumented', 'off');

% Pixel-Position [X_leftbottom, Y_leftbottom, X_righttop, Y_righttop]
q = get(gca, 'PixelBounds');
qPos = [q(1:2), q(3:4)-q(1:2)]; % [x,y,width,height]
annotation('rectangle', 'Units', 'pixels', 'Position', qPos);
[code]
Allerdings ist 'PixelBounds' in Matlab 2009a nicht dokumentiert. Yair Altman traut dem Ergebnis nicht im Allgemeinen. Unter 2009a funkitionierte es ganz gut, aber nicht perfekt. "Pan/Tilt Camera" brachtes es ganz aus dem Tritt. Die anderen Transformationen sahen dagegen gut aus.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Mircode
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2011, 11:12     Titel:
  Antworten mit Zitat      
Danke!

Die Idee mit der Maus gefällt mir. PixelBounds beinhaltet leider die Achsenbeschriftungen. Ich brauche aber genau die Koordinaten, auf die sich

Code:

set(textobj,'units','normalized')
get(textobj,'position')
 


bezieht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.01.2011, 17:48     Titel:
  Antworten mit Zitat      
Hallo Mircode,

Diese Hilfe-Seite hat (mir zumindest) nicht weiter geholfen sobald die AXES in 3D verschoben wird:
http://www.mathworks.com/help/techd.....ating_plots/f1-32495.html
GETPIXELPOSITION funktioniert leider auch nicht mit TEXT-Objekten.

[code]PixelBounds beinhaltet leider die Achsenbeschriftungen. Ich brauche aber genau die Koordinaten, auf die sich... bezieht.[/quote]
Könntst Du dann die Achsenbeschriftung temporär ausblenden?

Hast Du mal versucht die PixelBounds der TEXT-Objekte auszulesen? Die beziehen sich auf das Java-Koordinatensystem, so dass von links-oben der FIGURE gezählt wird statt Matlab-typisch von links-unten. Das sollte aber keine Schwierigkeit darstellen.

Die kleine Verschiebung der TEXT-Objekte nach rechts läßt sich unterdrücken: Entweder 'HorizontalAlignment' auf 'center' stellen (dann trifft man die Mitte der + Zeichen), oder 'Margin' auf 0 setzen. Das gleiche gilt für 'VerticalAlignment'.

Eine andere brutale Idee: TEXT in Grün zeichnen, den Java-Robot einen Screenshot aufnehmen lassen, TEXT in rot zeichnen, noch ein Screenshot, und dann die Differenz in den Bildern suchen. Falls das funktioniert, bitte nicht verraten, dass ich die Idee hatte ;-) Da könnte man ja auch mit dem Zollstock am Monitor nachmessen...

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Mircode
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2011, 18:36     Titel:
  Antworten mit Zitat      
Zitat:
> PixelBounds beinhaltet leider die Achsenbeschriftungen. Ich brauche aber genau die Koordinaten, auf die sich... bezieht.

Könntst Du dann die Achsenbeschriftung temporär ausblenden?


Das funktioniert bestimmt. Aber ich bin zufrieden mit meiner Lösung.

Zitat:
Hast Du mal versucht die PixelBounds der TEXT-Objekte auszulesen? Die beziehen sich auf das Java-Koordinatensystem, so dass von links-oben der FIGURE gezählt wird statt Matlab-typisch von links-unten. Das sollte aber keine Schwierigkeit darstellen.


Das würde mir nichts helfen. Ich möchte die Ankerposition der Textobjekte haben, so dass ich sie in ein tex-Dokument einbinden kann und sie dort z.B. auch mit ihrer Baseline an einem bestimmten Punkt hängen, auch wenn ich die Größe ändere oder ein $\frac 1 2$ in Formeln umgewandelt wird.

Zitat:
Die kleine Verschiebung der TEXT-Objekte nach rechts läßt sich unterdrücken: Entweder 'HorizontalAlignment' auf 'center' stellen (dann trifft man die Mitte der + Zeichen), oder 'Margin' auf 0 setzen. Das gleiche gilt für 'VerticalAlignment'.


Das hat damit nichts zu tun. Die Kreuze sind schon zentriert. Wenn man das Axes-Objekt dreht, bewegen sie sich auch etwas, der position-Rahmen allerdings nicht.

Zitat:
Eine andere brutale Idee: TEXT in Grün zeichnen, den Java-Robot einen Screenshot aufnehmen lassen, TEXT in rot zeichnen, noch ein Screenshot, und dann die Differenz in den Bildern suchen. Falls das funktioniert, bitte nicht verraten, dass ich die Idee hatte Wink Da könnte man ja auch mit dem Zollstock am Monitor nachmessen...


Wie gesagt, ich bin schon zufrieden. Kannst deine Lösung ja ausprobieren Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.01.2011, 19:02     Titel:
  Antworten mit Zitat      
Hallo Mircode,

Zitat:
Zitat:
Hast Du mal versucht die PixelBounds der TEXT-Objekte auszulesen?

Das würde mir nichts helfen.

Ja, gut. Dann habe ich wohl nicht verstanden, was Du eigentlich gesucht hast. Ich dachte, Du bräuchtest die Pixel-Position der TEXT-Objekte relativ zur Figure.

Ich habe das mit dem Zollstock mal ausprobiert. Es funktioniert tatsächlich! Man muss aber den Bildschirmschoner abschalten. Und für den Export nach LaTeX habe ich es mit meiner Handy-Kamera abfotografiert. Fehlt nur noch TippEx und Edding als PSFRAG-Ersatz.

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