Verfasst am: 08.01.2011, 15:50
Titel: Bounding Box eines Axes-Objekts ermitteln
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.
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?
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.
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.
[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...
> 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 Da könnte man ja auch mit dem Zollstock am Monitor nachmessen...
Wie gesagt, ich bin schon zufrieden. Kannst deine Lösung ja ausprobieren
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
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.