Entwickler-Ecke

Multimedia / Grafik - Kreis Diagramm (Segmente)


gerd8888 - Do 14.03.13 22:00
Titel: Kreis Diagramm (Segmente)
Hallo,

ich würde gerne ein Kreis-Diagramm bzw. Kuchendiagramm oder einzelne Segmente in canvas darstellen.
Mit canvas.elipse kann ich zwar einen Kreis zeichnen aber die einzelnen Prozente dann nicht mehr trennen.

Ich stelle mir das etwas komplizierter vor. Muss man die Vektorgrafik vielleicht selbt irgendwie mit cos(a)
arbeiten.

So ein Diagramm was man z.B. bei der Bundestagswahl sieht mit Prozenten, das suche ich.
Hat da vielleicht schon jemand etwas fertiges?


Jann1k - Do 14.03.13 23:01

Etwas fertiges dazu kann ich nicht anbieten, aber TCanvas besitzt die Methode Arc. Damit kannst du Kreisbögen zeichnen.

€: Eben nachgeschaut, es gibt sogar die Methode Pie, die zeichnet direkt das ganze Kuchenstück.


Delete - Do 14.03.13 23:26

- Nachträglich durch die Entwickler-Ecke gelöscht -


gerd8888 - Fr 15.03.13 19:34

Hallo,

ich konnte jetzt das Problem lösen. Weiss aber nicht, ob es noch einfacher geht?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
procedure kreissegment(w1,w2:real; f1,f2,f3:byte);
var
Pi,winkel,grad1,grad2:real;
m,r,h,w,x1,y1,x2,y2:integer;

begin

  Pi := 3.14159268;
  m := 100;          // Mittelpunkt
  r := 50 ;          // Radius
  h := 200;          // Höhe
  w := 200;          // Breite

  grad1 := -90+w1; //bei 12 Uhr, dann dem Urzeigersinn, darum -90
  winkel := pi*grad1/180;
  x1 := Trunc(Cos(winkel)* r) + m;
  y1 := Trunc(Sin(winkel)* r) + m;

  grad2 := grad1+w2;
  winkel := pi*grad2/180;
  x2 := Trunc(Cos(winkel)* r)+m;
  y2 := Trunc(Sin(winkel)* r)+m;

  statistik1.Canvas.Pen.Color := 0;
  statistik1.canvas.Brush.Color := rgb(f1,f2,f3);
  statistik1.Canvas.Pie(10,10,h-10,w-10,x2,y2,x1,y1);
end;

function prozent_to_winkel(prozent:real):real;
begin
  prozent_to_winkel:=360*prozent/100
end;

procedure Tstatistik1.Button1Click(Sender: TObject);
begin
 //erstes Beispiel mit Grad Angabe (90 Grad, 90 Grad, 45 Grad)
 // kreissegment(0,90,0,0,255);
 // kreissegment(90,90,0,255,0);
 // kreissegment(180,45,255,0,0);

  //zweites Beispiel mit Prozent (3 Stück Kuchen mit jeweils 33.33 Prozent)
  kreissegment(0,prozent_to_winkel(33.33),0,0,255);
  kreissegment(prozent_to_winkel(33.33),prozent_to_winkel(33.33),0,255,0);
  kreissegment(prozent_to_winkel(66.66),prozent_to_winkel(33.33),255,0,0);
end;


Delete - Sa 16.03.13 18:30

- Nachträglich durch die Entwickler-Ecke gelöscht -


gerd8888 - So 17.03.13 17:12

Hallo Frühlingsrolle,

ich wollte das Beispiel ausprobieren.
Das chart1 bzw. chart was dahinter steht unterstreicht mein delphi 2009 rot. Obwohl ich die 2 units eingebunden habe.
Wenn ich statt chart1 nur chart. hernehme unterstreicht er mir das nicht rot, aber das was dahinter steht.
Ich konnte es demnach nicht compilieren.

Gerd


Delete - So 17.03.13 17:31

- Nachträglich durch die Entwickler-Ecke gelöscht -


gerd8888 - So 17.03.13 18:07

Hallo Frühlingsrolle,

jetzt habe ich das Tchart in die Form platziert und es hat funktioniert.
Ich bekomme ein Kreisdiagramm und oben rechts noch mit der Schrift die dazugehoerige Farbe.
Ja, so wie ich es wollte.
Danke

Gerd


Delete - So 17.03.13 18:40

- Nachträglich durch die Entwickler-Ecke gelöscht -


Horst_H - Mo 18.03.13 10:32

Hallo,

@gerd8888:
ich fand Deine Version etwas statisch in Bezug auf die Koordinaten.
Auf beispielsweise http://stackoverflow.com/questions/3284003/how-do-i-call-the-pie-function steht es beschrieben, wie man es allgemeiner lösen kann.
Ich habe es etwas umgestrickt und in Lazarus umgesetzt.
ZufallsKuchendiagramm
Die TChart Lösung ist aber sicher viel fexibler und einfacher in der Handhabung.

Gruß Horst


gerd8888 - Mo 18.03.13 14:27

Hallo Horst,

naja gut, das ist eine kleine Spielerei. Ich musste das RequireDerivedFormResource := True; löschen, dann konnte ich es mir auch auf Lazerus ansehen.

Die Sachen mit dem Objektinspektor habe ich mir auch angesehen. Da kann man wirklich unglaublich viel machen.
Ich glaube mit view3d:=true und kreisdiagramm bin ich ganz glücklich.
Ist ja auch nur eine kleine Statistik (Auskunft über meine Video-dateien), die ich machen wollte.

Gerd