2017-10-27 4 views
0

私はC++ BuilderプログラムでSteema TChartを使用しています。ユーザが定義した傾きでポイントを通過してTChartの限界に達する線を描く必要があります。限界によって、私はグラフィックを囲む矩形を意味します。Steema TChartの境界に限定して線を引く方法は?

下の画像では、私が言及した矩形を超えていることがわかります。

enter image description here

すべてのヘルプははるかに高く評価されます!

答えて

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

+0

非常に素晴らしく、きれいな解決策! – canellas

+0

問題を正しく解決したと思われる場合は、回答を受け入れることができます – Yeray

関連する問題