2016-11-15 75 views
1

我已經看到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)= 2×^ 2 - 5.我想指出的是:

  1. 我使用Firemonkey,它不支持Beizer像VCL確實
  2. 函數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的乘數。我不確定它是否可以在移動設備上正常工作。任何建議?

回答

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

+0

作爲一個可能有用的位信息 - 每個拋物線y = ax^2 + bx + c,其中a <> 0在您可以繪製的意義上是相同的,如下所示。繪製一個未縮放的基本拋物線y = x^2(例如上面的Tom的藍色拋物線),然後適當地替換圖形軸的原點和x尺度以及y尺度。 – Penguino