# Kreisdiagramm mit Rundung



## Semox (30. Dez 2009)

Hallo Java-Freunde

Ich habe ein Kreisdiagrammsapplet geschrieben, bei dem ich nicht weiß wie man das Problem mit dem Rundungsrest lösen soll, damit keine Lücken zwischen den Tortenstücken entstehen. Wie macht man das?

Hier ist mein KKB:


```
import java.awt.*;
import java.applet.*;
import java.util.Random;

public class Torte extends Applet {

	private static final long serialVersionUID = -3634359988154705317L;

	private float[] werte = { 14, 25, 70, 240, 10, 120, 140, 50, 30, 89, 270,
			350 };

	private static Color[] ColorBars = { Color.red, Color.orange, Color.yellow,
			Color.green, Color.cyan, Color.blue, Color.pink, Color.magenta,
			Color.lightGray };

	Random r = new Random();
	int x = 0;
	int y = 0;

	public void paint(Graphics g) {
		float startAngle = 0f;
		float arcAngle = 0f;
		float summe_wert = 0f;
		float arc_mean = 0f;
		setSize(200, 200);

		for (int i = 0; i < werte.length; i++) {
			summe_wert += werte[i];
		}

		// Groesse eines Winkels im Verhaeltnis zur Summe aller Mengen

		arc_mean = 360 / summe_wert;

		for (int j = 0; j < werte.length; j++) {

			startAngle += arcAngle;
			int index = r.nextInt(7);
			g.setColor(ColorBars[index]);
			arcAngle = arc_mean * werte[j];
			g.fillArc(x, y, 200, 200, (int) startAngle, (int) arcAngle);

		}
	}

}
```

Es funktioniert zwar, aber wie man sieht, muß ich am Ende vor der Darstellung in Integer casten. Damit entsteht das Problem. Ich bitte um Euren Rat.

Viele Grüße
Semo


----------



## SlaterB (30. Dez 2009)

tja, du musst die Rundungen auch in die Addition von startAngle mitnehmen, z.B.


```
public void paint(Graphics g)
    {
        int startAngle = 0;
        int arcAngle = 0;
        [..]

        for (int j = 0; j < werte.length; j++)
        {
            startAngle += arcAngle;
            [..]
            arcAngle = (int)(arc_mean * werte[j]);
        }
    }
```
bei all dem Abrunden bleiben dann am Ende aber 5-10 Grad leer,
statt immer nur abzurunden also eher auf- und abrunden, außerdem den noch übrig bleibenden Rest merken
und beim nächsten Abschnitt mit dazuzählen,

Beispiel:
erste drei Abschnitte 7.4 Grad, 5.4 Grad, 6.6 Grad

den ersten auf 7 abrunden, die 0.4 merken,
beim nächsten 5.4 eigentlich abrunden, wegen den 0.4 Überstand aber insgesamt 5.8 auf 6 aufrunden, -0.2 merken
als nächstes aus den 6.6 6.4 machen und auf 6 abrunden, 0.4 merken,

so bleibt bis zum Ende immer nur ein Fehler +- 0.5, den am Ende vergessen, bis zur vollen 360 malen,
ist nicht genau, aber was soll man machen wenn g.fillArc() ganze Grad erwartet, da kann man nicht zaubern


----------



## System.exit(0) (30. Dez 2009)

Hallo,

noch geschickter wäre:

(int) Startangle = (int) ( (int)Startangle des Vorgängers + arcAngle des Vorgängers)


Letztes Teilstück:

(int) arcangle = 360 - ( (int) Startangle des Vorgängers + (int) arcAngle des Vorgängers )

somit sidn die Rundungen immer enthalten, und mal ehrlich, wer kann auf einen Grad genau schauen?

Gruß

System.exit(0)


----------



## Semox (30. Dez 2009)

Danke Euch beiden. Ich werde es mal probieren.

Gruß,
Semo


----------



## Semox (30. Dez 2009)

Hallo

Ich habe den Code zumindest dahingehend angepaßt, so daß der letzte Rest gefüllt wird. 

[Java]
//hinter der for-Schleife steht nun dies:
startAngle_rest = startAngle + arcAngle;
		peanuts = 360 - startAngle_rest;

		g.setColor(Color.black);
		g.fillArc(x, y, 200, 200, startAngle_rest, peanuts);
[/Java]

lg,
Semo


----------



## lumo (31. Dez 2009)

System.exit(0) hat gesagt.:


> und mal ehrlich, wer kann auf einen Grad genau schauen?


wenn du schon so fragst... der winkelmesser (und sogar das iPhone :lol


----------

