TChart可以创建一个圆柱/管/管,其表面着色类似于TColorGridSeries

时间:2017-08-31 16:37:16

标签: delphi pipe teechart

环境  RAD Studio 10.1柏林使用Delphi  TeeChart Pro v2017.22 170619  IntraWeb 14.1.14

我正在使用IntraWeb创建一个网页来显示各种图像。最近要求的其中一个是3D管道/管图像,其具有我控制的表面颜色轮廓/渐变,如以下概念图所示:

Pipe Concept Image

我需要能够旋转,平移和缩放此图像。我希望有一种方法可以使用TeeChart实现这一点。

据我所知,TChart仅支持表面网格,而不支持对象上的3D表面。

我想使用TeeChart,但我愿意接受其他可能性。我已经找到了可能支持这个但却找不到的其他组件。

我看过可能使用FMX,但IntraWeb是一个VCL应用程序。我知道FMX已经在VCL中使用,所以这是可能的。但是,如果这是可能的,我不确定是否可以创建具有颜色表面轮廓/渐变的管道。

1 个答案:

答案 0 :(得分:0)

关于交互性,如果要旋转系列(而不是图像),我不确定您是否可以将事件从Intraweb转发到图表以旋转它。

  • 选项是使用TVoluemPipeSeries。即:

    uses TeeGLCanvas, TeeVolumePipe;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Chart1.Canvas:=TGLCanvas.Create;
    
      Chart1.Legend.Visible:=False;
      Chart1.Chart3DPercent:=100;
      Chart1.Aspect.Orthogonal:=False;
      Chart1.Aspect.Rotation:=230;
    
      with Chart1.AddSeries(TVolumePipeSeries) as TVolumePipeSeries do
      begin
        FillSampleValues;
        Pen.Color:=Chart1.Canvas.ColorFrom(Pen.Color,150);
      end;
    end;
    

VolumePipe

  • 另一种选择是使用两个TSurfaceSeries。即:

    uses TeeSurfa, Math;
    
    var topSurface, bottomSurface: TSurfaceSeries;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var nRev, countZ, i, z: Integer;
        alpha, x, y: Double;
    begin
      Chart1.Legend.Visible:=False;
      Chart1.Chart3DPercent:=100;
      Chart1.Aspect.Orthogonal:=False;
      Chart1.Aspect.Zoom:=80;
      Chart1.Aspect.Rotation:=320;
      Chart1.Aspect.Elevation:=350;
      Chart1.Walls.Visible:=False;
      Chart1.Axes.Visible:=False;
    
      nRev:=50;
      countZ:=20;
    
      bottomSurface:=Chart1.AddSeries(TSurfaceSeries) as TSurfaceSeries;
      topSurface:=Chart1.AddSeries(TSurfaceSeries) as TSurfaceSeries;
    
      topSurface.IrregularGrid:=True;
      topSurface.XValues.Order:=loNone;
      topSurface.YValues.Order:=loNone;
      topSurface.Pen.Color:=Chart1.Canvas.ColorFrom(bottomSurface.Pen.Color,150);
    
      bottomSurface.IrregularGrid:=True;
      bottomSurface.XValues.Order:=loNone;
      bottomSurface.YValues.Order:=loNone;
      bottomSurface.Pen.Color:=Chart1.Canvas.ColorFrom(bottomSurface.Pen.Color,150);
    
      for z:=0 to countZ-1 do
      begin
        for i:=0 to nRev-1 do
        begin
          alpha:=DegToRad(i*360/nRev);
          x:=Cos(alpha);
          y:=Sin(alpha);
    
          if alpha<DegToRad(180) then
            topSurface.AddXYZ(x, y, z, '', RGB(random(255), random(255), random(255)))
          else
            bottomSurface.AddXYZ(x, y, z, '', RGB(random(255), random(255), random(255)));
        end;
    
        bottomSurface.AddXYZ(topSurface.XValues.MaxValue, Sin(ArcCos(topSurface.XValues.MaxValue)), z, '', RGB(random(255), random(255), random(255)));
        bottomSurface.AddXYZ(topSurface.XValues.MinValue, Sin(ArcCos(topSurface.XValues.MinValue)), z, '', RGB(random(255), random(255), random(255)));
      end;
    end;
    

Surfaces