【问题标题】:How to draw a line limited to Steema TChart boundaries?如何画一条仅限于 Steema TChart 边界的线?
【发布时间】:2017-10-27 19:21:32
【问题描述】:

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

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

任何帮助将不胜感激!

【问题讨论】:

    标签: c++ c++builder teechart


    【解决方案1】:

    您可以手动绘制这些线条。即在delphi中:

    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;
    

    【讨论】:

    • 一个非常好的和干净的解决方案!
    • 如果您认为正确解决了问题,您可以接受答案
    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2021-11-29
    相关资源
    最近更新 更多