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

Image

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.