我已经看过this示例,并且已经阅读/看过许多文档/视频,但是我被困在特定的地方。我已使用此代码在PlotGrid
中绘制抛物线。
procedure TForm1.PlotGridPaint(Sender: TObject; Canvas: TCanvas;
const [Ref] ARect: TRectF);
var i: integer;
x: double;
FPoints: TPolygon;
xPixels, yPixels: double;
Origin: TPointF;
begin
SetLength(FPoints, 600);
PlotGrid.Canvas.Stroke.Color := TAlphaColorRec.Darkred;
PlotGrid.Canvas.Stroke.Thickness := 2;
//sizes
Origin.X := PlotGrid.Width/2;
Origin.Y := PlotGrid.Height/2;
x := -300;
for I := 0 to High(FPoints) do
begin
FPoints[I].X := Origin.x + x;
FPoints[I].Y := Origin.y - (x*x); //plot f(x) = x^2
x := x + 1;
end;
for i := 1 to High(FPoints) do
begin
Canvas.DrawLine(FPoints[i-1], FPoints[i], 1);
end;
end;
此代码有效,并产生此输出。
如您所见,它是一个(奇怪的)函数x ^ 2。当然,以下代码行表示方程式:
FPoints[I].Y := Origin.y - (x*x); //plot f(x) = x^2
如果使用
Origin.y - (2*x*x - 5)
更改了上面的代码,则意味着我要绘制f(x)= 2x ^ 2-5。我想指出一下:我正在使用Firemonkey,但不像VCL那样支持Beizer
函数x ^ 2仅作为示例,我希望能够绘制各种抛物线。
该代码可以正常工作,因为它绘制了正确的抛物线,但由于缺乏分辨率,因此结果不是最佳的。我希望能够“放大”抛物线,并且尝试操纵X坐标,但是效果不佳。
你有什么主意吗?如何缩放抛物线并根据屏幕尺寸更改分辨率?
我当时想这样做,但这似乎是错误的方式:
for I := 0 to High(FPoints) do
begin
FPoints[I].X := Origin.x + x * 30;
FPoints[I].Y := Origin.y - (-x*x) * 30;
x := x + 1;
end;
结果是这样的:
更好,但是曲线不是“平滑的”,我添加了30的乘数。我不确定它是否也可以在移动设备上正常工作。有什么建议吗?
最佳答案
当您将点坐标相乘时,确实确实放大了抛物线底部,但由于降低了点的频率,因此使图像更加粗糙。您实际上想做相反的事情,放大但保持(或增加)点频率。显然,您还考虑了屏幕上的像素而选择了x值的范围,但是使用x ^ 2函数时,y值很快就会出现在屏幕外,因此您需要缩放y值。
我建议您像现在一样保留x值,并按y值缩放
FPoints[i].Y := Origin.Y - (x * x * 0.1); // plot f(x) = x^2 * 0.1
我进行了一个测试,添加了另一个
TPolygon
并将其赋予y值FPoints2[i].Y := Origin.Y - (x * x * 0.01); // plot f(x) = x^2 * 0.01
第二个系列被漆成深蓝色,其结果是:
关于delphi - 德尔福图抛物线与分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40620118/