Graphics2d - mathematisches Koordinatensystem

kroesi

Erfahrenes Mitglied
Hallo !

Ich will geometrische Daten zeichnen. Dies will ich über Graphics2d erreichen. Meine Daten haben ihren Urpsrung in der unteren, linken Ecke, die X-Werte wachsen nach links und die Y-Werte wachsen nach oben.

Beim Graphics2d-Objekt liegt nun der Urpsung in der oberen, linken Ecke, die Y-Werte wachsen nach unten.
Wie ich meine Koordinaten jetzt umrechnen kann weiss ich, aber gehts nicht einfacher mit einem AffineTransform-Objekt ? Ist das schneller ? Ich kriegs darüber nicht hin.

Bin für jeden Tipp dankbar !

Grüsse,

Krösi
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;

import javax.swing.JFrame;

/**
 * @author Tom
 * 
 */
public class CoordinateSystemExample extends JFrame {

    final AffineTransform FLIP_X_COORDINATE;

    public CoordinateSystemExample() {
        super("CoordinateSystemExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400, 300);
        FLIP_X_COORDINATE = new AffineTransform(1, 0, 0, -1, 0, getHeight());
        setVisible(true);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new CoordinateSystemExample();
    }

    @Override
    public void paint(Graphics graphics) {
        Graphics2D g = (Graphics2D) graphics;
        g.setTransform(FLIP_X_COORDINATE);
        g.drawLine(0, 0, 250, 250);
    }

}

Gruß Tom
 
Hi !

Nun noch eine weitere Frage :


Ich habe z.B. eine Punkt, welcher die Koordinaten 354000/554900 besitzt. Diese Koordinaten liegen ja noch innerhalb des "double"-Bereichs.
Also mach ich folgendes :


Java:
Point2D.Double point = Point2D.Double(354000,554900);
g2d.draw(point);

Mein Fenster, auf welchem ich zeichne, ist 500 x 300 Pixel gross. Also kann ich den
Punkt in meinem Fenster nicht sehen.


Nach folgender Rechnung erhalte ich das Verhältnis zwischen Fenster-Breite und Welt-Bbreite :

(Weltebreite/Fensterbreite) = Verhältnis (in meinem konkreten Fall = 23)

Nun setze ich beim initialisieren von g2d mittels Scale meinen sichtbaren Bereich :

Java:
AffineTransform at = new AffineTransform();
at.scale(1./23.);

Leider sehe ich nichts

Was mache ich falsch, wer kann mir helfen ?

Danke im Voraus,

Krösi
 
Hallo!

Also ich denke deine Skalierung ist bei weitem zu klein...

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * @author Tom
 * 
 */
public class GraphicsScalingExample extends JFrame {

	JSlider slider;

	Display display;

	public GraphicsScalingExample() {
		super("GraphicsScalingExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		display = new Display(1);
		display.setPreferredSize(new Dimension(500, 300));

		display.points.add(new Point(50, 100));
		display.points.add(new Point(200, 150));
		Point farAwayPoint = new Point(3540000, 5549000);
		display.points.add(farAwayPoint);

		slider = new JSlider(1, (int) new Point2D.Double(farAwayPoint.x
				/ display.getPreferredSize().getWidth(), farAwayPoint.y
				/ display.getPreferredSize().getHeight()).distance(0, 0));
		slider.setValue(1);
		slider.setPaintTrack(true);

		slider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				int value = slider.getValue();
				display.scale = value;
				display.repaint();
			}
		});

		add(slider, BorderLayout.SOUTH);
		add(display, BorderLayout.CENTER);

		pack();
		setVisible(true);

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new GraphicsScalingExample();
	}

	static class Display extends JComponent {

		List<Point> points;

		double scale;

		public Display(double scale) {
			this.scale = scale;
			this.points = new ArrayList<Point>();

		}

		protected void paintComponent(Graphics graphics) {
			Graphics2D g = (Graphics2D) graphics;
			super.paintComponent(g);
			g.setTransform(AffineTransform.getScaleInstance(1. / scale,
					1. / scale));
			int d = 100000;
			for (Point point : points) {
				g.fillOval(point.x - d / 2, point.y - d / 2, d, d);
			}
		}
	}
}

Gruß Tom
 
Zurück