Transformationen in Java2D..?

Status
Nicht offen für weitere Antworten.

sirbender

Top Contributor
Hi,

ich zeichne auf eine Flaeche von 800x600 pixeln. Der Grafik-Kontext in den ich male is von einem Bild was aber nicht wichtig sein soll.

Ich habe ein paar Shapes mit verschiedenen x/y/w/h die alle von einem Rechteck (x= -241, y= -321, w = 3435.332, h = 2344.65) eingeschlossen werden.

Ich will nun alle diese Shapes sichtbar auf mein Bild zeichnen. Bisher habe ich folgendes versucht:

g.translate(-241, -321); um mein BildKoordinatensystem auf das Rechteck zu schieben. Danach 'zoome' ich raus:
g.scale ( 3435.332 / 800, 2344.65 / 600);

nun male ich:

foreach s in shape:
g.fill(s);

Mein Problem: ich sehe einige der Shapes, aber nur am Rand des Bildes. Auch sind diese scheinbar viel zu gross. Kann mir jemand sagen wie ich diese Shapes auf das Bild zeichne?
 

Marco13

Top Contributor
Die Operationen werden "rückwärts" auf die zu zeichnenden Objekte angewendet - also wenn man sowas macht wie
Code:
g.translate(10,10);
g.scale(0.5f, 0.5f);
dann werden die Objekte ERST sakliert und DANN verschoben... (Wollte ich nur erwähnt haben - ob das genau die Ursache für dein Problem ist, kann man so nicht sagen, aber es könnte zumindest ein Teil des Problems sein)

EDIT: Abgesehen davon: 3435.332 / 800 ist sicher größer als 1.0 - also, wenn du da irgendwas kleiner mache willst, wäre es umgekehrt ganz gut...
 

sirbender

Top Contributor
Ok...einfacher. Ich habe ein java.awt.geom.Rectangle2D$Double[x=-961.843534528257,y=-609.2355791165478,w=1111.9785690307372,h=933.9806079116621]

Ich moechte Transformationen auf den Graphics-Context durchfuehren sodass dieses Rechteck wenn ich g.fill(rect) aufrufe vollstaendig in meinem 800 x 600 Bild sichtbar ist.

Java:
public class SimpleJava2DTests {
	
	private static final int WIDTH = 800;
	private static final int HEIGHT = 600;
	
	private static final Random R = new Random();

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException, IOException {
		BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
		paint((Graphics2D) image.getGraphics());
		
        JFrame frame = new JFrame("Java2D Test");
		frame.getContentPane().add(new JLabel(new ImageIcon(image)));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
	}

	private static void paint(Graphics2D g) {
		Rectangle2D.Double outer = new Rectangle2D.Double(-961.843534528257,-609.2355791165478,1111.9785690307372,933.9806079116621);

		// transformations of g ?
		
		g.fill(outer);
	}
}
 

Ebenius

Top Contributor
Hilft Dir das Beispiel weiter?

Java:
/* (@)TransformFun.java */

/* Copyright 2009 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.*;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class TransformFun extends JPanel {

  private final Rectangle2D.Double rect =
        new Rectangle2D.Double(-4, -4, 12, 26);

  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    final Graphics2D graphicsClone = (Graphics2D) g.create();
    try {
      final int width = getWidth();
      final int height = getHeight();
      graphicsClone.scale(width / rect.width, height / rect.height);
      graphicsClone.translate(-rect.x, -rect.y);
      graphicsClone.setColor(Color.RED);
      graphicsClone.fill(rect);
    } finally {
      graphicsClone.dispose();
    }
  }

  public static void main(String[] args) {
    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    final TransformFun tf = new TransformFun();
    tf.setPreferredSize(new Dimension(800, 600));
    contentPane.add(tf);

    final JFrame f = new JFrame("Test Frame: TransformFun"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}
Ebenius
 

sirbender

Top Contributor
Danke an alle. Beide eure Beispiele haben mir geholfen - insofern dass ich nicht die Hoffnung aufgegeben habe. Genau was ich machen wollte hab ich jetzt durch stundenlanges Probieren rausbekommen. Irgendwie sind Transformationen nicht so mein Thema.

Wenn ihr den Hammerartikel habt zu dem Thema der mir die Augen oeffnet - mit vielen schoenen Beispielen, die Codeziele fuer Codezeile erklaert werden waere das natuerlich super toll :)

Ich habe einige Artikel gelesen, aber scheinbar waren es die falschen ;)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben