环境 RAD Studio 10.1柏林使用Delphi TeeChart Pro v2017.22 170619 IntraWeb 14.1.14
我正在使用IntraWeb创建一个网页来显示各种图像。最近要求的其中一个是3D管道/管图像,其具有我控制的表面颜色轮廓/渐变,如以下概念图所示:
。
我需要能够旋转,平移和缩放此图像。我希望有一种方法可以使用TeeChart实现这一点。
据我所知,TChart仅支持表面网格,而不支持对象上的3D表面。
我想使用TeeChart,但我愿意接受其他可能性。我已经找到了可能支持这个但却找不到的其他组件。
我看过可能使用FMX,但IntraWeb是一个VCL应用程序。我知道FMX已经在VCL中使用,所以这是可能的。但是,如果这是可能的,我不确定是否可以创建具有颜色表面轮廓/渐变的管道。
答案 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;
另一种选择是使用两个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;