Trotz gleicher Koordinaten verschieden gezeichnet! Weshalb?

Marco7757

Mitglied
Hallo zusammen

Ich arbeite an einem Graph-System. Jedoch scheitere ich im Moment an einem eigentlich banalen Fehler, den ich mir jedoch weder logisch noch mathematisch erklären kann.

Ganz unten ein kleines kompilierbares Java-Programm, welches euch das Problem aufzeigt:
Das weisse Rechteck sollte eigentlich genau so gross sein wie die Achsen (grau) und der Rahmen (rot, den Achsen gegenüber). Die Koordinaten stimmen genau überein, jedoch werden sie nicht gleich gross gezeichnet ...

Java:
g2.fill(new Rectangle2D.Double(graphArea[0]+leftSpace, graphArea[1]+leftSpace, graphArea[2]-leftSpace, graphArea[3]-leftSpace));
///CODE////
 g2.draw(new Line2D.Double(graphArea[0]+leftSpace, graphArea[1]+leftSpace, graphArea[0]+leftSpace, graphArea[3]-leftSpace));
g2.draw(new Line2D.Double(graphArea[0]+leftSpace, graphArea[3]-leftSpace, graphArea[2]-leftSpace, graphArea[3]-leftSpace));
g2.setPaint(new Color(255, 126, 126));
 
Line2D.Double xxx = new Line2D.Double(graphArea[2]-leftSpace, graphArea[1]+leftSpace, graphArea[2]-leftSpace, graphArea[3]-leftSpace);
System.out.println("Draw "+xxx.getP1()+" "+xxx.getP2());
g2.draw(xxx);
 
g2.draw(new Line2D.Double(graphArea[0]+leftSpace, graphArea[1]+leftSpace, graphArea[2]-leftSpace, graphArea[1]+leftSpace));

Wer genau hinsieht, wird merken, dass die Koordinaten genau diesselben sind.
graphArea[0] = X1;
graphArea[1] = Y1;
graphArea[2] = X2;
graphArea[3] = Y2;
Das sind die Koordianten der Eckpunkte des gesamten Graphenbereiches (schwarzes Rechteck im Hintergrund). Da ich noch Platz zur Achsenbeschriftung usw... brauche wird der eigentliche Graph in einem etwas kleinerem Bereich gezeichnet, um der durch die Achsen und die roten Rahmen eingerahmt wird. Dazu benutze ich die Variable leftSpace, die mir die Anzahl Pixel angibt, die von jeder Seite her frei gelassen werden müssen. Diese Anzahl Pixel wird zu X1/Y1 hinzuadiert, von X2/Y2 subtrahiert.
Die Anfangskoordinaten stimmen danach überein, die Endkoordinaten allerdings nicht mehrs. Was mache ich falsch?

Java:
import java.awt.Color;
import java.awt.Font;
import java.awt.*;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
 
public class jChart extends JPanel {
 
    private static final long serialVersionUID = 1L;
 
    private int[] graphArea = new int[4];
    private int plusSpaceForWriting = 45;
    private int leftSpace = 30;
    private Graphics2D g2;
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        jChart jC = new jChart();
        jC.setGraphArea(10, 10, 500, 410);
        JFrame jF = new JFrame();
        JPanel graphicPanel = new JPanel(new GridLayout(1,1));
        graphicPanel.add(jC);
        jF.getContentPane().setLayout(new GridLayout(1,1));
        jF.getContentPane().add(graphicPanel);
        jF.setSize(800, 600);
        jF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jF.setVisible(true);
    }
 
    public void setGraphArea(int X1, int Y1, int X2, int Y2) {
        this.graphArea[0] = X1+plusSpaceForWriting;
        this.graphArea[1] = Y1;
        this.graphArea[2] = X2+plusSpaceForWriting;
        this.graphArea[3] = Y2;
    }
 
    public void drawGraphArea(int r, int g, int b) {
        g2.setPaint(new Color(r, g, b));
        g2.fill(new Rectangle2D.Double(this.graphArea[0], this.graphArea[1], this.graphArea[2], this.graphArea[3]));
    }
 
    public void paintComponent(Graphics g) {
        g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        //setSize(660, 460);
        setBackground(new Color(250, 250, 250));
        drawGraphArea(0, 0, 0);
        drawScale("SCALE_NORMAL", 150, 150, 150, 10);
    }
 
    public void drawScale(String scaleMode, int r, int g, int b, double yAxisRows) {
        g2.setPaint(new Color(255, 255, 255));
 
        g2.fill(new Rectangle2D.Double(graphArea[0]+leftSpace, graphArea[1]+leftSpace, graphArea[2]-leftSpace, graphArea[3]-leftSpace));
 
        System.out.println("Fill "+new Rectangle2D.Double(graphArea[0]+leftSpace, graphArea[1]+leftSpace, graphArea[2]-leftSpace, graphArea[3]-leftSpace));
 
        if(scaleMode.equals("SCALE_NORMAL")) {
            g2.setPaint(new Color(r, g, b));
            g2.setFont(new Font("Helvetica", 0, 15));
            g2.drawString("test", (graphArea[2]-graphArea[0])/2, graphArea[1]+(leftSpace/2));
            //y-axis
            double difBetweenRenderY1Y2 = (graphArea[3]-leftSpace)-(graphArea[1]+leftSpace);
            double difBetweenRenderY1Y2MinusScaleLines = difBetweenRenderY1Y2-yAxisRows;
            while((difBetweenRenderY1Y2MinusScaleLines%yAxisRows)!=0) {
                graphArea[3]++;
                difBetweenRenderY1Y2 = (graphArea[3]-leftSpace)-(graphArea[1]+leftSpace);
                difBetweenRenderY1Y2MinusScaleLines = difBetweenRenderY1Y2-yAxisRows;
            }
            double difPixel = Math.abs(difBetweenRenderY1Y2/yAxisRows); //abs = absolute value, betrag
 
            g2.draw(new Line2D.Double(graphArea[0]+leftSpace, graphArea[1]+leftSpace, graphArea[0]+leftSpace, graphArea[3]-leftSpace));
            g2.draw(new Line2D.Double(graphArea[0]+leftSpace, graphArea[3]-leftSpace, graphArea[2]-leftSpace, graphArea[3]-leftSpace));
            g2.setPaint(new Color(255, 126, 126));
 
            // Bogus:
            Line2D.Double xxx = new Line2D.Double(graphArea[2]-leftSpace, graphArea[1]+leftSpace, graphArea[2]-leftSpace, graphArea[3]-leftSpace);
            System.out.println("Draw "+xxx.getP1()+" "+xxx.getP2());
            g2.draw(xxx);
 
            g2.draw(new Line2D.Double(graphArea[0]+leftSpace, graphArea[1]+leftSpace, graphArea[2]-leftSpace, graphArea[1]+leftSpace));
            g2.setPaint(new Color(r, g, b));
 
            g2.setFont(new Font("Helvetica", 0, 10));
 
            for(int i=0;i<yAxisRows;i++) {
                g2.draw(new Line2D.Double(graphArea[0]+leftSpace-5, graphArea[1]+leftSpace+i*difPixel, graphArea[0]+leftSpace-1, graphArea[1]+leftSpace+i*difPixel));
                g2.drawString(""+(graphArea[1]+leftSpace+i*difPixel), graphArea[0]-plusSpaceForWriting, (int) (graphArea[1]+leftSpace+i*difPixel+4));
            }
 
        }
    }
}

