Punkte auf einem JPanel zeichnen

Hallo

Ich möchte gerne Punkte und Linien Zeichnen, das funktioniert auch super. Aber wir haben jetzt eine Datei mit Punkten bekommen, da sind die Werte viel größe als es Pixel auf einem Monitor gibt.

Beispiel:
X: 52123546.1236548 Längengrad
Y: 52123547.2566548 Breitengrad

Wie kriege ich jetzt solche Punkte auf eine JPanel Leinwand mit 800x600 Pixel.

Ich habe mir AffineTransform Klasse angeschaut doch leider nicht schlauer geworden. Ausserdem habe ich versucht die Zahlen zu teilen, doch dann geht die Information verloren heisst ich hätte nur noch 521 stehen.

Danke
Janina

Mach die Sache nicht so kompliziert. Einfacher Dreisatz führt hier schon zum Ziel, wenn man weiß, wie groß Längengrad und Breitengrad maximal sein können…

bye
TT

Und wenn nicht?

An sich ist die Frage schon berechtigt, aber vieeel zu breit. Also, “Punkte und Linien”… das sagt nicht so viel aus. Man könnte zwar pragmatisch sowas machen wie

protected void paintComponent(Graphics gr) {
    super.paintComponent(gr);
    Graphics2D g = (Graphics2D)gr;

    // Scale and translate the graphics somehow so that the
    // current input points are visible. Change and re-compile
    // this class when the inputs change....
    g.scale(0.00001, 0.00001);
    g.translate(100000, 100000);

    g.drawWhatever( 52123546.1236548,  52123547.2566548 );
...
}

aber das ist ja bogus.

Auch wenn die Frage zu ungenau ist, als dass eine konkrete Antwort gerechtfertigt wäre, nutze ich mal die Gelegenheit zur “shameless self promotion”, und erwähne, dass es doch praktisch sein könnte, wenn man in dem Panel dann mit der Maus auch zoomen und pannen kann, und dass das mit https://github.com/javagl/Viewer (Maven: https://oss.sonatype.org/content/repositories/releases/de/javagl/viewer/0.0.2/ ) recht einfach geht.

Hier werden zwei Punkte gezeichnet:

            points.add(new Point2D.Double(52123546.1236548, 52123547.2566548));
            points.add(new Point2D.Double(52123946.1236548, 52123347.2566548));

Der dargestellte Welt-Bereich ist passend gesetzt:

        viewer.setDisplayedWorldArea(
            new Rectangle(52120000, 52120000, 10000, 10000));

Hm. Aber man kann’s auch anders machen.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import de.javagl.viewer.Painter;
import de.javagl.viewer.Viewer;

public class PointsOnPanel
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
   
    private static void createAndShowGUI()
    {
        JFrame f = new JFrame("Viewer");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new BorderLayout());
       
        Viewer viewer = new Viewer();
        viewer.addPainter(new PointPainter());
        f.getContentPane().add(viewer, BorderLayout.CENTER);
        
        viewer.addMouseMotionListener(new MouseAdapter()
        {
            @Override
            public void mouseMoved(MouseEvent e)
            {
                Point2D world = new Point2D.Double();
                viewer.getScreenToWorld().transform(e.getPoint(), world);
                System.out.println("World position: "+world);
            }
        });

        viewer.setDisplayedWorldArea(
            new Rectangle(52120000, 52120000, 10000, 10000));
        
        viewer.setPreferredSize(new Dimension(500,500));
        f.pack();
        viewer.setPreferredSize(null);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
    
    private static class PointPainter implements Painter
    {
        private final List<Point2D> points;
        PointPainter()
        {
            points = new ArrayList<Point2D>();
            points.add(new Point2D.Double(52123546.1236548, 52123547.2566548));
            points.add(new Point2D.Double(52123946.1236548, 52123347.2566548));
        }
        
        @Override
        public void paint(Graphics2D g, 
            AffineTransform worldToScreen, double w, double h)
        {
            g.setColor(Color.RED);
            for (Point2D point : points)
            {
                Point2D transformedPoint = 
                    worldToScreen.transform(point, null);
                paintPoint(g, transformedPoint);
            }
        }
        
        private static void paintPoint(Graphics2D g, Point2D point)
        {
            final double r = 5;
            Shape s = new Ellipse2D.Double(
                point.getX() - r, point.getY() - r, r + r, r + r);
            g.fill(s);
        }
    }
}

