2016-10-24 7 views
0

FiremonkeyでPlotGridコンポーネントを使用しています。その中に放物線を描きたいと思っています。 a、b、cを入力(> ax^2 + bx + c = 0)とする非常に簡単なプログラムを考えると、2次方程式を解くつもりです。DelphiがPlotGirdで放物線を描く

放物線で表現できることはご存知のはずですが、私は、この手順を使用することができることを考えた:

procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single); overload; 

あなたはこの絵が良い意味を理解するために見ることができます:

enter image description here

私はPlotGridで放物線を描くことができるようにしたいので、この方法で私は私の行のための "コンテナ"を持つことができます。また、コンポーネントのサイズを変更したり、モバイルデバイスを使用している場合、x/y軸を再描画する必要はありません。これは良い方法ですか?


私は少しに状況を研究している、これは私が考えているものです:

放物線の焦点 coordsのが手順でセンターと呼ばれるものでなければなりません。 Radius.Xは方程式の解の1つの値でなければなりません。 I Radius.Yは、頂点の位置にする必要があります。

スイープ角度を設定する方法がわかりません。これはあまりにも複雑ですか?放物線を描くためのもっと良い解決策を見つけるべきでしょうか?

答えて

2

楕円弧で描くことはできませんが、必要なカーブの形をしません(中間点付近の小さな放物線部分のみ近似できます)。

FiremonkeyグラフィックスエンジンがB ezier curvesをサポートしている場合、Bezierで正確な放物線を描くことができます。それは、電源ごとに

F(x) = -b/2a + (t - 0.5) * needed_parabola_X_range 
F(y) = a*F(x)^2 + b * F(x) + c 

係数、急行X-及びパラメトリック三次曲線のY-部分だ計算するには、その後、バーンスタイン多項式基底にそれらを変換する(ここではあなたがBezier mathのいくつかの理解が必要です)

VCL例

var 
    a, b, c, w: Double; 
    b2a, baw: Double; 
    P: array[0..3] of TPoint; 
    Cx, Cy: array[0..3] of Double; 
begin 
    //vertex at (200, 100) 
    a := 0.05; 
    b := -20; 
    c := 2100; 
    W := 160; //width, distance between parabola ends 
    b2a := - 0.5 * b/a; 
    baw := b2a - 0.5 * W; 
    Cx[0] := baw; 
    Cx[1] := W; 
    Cx[2] := 0; 
    CX[3] := 0; 
    Cy[0] := a * baw * baw + c + b * baw; 
    Cy[1] := b * W + 2 * a * W * baW; 
    Cy[2] := a * W * W; 
    Cy[3] := 0; 
    p[0] := Point(Round(Cx[0]), Round(Cy[0])); 
    p[1].X := Round(cx[0] + cx[1]/3); 
    p[1].Y := Round(cy[0] + cy[1]/3); 
    p[2].X := Round(cx[0] + (2 * cx[1] + cx[2])/3); 
    p[2].Y := Round(cy[0] + (2 * cy[1] + cy[2])/3); 
    p[3].X := Round(cx[0] + cx[1] + cx[2] + cx[3]); 
    p[3].Y := Round(cy[0] + cy[1] + cy[2] + cy[3]); 
    Canvas.PolyBezier(P); 
+0

値a、b、およびcは、y? –

+0

a、b、cはあらかじめ定義された係数です(作成者はそれらを入力として取得します)。ここでは、合理的な座標で頂点を作るために値を選んだ – MBo