2D-Grafik Rectangle mit double Werten zeichnen

OnJen

Neues Mitglied
Hallo Java-Forum

Auf einem JPanel zeichne ich Rectangles. Beim zoomen wird immer wieder die Position neu berechnet.
Hier ein Beispiel für die Berechnung beim Hereinzoomen.

Java:
double tempX = plant.getRectangle().getX()*zoomFactor;
double tempY = plant.getRectangle().getY()*zoomFactor;
plant.getRectangle().setRect(tempX, tempY, controller.getQuadratB(), controller.getQuadratH());

Wenn man jetzt ganz oft rein- und wieder rauszoomt, gibt es mit der zeit eine kleine abweichung in Richtung linke obere Ecke.
Meine Vermutung ist, dass es an der Rundung liegt, weil die doubles für die fillRect() und drawRect() Methode in Integer umgewandelt werden müssen.
hier der Ausschnitt der paintComponent() Methode:

Java:
for (Iterator<Plant> iterator = controller.getPlants().iterator(); iterator.hasNext();) {
				Plant plant = (Plant) iterator.next();
				rect = plant.getRectangle();
				g.setColor(plant.getBluetenFarbe());
                g.fillRect(rect.x, rect.y, controller.getQuadratB(), controller.getQuadratH());
                g.setColor(Color.black);
                g.drawRect(rect.x, rect.y, controller.getQuadratB(), controller.getQuadratH());
			}



Gibt es irgendeine Möglichkeit das zu umgehen, außer mit einem Schätzwert, der draufaddiert wird?

Gruß
Johannes
 
Du solltest beim zoomen nur den Zoomwert ändern. Das orignal Rectangle solltest du nicht anpacken. In der paintComponent Methode holst du dir dann das Rectangle sowie den Zoomfaktor und berechnest dort erst das gezoomte Rectangle.
Wenn du dann wieder zurückzoomst ändert sich nichts an dem original Rectangle und dein Problem sollte geklärt sein.
 
Danke für die Antwort schonmal

Das Problem ist, ich muss das Original Rectangle anpacken weil man durch klicken auf die Rectangles an der Seite Informationen dazu sieht, und auch die Rectangles durch Mausdragging verschieben kann.

Wenn ich das also in die paint Methode schreibe, malt er sie zwar, aber man kann nicht mehr interagieren.
Deswegen hab ich extra eine zoomIn() und zoomOut() Methode geschrieben.
 
Ohne das im Detail nachvollzogen zu haben: Diesen Punkt kann man evtl. dadurch abdecken, dass man die Mausposition beim Anklicken in das gezoomte Koordinatensystem umrechnet (und mit dem Punkt, der sich daraus ergibt, dann rect.contains(p) oder so aufruft). Kannst ja mal überlegen, ob das für dich eine Option wäre...
 

Neue Themen


Zurück
Oben