# Automatisches Zoomen



## RobDom (26. Jun 2008)

Hallo zusammen,

ich habe eine Anwendung, bei der der User zur Laufzeit einen Graphen
erstellen, abspeichern und laden kann. (vgl. Zeichenprogramm)

Jetzt will ich beim Laden von Graphen automatisch so zoomen, dass 
man den kompletten Graphen sieht, aber auf maximale Größe gezoomt.

Bei CAD Programmen heißt diese Funktion "FIT".

Die Größe der Grafikelemente ist erst zur Laufzeit bekannt, da sie
ja vom User erstellt, verändert werden können.

Hat jemand Ideen, wie man sowas realisieren kann.

PS: Hab noch ein zweites Problem:
mein canvas hat an der rechten Seite eine Art "schwarzen Vorhang", hinter
dem die Objekte verschwinden.  --> nach Hinten raus hab ich das mit .setBackClipDistance gelöst, aber wie geht das zur Seite?? Oder ist mein
Viewpoint verschoben, ich nutze universe.getViewingPlatform().setNominalViewingPlatform()

Danke und Gruß RobDom


----------



## Guest (3. Jul 2008)

Hallo,

leider ist mir keine einfache Möglichkeit bekannt. Die einzige die ich kenne ist es, zur Laufzeit die Maße zu nehmen und dann alles was gemacht wird mit dem daraus resultierenden Verhältnis zu multiplizieren. Lass dich nicht von den Methoden in der Graphics2D API irritieren, die helfen dir AFAIK nicht weiter.

Gruß

taouri


----------



## Marco13 (3. Jul 2008)

Zum zweiten Problem: Eigentlich gibt's keine _sichtbare_ seitliche Clipping-Plane  ???:L  

Zum ersten: Man kann prinzipiell ausrechnen, wie weit man die Kamera (entlang der Blickrichtung, nach hinten) verschieben muss, um alles sehen zu können. Dazu muss man für jeden Punkt des Graphen die Entfernung d0 zur Geraden zwischen Aug- und Blickpunkt ausrechnen, und die Entfernung d1 zur Ebene, die durchs Auge geht, und deren Normale die Blickrichtung ist. 

Wenn man bei einem FOV mit dem Winkel a eine Szene sieht, sieht man Punkte genau dann, wenn d0<d1*atan(a/2). Wenn man für einen Punkt den Wert d0 berechnet hat, muss man die Kamera also in eine Entfernung von mindestens d2 = d0/atan(a/2) von diesem Punkt bringen, also um d2-d1 nach hinten verschieben.

Code werde ich nicht posten.


----------

