Delphi用PlotGird绘制抛物线

时间:2016-10-24 21:12:42

标签: delphi firemonkey

我正在使用Firemonkey的PlotGrid组件,我希望能够在其中绘制抛物线。给出一个非常简单的程序,它将a,b,c作为输入(> ax ^ 2 + bx + c = 0),我将解决二次方程式。

你应该知道可以用抛物线表示。我以为我可以使用这个程序:

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

您可以看到此图片以更好地理解其含义:

enter image description here

我希望能够在PlotGrid中绘制抛物线,因为用户通过这种方式我可以拥有一个"容器"为了我的路线。此外,如果我调整组件大小或使用移动设备,我不必重新绘制x / y轴。这是一个好方法吗?

我已经研究过一些情况,这就是我的想法:

抛物线的焦点坐标应该是程序中称为中心的。 Radius.X应该是方程解之一的值。 I Radius.Y应该是顶点的位置。

我无法想象如何设置扫掠角度。这太复杂了吗?我应该找到另一个更好的解决方案来绘制抛物线吗?

1 个答案:

答案 0 :(得分:2)

你不能用椭圆弧绘制抛物线,它不能给出所需的曲线形式(中间点附近只能得到一个小的抛物线)。

如果Firemonkey图形引擎支持B ezier curves,您可以使用Bezier绘制精确的抛物线。为了计算它的系数,以功率为基础表示参数三次曲线的X和Y-部分

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

然后将它们转换为Bernstein多项式基础(这里需要对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);