delphi - 德尔福图抛物线与分辨率

标签 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。我想指出一下:


我正在使用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;


结果是这样的:

enter image description here

更好,但是曲线不是“平滑的”,我添加了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


第二个系列被漆成深蓝色,其结果是:

enter image description here

关于delphi - 德尔福图抛物线与分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40620118/

相关文章:

delphi - 获取 Timage 内位图的坐标

ios - XE4 iOS 应用程序 : Unable to install package. (e8008015)

delphi - delphi中的自定义笔模式

delphi - FireMonkey PenMode 等效项 - DrawLine

delphi - 如何在任意类型上调用 GetEnumerator?

delphi - Delphi中的静态属性

android - 修复了 Android 上使用 fmx 字体的 : canvas. 填充文本被 block 背景包围的问题

android - Delphi Seattle Android TNotificationCenter CancelAll 在触发一个通知后不起作用

ios - 如何为可以通过照片库官方 iOS (Delphi/Firemonkey) 访问的图像创建自己的 App 文件夹

Delphi 10.4.2 FMX 如何制作平视通知?