Studienarbeit, OpenStreetMap, Belohnung

Warum nimmt man Jobs an, bei denen man nicht mal halbwegs in der Lage ist, diese überhaubt zu bewältigen.

Also, ich hab bei Wolfram, Wikipedia, Longitude, Geotagging, Geo Chaching, GPX und WGS 84 nachgeschaut, bis ich gecheckt habt, das mit Längengrad

Semi-minor axis beta in Metern

gemeint ist.

Sind diese „Koordinatoren“ real/reell/realistisch? Du müsstest zuerst den Wertebereich herausfinden und dann wie gesagt Dreisatz anwenden. Das Zeichnen ist mit Graphics ganz einfach, ich würd aber nicht direkt auf dem Frame/Panel zeichnen. Skalierung doch sicher gewünscht?

Frage nebenbei: was sind es denn jetzt für Geheimkoordinaten?

Die Erde hat am Äquator einen Umfang von ~40.000km - um die Pole dürfte es, da die Erde im groben kugelförmig ist, ähnlich sein. Ergo sind diese Koordinaten nicht metrisch und/oder stellen keine Koordinaten auf der Erde selbst dar.
Hilft also erstmal nur den Wertebereich und den Bezugspunkt herauszubekommen. Ohne diese Info dürfte diese “Aufgabe” unlösbar sein.

hast du dich vertippt als in deinem Umfang zweimal die 4 vorkam? gefährlich gefährlich,

und was hätte der Umfang um die Pole als Längenkreis in ähnlicher Länge zum Thema beizutragen? :wink:
wichtige sind doch wohl die dramatisch abfallenden Breitenkreise, etwa Polarkreis nur 16.000 km, direkt am Pol mächtig kurz,

das hat auf Koordinaten vs. Realität, etwa Abstand, deutliche Auswirkungen, aber die Probleme einer passenden 2D-Darstellung einer Kugel sind ja bekannt

Erstmal Danke für die Korrektur. Muss gestehen: Nein, es war kein Tippfehler - hatte wirklich die Zahl 44.000 im Kopf - aber nun ja - 10. Klasse Astro ist schon etwas länger her =P.
Bzgl. Längen und Breiten war so gemeint dass die Längen die ja senkrecht zum Äquator stehen auf Grund der Tatsache dass die Erde annährend eine Kugel ist (ja, ich weis: korrekt ist Elipsoid) ungefähr die gleiche Länge, also auch irgendwas grob um die 40.000km, sein müssen. Dass die Breiten zu den Polen hin “kürzer” vom Umfang werden ist mir doch klar =P.
Da wir aber Koordinaten im Bereich von 52.100km hätten, was ja nich hinkommen kann, stellen diese Zahlen entweder keine metrischen Koordinaten dar oder beziehen sich auf was anderes.

Bei allen Seiten im Internet, ich gesucht hab, sind die Beispieldaten nur dann plausibel, wenn das:
Semi-minor axis b (in Metern)
ist.

Vielleicht ist das aber auch alles fingiert - oder es ist gar nicht die Erde (wer weiß, vielleicht wird in ein paar Jahren Geochaching auf dem Mars gespielt).

… Der Rest der Seiten macht auf die Gefahren beim Geochaching aufmerksam. (Sry, heut nicht mein Tag, fehler)

Hmm, um mal von der Erde als Referenz abzukommen: natürlich ist es möglich dass es hier darum geht wie man mit Maßstäben arbeitet und es eher/nur darum geht die Relation/Proportion korrekt darzustellen. Dann wäre das natürlich einfache Mathematik.

Jedoch gibt uns TO nur die Größe des sichtbaren Bereiches in Pixeln (800x600) und zwei Punkte die, als absolute Werte zum gleichen Nullpunkt gesehen, außerhalb dieses sichtbaren Bereiches liegen sowie die Frage wie “dies” nun umsetzbar sei. Leider fehlt erstmal eine genaue Fragestellung wo genau TO nun Probleme hat und was er von sich aus schon versucht hat.
Und ohne diese nötigen zusatzinfos können wir erstmal nur raten und auf Glück mögliche Hinweise geben.