【问题标题】:Delphi draw parabola with PlotGirdDelphi 用 PlotGird 绘制抛物线
【发布时间】:2017-03-06 18:36:42
【问题描述】:

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

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

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

你可以看这张图更好地理解意思:

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


我研究了一下情况,这是我的想法:

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

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

【问题讨论】:

    标签: delphi firemonkey


    【解决方案1】:

    你不能用椭圆弧画抛物线,它没有给出所需的曲线形式(只能近似中点附近的小抛物线)。

    如果 Firemonkey 图形引擎支持 Bezier 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
    

    然后将它们转化为伯恩斯坦多项式基(这里需要对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);
    

    【讨论】:

    • a、b 和 c 的值是相对于 y 计算的?
    • a,b,c 是预定义的系数(作者将它们作为输入)。在这里,我选择了在合理坐标处制作顶点的值
    猜你喜欢
    • 1970-01-01
    • 2022-11-13
    • 2015-09-29
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多