德尔福绘图抛物线与分辨率

时间:2016-11-15 21:37:58

标签: delphi firemonkey

我已经看过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;

此代码有效并产生此输出。 this

你可以看到它是一个(奇怪的)函数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.我想指出:

  1. 我正在使用Firemonkey,它不像VCL那样支持Beizer
  2. 函数x ^ 2就是一个例子,我希望能够绘制各种抛物线。
  3. 代码工作正常,因为它绘制了正确的抛物线但结果不是最佳的,因为缺乏分辨率。我希望能够“放大”抛物线,我试图操纵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;
    

    结果如下:

    enter image description here

    它更好,但曲线不是“平滑”,我添加了30的乘数。我不确定它是否在移动设备中正常工作。有什么建议吗?

1 个答案:

答案 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

第二个系列用深蓝色绘制,结果是:

enter image description here