Batik zoom in gewählten Bereich

Status
Nicht offen für weitere Antworten.
J

Jazoon5

Gast
So,

also ich möchte in ein SVG-Image hineinzoomen. Dazu zieht der User mit der Maus ein Rechteck auf --> dies ist der gewählte Bereich und in den soll hineingezoomt werden.

Ich habe mir dafür die linke obere Koordinate und die rechte untere Koordinate des aufgezogenen Rechtecks gespeichert und umgewandelt, sodass die Koordinaten passen (also 0,0 ist links oben vom SVG-Image und nicht vom Component):

Code:
               at = canvas.getViewBoxTransform();
               p2d1 = at.transform(new Point2D.Float(pressedX, pressedY), null);
               p2d2 = at.transform(new Point2D.Float(releasedX, releasedY), null);

Dann habe ich lange lange Zeit gesucht, wie man so einen Zoom realisiert und einige Beispiel codes gefunden, dabei ist bei mir folgendes herausgekommen (jedoch würde hier der Zoom nur auf die linke obere Koordinate des aufgezogenen Rechtecks funktionieren):

Code:
           if(cmd.equals("Zoom")){
               AffineTransform at;
               at = canvas.getRenderingTransform();
                             if(p2d1 != null && p2d2 != null){
                   at.preConcatenate(AffineTransform.getTranslateInstance(-p2d1.getX(), -p2d1.getY()));
                   at.preConcatenate(AffineTransform.getScaleInstance(1.25, 1.25));
                   at.preConcatenate(AffineTransform.getTranslateInstance(p2d1.getX(), p2d1.getY()));

                   canvas.setRenderingTransform(at);
                   System.out.println("Zoom-in");
               }

           }

So, hier henge ich nun fest und komme nicht mehr weiter..

Meine Frage ist nun, wie ich es realisieren könnte, dass mir bei einem Click auf dem Button "Zoom" direkt in den gewählten (aufgezogenen) Bereich hineingezoomt wird. Also nur in den Bereich, ganz reinzoomen so weit es geht, sodass dieser Bereich dann über die gesamte größe des Components gestreckt wird.
 
G

Gast

Gast
Du musst dafür sorgen, dass die Eckpunkte auf den Kanten des Components liegen. Dabei gibt es drei Fälle:

1) Das Seitenverhältnis (Breite/Höhe) zwischen gewähltem Bereich und Component stimmt überein. Du kannst die rechte untere Ecke des gewählten Bereiches auf die rechte untere Ecke des Components legen, ebenso mit der linken oberen Ecke. Der Vergrößerungsfaktor ist wahlweise Breite des Bildes/Breite des gewählten Bereiches oder Höhe des Bildes/Höhe des gewählten Bereiches.

2) Seitenverhältnis gewählter Bereich/Component ist unterschiedlich. Die Breite des gewählten Bereiches ist größer als seine Höhe. Lege die beiden Punkte auf den rechten/bzw. linken Rand des Component, ignoriere die y- Koordinate. Der Vergrößerungsfaktor ist Breite des Bildes/Breite des gewählten Bereiches.

3) Seitenverhältnis gewählter Bereich/Component ist unterschiedlich. Die Höhe des gewählten Bereiches ist größer als seine Breite. Lege die beiden Punkte auf den unteren/bzw. oberen Rand des Component, ignoriere die x- Koordinate. Der Vergrößerungsfaktor ist Höhe des Bildes/Höhe des gewählten Bereiches.
 
J

Jazoon5

Gast
Okay, ich habe es jetzt so, dass der gewählte Bereich proportional mit der Bildgröße des SVG-Files übereinstimmt.

Was ich allerdings immernoch nicht schaffe: direkt in diesen gewählten Bereich hineinzoomen. Batik bietet das zwar schon an, jedoch möchte ich das ganze per Button-Klick erledigen.
--> mein Problem ist, ich habe keine Ahnung wie das funktioniert, ich würde ihm gerne 4 Koordinaten übergeben (x1,y1,x2,y2), sodass er mir dann dort hineinzoomt.

Habe bereits etwas im Batik-Sourcecode gestöbert, aber ich finde irgendwie nicht viel, ausser dem hier (wo ich keine Ahnung habe was es macht):
Code:
    /**
     * An interactor to perform a zoom.
     * 

Binding: BUTTON1 + CTRL Key</p>
     */
    protected Interactor zoomInteractor = new AbstractZoomInteractor() {
        public boolean startInteraction(InputEvent ie) {
            int mods = ie.getModifiers();
            return
                ie.getID() == MouseEvent.MOUSE_PRESSED &&
                (mods & InputEvent.BUTTON1_MASK) != 0 &&
                (mods & InputEvent.CTRL_MASK) != 0;
        }
    };
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben