我正在使用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应该是顶点的位置。
我无法想象如何设置扫掠角度。这太复杂了吗?我应该找到另一个更好的解决方案来绘制抛物线吗?
答案 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);