g.drawLine arbeitet sehr ungenau.

Status
Nicht offen für weitere Antworten.

gurke1509

Mitglied
Hallo.
Ich habe folgenden Code entworfen:

Code:
/*
 * Diese Klasse sorgt für das Erstellen eines Frames, in welchem ein Graph angezeigt werden kann.
 */

package bernoulli;

import java.awt.*;
import javax.swing.*;

/**
 *
 * @author gurke
 */
public class Graph extends JFrame
{
    Zeichenpanel zeichenpanel;
    Graphics g;

    
    /** Erzeugt das Fenster mit einem bemalbaren Panel */
    public Graph(String titel, int[] xwerte, int[] ywerte)
    {
        super(titel);                                           //Fenster erzeugen
        setSize(new Dimension(500,500));
        Container content = getContentPane();
        content.setLayout(new BorderLayout(0,0));
        zeichenpanel = new Zeichenpanel();
        content.add(zeichenpanel, BorderLayout.CENTER);
        setVisible(true);
        zeichenpanel.setValues(xwerte, ywerte);
        zeichenpanel.repaint();
    }
    
}


class Zeichenpanel extends JPanel
{
    int[] xwerte;
    int[] ywerte;
    
    public Zeichenpanel()
    {
        super();
        setBackground(Color.WHITE);
    }
    
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        for(int i=0; i < xwerte.length-1; i++)
        {
            g.drawLine(xwerte[i]*6,ywerte[i]*6+20,xwerte[i+1]*6,ywerte[i+1]*6+20);
        }
    }
    
    public void setValues(int[] x, int[] y)
    {
        this.xwerte = x;
        this.ywerte = y;
    }
}

Zum Code:
In den Arrays xwerte und ywerte stehen mehrer zahlen, die einen graphen ergeben sollen.
also sowas wie
Code:
xwerte ywerte
   10         40
   20         80
   30          50

aber wenn das ganze gezeichnet wird, sieht es sehr ungenau aus.
mit 100 einträgen sieht das ganze aus, wie
Java.jpg
das aus.
Eigentlich ist es eine Binomialverteilung. So sieht es aber nicht aus.

Weiß einer warum das so ungenau arbeitet?
Gruß Tobias[/list]
 
was genau verstehst du nun unter 'ungenau'?
das sieht doch recht deutlich nach Stufen von 6 Pixeln aus
und du hast in deinem Code ja angegeben, dass jeder Wert mit 6 mulitpliziert wird,

also wird aus 0,1,2 -> 0,6,12, daher 6 Pixel Unterschied zwischen 2 Werten

-----------

sinnvoll wäre übrigens noch die Angabe der x und y-Arrays zum selber testen:

int[] x = new int[]{10,20,30, ..};
 
ungenau ist daran, dass da stufen zu sehen sind.
Bei 100 Einträgen in den Arrays müssten folgende Werte die Kurve ergeben:
Code:
32	0.0112%	0.0204%	100%	
33	0.0232%	0.0436%	99.979%	
34	0.0458%	0.0894%	99.956%	
35	0.0863%	0.1758%	99.910%	
36	0.1559%	0.3318%	99.824%	
37	0.2697%	0.6016%	99.668%	
38	0.4472%	1.0489%	99.398%	
39	0.7110%	1.7600%	98.951%	
40	1.0843%	2.8443%	98.239%	
41	1.5869%	4.4313%	97.155%	
42	2.2292%	6.6605%	95.568%	
43	3.0068%	9.6673%	93.339%	
44	3.8952%	13.562%	90.332%	
45	4.8474%	18.410%	86.437%	
46	5.7958%	24.205%	81.589%	
47	6.6590%	30.864%	75.794%	
48	7.3527%	38.217%	69.135%	
49	7.8028%	46.020%	61.782%	
50	7.9589%	53.979%	53.979%	
51	7.8028%	61.782%	46.020%	
52	7.3527%	69.135%	38.217%	
53	6.6590%	75.794%	30.864%	
54	5.7958%	81.589%	24.205%	
55	4.8474%	86.437%	18.410%	
56	3.8952%	90.332%	13.562%	
57	3.0068%	93.339%	9.6673%	
58	2.2292%	95.568%	6.6605%	
59	1.5869%	97.155%	4.4313%	
60	1.0843%	98.239%	2.8443%	
61	0.7110%	98.951%	1.7600%	
62	0.4472%	99.398%	1.0489%	
63	0.2697%	99.668%	0.6016%	
64	0.1559%	99.824%	0.3318%	
65	0.0863%	99.910%	0.1758%	
66	0.0458%	99.956%	0.0894%	
67	0.0232%	99.979%	0.0436%	
68	0.0112%	100%	0.0204%	
69	0.0052%	100%	0.0091%	
70	0.0023%	100%	0.0039%	
71	0.0009%	100%	0.0016%	
72	0.0003%	100%	0.0006%	
73	0.0001%	100%	0.0002%	
74	0.0000%	100%	0.0000%

dabei interessiert nur die zweite Spalte!

Das sind so viele Einträge... Da muss das doch eine schöne runde Kurve ergeben und nicht so ein paar Stufen.

Das ganze nehme ich nur *6, damit das ein bisschen mehr gezogen ist und man bei den kleinen Werten auch was erkennt.
 
was sollen diese komischen %-Werte?
du benutzt ein int[], da können nur ganze Zahlen drin sein,
0, 1, 2, oder vielleicht auch eine 3 😉

mach dir doch analog zur Zeichnung eine Ausgabe,
dann siehst du was im Array drinsteht,

wie gesagt brauch man zum testen eine verwertbare Zahlendarstellung,

z.B. 0,0,1,4,6,3,

was man so copy&paste ausprobieren kann,
mit merkwürdigen %-Tabellen ist niemandem geholfen


edit: deine Darstellung sieht genau wie deine Werte aus, nur eben als int gerundet:
0,1,1,2,3,3,4,5,6,7,7,8...
 
jaja.. das ist mir schon klar 😀 .
Die oben erstellte Tabelle stammt aus einer anderen Funktion meines Programms. Dort werden für alle Werte von 0 bis 100 die Wahrscheinlichkeiten ausgerechnet und nur in der Tabelle stehen dann die %-Zeichen. In die Arrays werden seperat die gerundeten Werte geschrieben.

Au man.. klaar!!!
Das ist doch total klar, dass das ungenau ist, wenn ich gerundete Integer-Werte nehme.
Zwischen 7.3527, 7.8028, 7.9589, 7.8028 und 7.3527 existiert ja dann garkein Unterschied mehr 😀.
Ich sollte das ganze vorher vielleicht mal mit 10 oder so multiplizieren. Dann wird das genauer.

Oh man.. Dass ich da nicht vorher drauf gekommen bin 😀.

Danke für den Tipp :wink:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben