如何绘制仅限于Steema TChart边界的线?

时间:2017-10-27 19:21:33

标签: c++ c++builder teechart

我在C ++ Builder程序中使用Steema TChart,我需要绘制具有用户定义倾斜度的线条,这些线条通过一个点并上升到TChart的极限。限制,我的意思是围绕图形的矩形。

在下图中,您可以看到线条超出了我提到的矩形。

enter image description here

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您可以手动绘制这些线条。即,在德尔福:

uses Series, Math, TeCanvas;

procedure TForm1.Chart1AfterDraw(Sender: TObject);

  procedure DrawLine(ASeries: TChartSeries; ValueIndex: Integer; Angle: Integer);
  var P, P0, P1: TPoint;
      Alfa, AlfaTan: Double;
      R: TRect;
      Canvas: TCanvas3D;
  begin
    Alfa:=Angle*TeePiStep;
    R:=ASeries.ParentChart.ChartRect;
    Canvas:=ASeries.ParentChart.Canvas;
    P:=Point(ASeries.CalcXPos(ValueIndex), ASeries.CalcYPos(ValueIndex));

    if Angle mod 180 = 0 then
    begin
      if (P.Y > R.Top) and (P.Y < R.Bottom) then
         Canvas.HorizLine3D(R.Left, R.Right, P.Y, 0);
    end
    else if Angle mod 90 = 0 then
    begin
      if (P.X > R.Left) and (P.X < R.Right) then
         Canvas.VertLine3D(P.X, R.Top, R.Bottom, 0);
    end
    else
    begin
      AlfaTan:=Tan(Alfa);
      P0.Y:=P.Y+Round(AlfaTan*(P.X-R.Left));
      P0.X:=R.Left;

      if (P0.Y < R.Top) then
      begin
        P0.Y:=R.Top;
        P0.X:=P.X-Round((R.Top-P.Y)/AlfaTan);
      end
      else if (P0.Y > R.Bottom) then
      begin
        P0.Y:=R.Bottom;
        P0.X:=P.X-Round((R.Bottom-P.Y)/AlfaTan);
      end;

      P1.Y:=P.Y-Round(AlfaTan*(R.Right-P.X));
      P1.X:=R.Right;

      if (P1.Y < R.Top) then
      begin
        P1.Y:=R.Top;
        P1.X:=P.X-Round((R.Top-P.Y)/AlfaTan);
      end
      else if (P1.Y > R.Bottom) then
      begin
        P1.Y:=R.Bottom;
        P1.X:=P.X-Round((R.Bottom-P.Y)/AlfaTan);
      end;

      Canvas.Line(P0, P1);
    end;
  end;

begin
  DrawLine(Chart1[0], 2, 180);
  DrawLine(Chart1[0], 2, 165);
  DrawLine(Chart1[0], 2, 150);
  DrawLine(Chart1[0], 2, 120);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1.View3D:=False;
  Chart1.AddSeries(TPointSeries).FillSampleValues(5);
end;

example