我已经看过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.我想指出:
代码工作正常,因为它绘制了正确的抛物线但结果不是最佳的,因为缺乏分辨率。我希望能够“放大”抛物线,我试图操纵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的乘数。我不确定它是否在移动设备中正常工作。有什么建议吗?
答案 0 :(得分:4)
当您将点坐标相乘时,您确实放大了抛物线底部,但使图像更粗糙,因为您降低了点的频率。你实际上想要做相反的事情,放大但保持(或增加)点频率。你显然也选择了考虑屏幕上像素的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
第二个系列用深蓝色绘制,结果是: