AffineTransform: die Skalierung einer Form von deren Mittelpunkt
Ich versuche skalieren eines Rechtecks aus seiner Mitte mit AffineTransform. Ich bin sicher, die Lösung liegt auf der Hand, aber ich kann nicht damit es funktioniert ! Hier ist, was ich bisher getestet haben...
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Test extends JPanel {
Test()
{
super(null);
setOpaque(true);
setBackground(Color.WHITE);
setPreferredSize(new Dimension(200,200));
}
@Override
protected void paintComponent(Graphics g1) {
super.paintComponent(g1);
Rectangle r= new Rectangle(5,5,getWidth()-10,getHeight()-10);
double cx= r.getCenterX();
double cy= r.getCenterY();
Graphics2D g=(Graphics2D)g1;
g.setColor(Color.BLACK);
AffineTransform old= g.getTransform();
for(double zoom=0.9; zoom>=0.5; zoom-=0.1)
{
AffineTransform tr2= new AffineTransform(old);
tr2.translate(-cx, -cy);
tr2.scale(zoom, zoom);
tr2.translate(cx/zoom,cy/zoom);
g.setTransform(tr2);
g.draw(r);
g.setTransform(old);
}
}
public static void main(String[] args) {
JOptionPane.showMessageDialog(null, new Test());
}
}
Aber es funktioniert nicht.... Jede Anregung ?
Ich nehme an, Sie versuchen zu verfolgen, konzentrisch/interne Rechtecke?
InformationsquelleAutor Pierre | 2009-03-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich sehe, was Sie meinen, wenn Sie ' re Umgang mit Rechtecken. Der Grund ist, weil die erste Berechnung für die übersetzung nicht berücksichtigen, die Größe des container-Objekts.
Diese stattdessen zu verwenden:
Was dieser tut, ist die übersetzung des Rechtecks auf der Mitte der Vorderseite vor der Skalierung. In meinen tests funktioniert es ganz gut.
InformationsquelleAutor Welbog
Vorausgesetzt, Skalierung behebt die Lage der oberen linken Ecke des Rechtecks (die ich für richtig halte aber es ist schon eine lange Zeit, seit ich getan habe Grafiken in Java), die Sie benötigen, zu übersetzen, ist das Rechteck in die entgegengesetzte Richtung auf die Skalierung.
So verschieben Sie das Rechteck Links und rechts die Hälfte der Veränderung in der Breite und Höhe.
Ihre Lösung funktioniert nicht, aber es gibt mir ein paar neue Ideen, danke
was ist das Ergebnis, das Sie bekommen? Ich don ' T haben Zugang zu einer Java-IDE bei der Arbeit, so kann ich es nicht selbst ausprobiert. Ich arbeite weitgehend aus dem Gedächtnis.
Mit der original-code, alle Felder Ihren Ursprung in der linken oberen Ecke. Mit Ihrer code, Sie werden zunehmend in Richtung Mitte verlagert, aber nicht genug.
Ah, hab es. Alles, was Sie tun müssen, ist, verschieben Sie die Skala() auf, nachdem die translate() und es funktioniert perfekt.
InformationsquelleAutor Welbog
War ich gerade an eine desktop-Anwendung zum zuschneiden Brittney Spear ' s face (D. A. Y.) Das Rechteck zum beschneiden musste die Skala um seinen Mittelpunkt:
Im Allgemeinen der Algorithmus funktioniert wie folgt:
x + (width * (1 - zoomFactor) /2)
y + (height * (1 - zoomFactor) /2)
width * zoomFactor
height * zoomFactor
InformationsquelleAutor Martin Erlic
Dies beinhaltet einen Prozess namens conjugating eine Transformation.
Wenn S die Skalierung, die Sie tun möchten, und T ist die transformation, die nimmt Punkt (0,0) auf den Punkt, der das Zentrum der Skalierung, dann die Transformation, die nicht den job ist
T(S(inverse(T)))
InformationsquelleAutor paulmurray
(Später) Hier ist eine Lösung ohne Vorherige Kenntnis der Dimension des Panels.
InformationsquelleAutor Pierre