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 ...
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?
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:
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: