Page 1 of 1
TpolarSeries and fillzone
Posted: Wed Jun 03, 2009 8:55 am
by 10050873
Hello,
I have a TpolarSeries and i am looking a way to fill each zone with a different color like the picture below
Is it possible?
Thanks for help
@Yeray: I've edited you post to make the picture visible
Posted: Wed Jun 03, 2009 11:33 am
by yeray
Hi Calou,
Here is an example:
Code: Select all
uses TeCanvas, Math;
var Colors: array of TColor;
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
for i:=0 to 8 do
begin
if i > 0 then Series1.AddPolar(i*30, Series1.YValue[Series1.Count-1]);
Series1.AddPolar(i*30, 0);
if i < 8 then Series1.AddPolar(i*30, random*30);
end;
Series1.Pointer.Visible := false;
SetLength(Colors,Series1.Count div 3);
for i:=0 to length(Colors) do
begin
Colors[i] := RGB(Random(255), Random(255), Random(255));
end;
end;
procedure TForm1.Chart1AfterDraw(Sender: TObject);
var i: Integer;
tmpPoints: TPointArray;
begin
SetLength(tmpPoints,3);
for i:=0 to Series1.Count-1 div 3 do
begin
tmpPoints[0].X := Series1.CalcXPos(i*3);
tmpPoints[0].Y := Series1.CalcYPos(i*3);
tmpPoints[1].X := Series1.CalcXPos(i*3+1);
tmpPoints[1].Y := Series1.CalcYPos(i*3+1);
tmpPoints[2].X := Series1.CalcXPos(i*3+2);
tmpPoints[2].Y := Series1.CalcYPos(i*3+2);
Chart1.Canvas.Brush.Color := Colors[i];
Chart1.Canvas.Polygon(tmpPoints);
end;
end;
PS: This may help when we'll implement the rose series (TV52013339)
Posted: Wed Jun 03, 2009 1:06 pm
by 10050873
Exactly what i wanted to do
Thank you very much
Posted: Thu Jun 04, 2009 1:08 pm
by 10050873
Hello,
Could it be possible to have in the legend the signification of the color
For example a green square and text for signification, a red square and an other text...
In my case i want legend for the color not for series values
Thanks
Regards
Posted: Thu Jun 04, 2009 2:34 pm
by yeray
Hi Calou,
The possibility to have a fully customizable legend is already in the wish list (TV52010510). So I'm afraid that in the meanwhile the only solution you have is custom drawing to the canvas.
Posted: Fri Jun 05, 2009 9:13 am
by 10050873
Hello,
Ok for the legend
I have this code and i am surprised because the zone are not colored
Code: Select all
procedure TfrmRoseVent.DrawAllPetales(num_chart:integer;prjt:string);
var
prctg_max,prctg,ind: Integer;
begin
...
//parcours des enregs
while not frmMain.IbcQryRd.Eof do
begin
//dessine le contour d'une pétale
DrawPetale(num_chart,frmMain.IbcQryRd.FieldByName('ANGLE').AsInteger,frmMain.SpnEdtAngle.Value,prctg);
ColorPetale(num_chart,ind,frmMain.IbcQryRd.FieldByName('VIT_MOY').AsFloat);
frmMain.IbcQryRd.Next;
Inc(ind,3);
end;//fin du while parcours des enregs
end;
//dessine une petale de la rose
procedure TfrmRoseVent.DrawPetale(num_chart,angle_deb, pas_angle: integer; prctg: double);
begin
//Déssine le contour
TabSeriesRoseVent[num_chart].AddPolar(angle_deb,prctg);
TabSeriesRoseVent[num_chart].AddPolar(angle_deb+pas_angle,prctg);
TabSeriesRoseVent[num_chart].AddPolar(angle_deb+pas_angle,0);
end;
//colorie toutes les pétales
procedure TfrmRoseVent.ColorPetale(num_chart,ind_serie:integer ;vit_moy:double);
var
tmp_pts: TPointArray;
begin
SetLength(tmp_pts,3);
//colorie
tmp_pts[0].X:=TabSeriesRoseVent[num_chart].CalcXPos(ind_serie);
tmp_pts[0].Y:=TabSeriesRoseVent[num_chart].CalcYPos(ind_serie);
tmp_pts[1].X:=TabSeriesRoseVent[num_chart].CalcXPos(ind_serie+1);
tmp_pts[1].Y:=TabSeriesRoseVent[num_chart].CalcYPos(ind_serie+1);
tmp_pts[2].X:=TabSeriesRoseVent[num_chart].CalcXPos(ind_serie+2);
tmp_pts[2].Y:=TabSeriesRoseVent[num_chart].CalcYPos(ind_serie+2);
TabChrtRoseVent[num_chart].Canvas.Brush.Color := clYellow;
TabChrtRoseVent[num_chart].Canvas.Polygon(tmp_pts);
end;
What could be wrong?
Thanks for help
Regards
Posted: Fri Jun 05, 2009 9:41 am
by yeray
Hi Calou,
Yes, the problem is that drawing directly to the canvas needs to be done into an event that is called every time the chart is painted. For example at OnAfterDraw event.
So, you should call your ColorPetale method at OnAfterDraw for example.