Delphi TChart能否创建一个表面颜色与TColorGridSeries相似的圆柱体/管道/管道

Delphi TChart能否创建一个表面颜色与TColorGridSeries相似的圆柱体/管道/管道,delphi,pipe,teechart,Delphi,Pipe,Teechart,环境 使用Delphi的RAD Studio 10.1 Berlin TeeChart Pro v2017.22 170619 IntraWeb 14.1.14 我正在使用IntraWeb创建一个网页来显示各种图像。其中一个是最近要求的3D管道图像,其表面颜色轮廓/梯度由我控制,如以下概念图所示: 我需要能够旋转,平移和缩放这个图像。我希望有一种方法可以使用TeeChart实现这一点 据我所知,TChart仅支持曲面网格,而不支持对象上的3D曲面 我想使用TeeChart,但我对其他可能性持开

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

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

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

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

我想使用TeeChart,但我对其他可能性持开放态度。我已经寻找了可能支持这一点的其他组件,但没有找到任何组件


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

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

  • 一个选项是使用
    tVolumPipeSeries
    。即:

    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;
    
    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;
    

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

    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;
    
    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;
    
    使用TeeSurfa、Math;
    var上表面、下表面:Tsurface系列;
    过程TForm1.FormCreate(发送方:TObject);
    var nRev,countZ,i,z:整数;
    alpha,x,y:Double;
    开始
    图表1.图例.可见:=假;
    图表1.图表3百分比:=100;
    图1.纵横比:=假;
    图表1.纵横比缩放:=80;
    图1.纵横比旋转:=320;
    图1.坡向标高:=350;
    图1.墙可见:=假;
    图表1.轴可见:=假;
    净现值:=50;
    countZ:=20;
    底面:=图表1。添加系列(TSurfaceSeries)作为TSurfaceSeries;
    上表面:=图表1。添加系列(TSurfaceSeries)作为TSurfaceSeries;
    上表面。不规则网格:=真;
    topSurface.XValues.Order:=loNone;
    上表面.YValues.Order:=loNone;
    topSurface.Pen.Color:=Chart1.Canvas.ColorFrom(bottomSurface.Pen.Color,150);
    底面。不规则网格:=真;
    底面.XValues.Order:=loNone;
    底面.YValues.Order:=loNone;
    bottomSurface.Pen.Color:=Chart1.Canvas.ColorFrom(bottomSurface.Pen.Color,150);
    对于z:=0到countZ-1 do
    开始
    对于i:=0到nRev-1 do
    开始
    α:=DegToRad(i*360/nRev);
    x:=Cos(α);
    y:=Sin(α);
    
    如果alpha关于交互性,如果您想旋转序列(而不是图像),我不确定您是否可以将事件从Intraweb转发到图表以旋转它

    • 一个选项是使用
      tVolumPipeSeries
      。即:

      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;
      
      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;
      

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

      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;
      
      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;
      
      使用TeeSurfa、Math;
      var上表面、下表面:Tsurface系列;
      过程TForm1.FormCreate(发送方:TObject);
      var nRev,countZ,i,z:整数;
      alpha,x,y:Double;
      开始
      图表1.图例.可见:=假;
      图表1.图表3百分比:=100;
      图1.纵横比:=假;
      图表1.纵横比缩放:=80;
      图1.纵横比旋转:=320;
      图1.坡向标高:=350;
      图1.墙可见:=假;
      图表1.轴可见:=假;
      净现值:=50;
      countZ:=20;
      底面:=图表1。添加系列(TSurfaceSeries)作为TSurfaceSeries;
      上表面:=图表1。添加系列(TSurfaceSeries)作为TSurfaceSeries;
      上表面。不规则网格:=真;
      topSurface.XValues.Order:=loNone;
      上表面.YValues.Order:=loNone;
      topSurface.Pen.Color:=Chart1.Canvas.ColorFrom(bottomSurface.Pen.Color,150);
      底面。不规则网格:=真;
      底面.XValues.Order:=loNone;
      底面.YValues.Order:=loNone;
      bottomSurface.Pen.Color:=Chart1.Canvas.ColorFrom(bottomSurface.Pen.Color,150);
      对于z:=0到countZ-1 do
      开始
      对于i:=0到nRev-1 do
      开始
      α:=DegToRad(i*360/nRev);
      x:=Cos(α);
      y:=Sin(α);
      
      如果TeeVolumePie的渲染速度与两个曲面相比相当慢,那么我也看不到获得渐变颜色的方法。如何使两个曲面在颜色之间显示平滑的渐变,以获得原始图像中的轮廓效果?由于OpenGL初始化,上面的
      TVoluemPipeSeries
      示例速度较慢。在这个例子中,我将随机颜色设置为
      TSurfaceSeries
      单元格。你可以设置使用调色板来设置你想要的颜色TeeVolumePie的渲染速度与两个表面相比相当慢,我也看不到一种获得渐变颜色的方法。如何使两个曲面在颜色之间显示平滑的渐变,以获得原始图像中的轮廓效果?由于OpenGL初始化,上面的
      TVoluemPipeSeries
      示例速度较慢。在这个例子中,我将随机颜色设置为
      TSurfaceSeries
      单元格。您可以使用调色板设置所需的颜色