Konsolenausgabe:
Fill java.awt.geom.Rectangle2D$Double[x=85.0,y=40.0,w=515.0,h=380.0]
Draw Point2D.Double[515.0, 40.0] Point2D.Double[515.0, 380.0]

Die gleichen Koordinaten******!! Weshalb wird das Rechteck nicht so gross wie die Achsen und deren Rahmen?

Ich hoffe ihr habt eine Lösung!

Wer zu faul ist das ganze zu kompilieren, hier ein Bild:
unbenanntge.png
 
Hi Marco,

also ich kenn mich bei graphen nicht so gut aus, aber beim ersten Blick sehe ich das du einmal this.graphArea[] für das rechteck nutzt und dort ist bei x2 -> x2+plusSpaceForWriting und nicht x2-plusSpaceForWriting das erklärt warum die rechte vertikale rote linie weiter weg vom rand ist als die unten horizontale graue linie, da du für die linien wieder graphArea[] nutzt.
Ich hoffe ich erzähl keinen Mist.

Gruß Air
 
Nein, das hat schon seine Richtigkeit. Alle Koordinaten müssen um plusSpaceForWriting nach rechts verschoben werden, also +!

Die Linien haben die richtige Länge, allerdings müsste das Rechteck genau in den Rahmen passen, tut es aber nicht ...
 
Okay mein Gedankenfehler, naja bei Graphen langt ein kurzer Blick nicht.
Aber jetzt hab ich es getestet und deinen Gedankenfehler gefunden.
Und zwar wenn du das Rechteck zeichnest setzt du den Anfangspunkt mit x1 und y1 dann kommt die breite in x-Richtung und die höhe in y-Richtung (keine Koordinaten). deine Linien werden mit zwei Punkten gezeichnet und die haben Koordinaten. So die Ausgabe zeigt die gleichen Zahlen meint aber unterschiedliche Sachen. Du musst den Punkt der linien bei x2 um den Wert von x1 nach rechts verschieben (addieren). Danach musst du noch die Differenzen zwischen dem schwarzen und weißen Rechteck den Punkten x2 und y2 hinzu addieren.
Ich hoffe du verstehst was ich meine.

Gruß Air
 
Hi!

Nur ganz kurz drauf gesehen, aber:

Der Konstruktor für dein Rectangle erwartet nicht etwa Koordinaten für den "unteren rechten" Punkt deines Rechtecks, sondern Höhe und Breite:
http://download.oracle.com/javase/1...ngle2D.Double(double, double, double, double).

Die Linie dagegen erwartet Koordinaten für Start - und Endpunkt:
http://download.oracle.com/javase/6...Line2D.Double(double, double, double, double)

EDIT: Im Prinzip erkläre ich glaube ich genau das, was airtime schon erläutert hat... Sorry, sollte wohl genauer lesen :)
 
Zuletzt bearbeitet:
Ach sooo! Na, dass ist natürlich gut zu wissen, da kann man noch lange rumprobieren :)

Vielen vielen vielen Dank euch beiden!

Ich weiss gar nicht, woher ich das mit den Koordinaten hatte, irgendwie habe ich es einfach so gemacht, ohne gross auf die Definition des Konstruktors zu achten ... :)
 

Neue Beiträge

Zurück