Delphi TChart能否创建一个表面颜色与TColorGridSeries相似的圆柱体/管道/管道
环境 使用Delphi的RAD Studio 10.1 Berlin TeeChart Pro v2017.22 170619 IntraWeb 14.1.14 我正在使用IntraWeb创建一个网页来显示各种图像。其中一个是最近要求的3D管道图像,其表面颜色轮廓/梯度由我控制,如以下概念图所示: 我需要能够旋转,平移和缩放这个图像。我希望有一种方法可以使用TeeChart实现这一点 据我所知,TChart仅支持曲面网格,而不支持对象上的3D曲面 我想使用TeeChart,但我对其他可能性持开放态度。我已经寻找了可能支持这一点的其他组件,但没有找到任何组件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,但我对其他可能性持开
我已经研究过使用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
单元格。你可以设置使用调色板来设置你想要的颜色TeeVolumePie的渲染速度与两个表面相比相当慢,我也看不到一种获得渐变颜色的方法。如何使两个曲面在颜色之间显示平滑的渐变,以获得原始图像中的轮廓效果?由于OpenGL初始化,上面的TSurfaceSeries
示例速度较慢。在这个例子中,我将随机颜色设置为TVoluemPipeSeries
单元格。您可以使用调色板设置所需的颜色TSurfaceSeries
- 一个选项是使用