7,2抛物线 ■7.2.1抛物线的参数拟合 抛物线的数学基础和几何意义 ■在数学基础中,我们知道:已知三个控制点可以 决定一条抛物线。因此,如果给定三个控制点 P0(xOy0)、P1(x12yl)和P2(x2,y2),如何绘制出相 应的抛物线呢? 口抛物线的矢量方程为: Q(t)=at2+bt+c,t∈[O,1(式7-2-1) 所对应的代数方程为: ■{x()ax2+bxt+t∈|0.1(式722) y(t=ayt2+ byt cy
7.2 抛物线 ◼ 7.2.1 抛物线的参数拟合 ◼ 1.抛物线的数学基础和几何意义 ◼ 在数学基础中,我们知道:已知三个控制点可以 决定一条抛物线。因此,如果给定三个控制点 P0(x0,y0)、P1(x1,y1)和P2(x2,y2),如何绘制出相 应的抛物线呢? ◼ 抛物线的矢量方程为: ◼ Q(t) = at2 + bt + c , t∈[0,1] (式7-2-1) ◼ 所对应的代数方程为: ◼ { x(t)=axt2 + bxt + cx , ◼ y(t)=ayt2 + byt + cy , t∈[0,1] (式7-2-2)
通常给出下面抛物线的边界条件 (1)当t0时,抛物线过P0点,且切于POP1 (2)当t=1时,抛物线过P1点,且切于P1P2; 通过联立方程组和边界条件,可以求出抛物线参 数方程的系数: y=yo bx=2(x1-x0 by=2(y1-y0) ax=x2-2x1+ .OPO(X0, yO)P1(x1, y1)P2(x2, y2)Pm(xm, ym)Ck7.2. 抛物线曲线 2-2y1+y0
◼ 通常给出下面抛物线的边界条件: ◼ (1)当t=0时,抛物线过P0点,且切于P0 P1; ◼ (2)当t=1时,抛物线过P1点,且切于P1 P2; ◼ 通过联立方程组和边界条件,可以求出抛物线参 数方程的系数: ◼ cx = x0 ◼ cy = y0 ◼ bx =2(x1 - x0) ◼ by =2(y1 - y0) ◼ ax = x2 - 2 x1 + x0P0(x0,y0)P1(x1,y1)P2(x2,y2)Pm(xm,ym)C图7.2.1 抛物线曲线 ◼ ay = y2 - 2 y1 + y0
口详细求解过程可以参阅文献[2](清华大 出版社,唐泽圣编著,第72-74页)。当这 些系数求出后,式7-2-2所表示的抛物线参 数方程也就确定了。通过t∈[0,1取100个离 散的值(dt=0.01),分别求出曲线上点的 坐标[x(,y,曲线上相邻点用直线段相 连,就可以绘出相应的抛物线。如图72.1 所示。 F1(x1,y1) Pm(*m,ym Po(xo, yo)A P2(x2y2) 图7.2.1…抛物线曲线
◼ 详细求解过程可以参阅文献[2](清华大学 出版社,唐泽圣编著,第72-74页)。当这 些系数求出后,式7-2-2所表示的抛物线参 数方程也就确定了。通过t∈[0,1]取100个离 散的值(dt=0.01),分别求出曲线上点的 坐标[x(t),y(t)],曲线上相邻点用直线段相 连,就可以绘出相应的抛物线。如图7.2.1 所示
■抛物线曲线的两个重要性质: 性质1:抛物线在t12处的切线平行于POP2; 性质2:t=1/2时,抛物线上的点Pm为P1C的中点, 其中C为P0P2的中点; 证明:(略,可以参阅文献[2]) 2.抛物线程序设计 实现抛物线算法的C语言程序段如下:(工程名 parabola) aPar( (int xs, int ys, int xm,ntym,nte,ntye)∥知起 点、中点和终点三个控制点的坐标 double t, dt, ax, ay, bx, by, cx, cy; intn、i
◼ 抛物线曲线的两个重要性质: ◼ 性质1:抛物线在t=1/2处的切线平行于P0 P2 ; ◼ 性质2:t=1/2时,抛物线上的点Pm为P1 C的中点, 其中C为P0 P2的中点; ◼ 证明:(略,可以参阅文献[2]) ◼ 2.抛物线程序设计 ◼ 实现抛物线算法的C语言程序段如下:(工程名: parabola) ◼ Par(int xs,int ys,int xm,int ym,int xe,int ye) //已知起 点、中点和终点三个控制点的坐标 ◼ { ◼ double t,dt,ax,ay,bx,by,cx,cy; ◼ int n,i;
■aXxe-2*xm+xS ay=ye-2 ym+ys bx=2.0*(xm-xs); by=2.0*(ym-ys) cXXS, cy=ys, n=sqrt(ax*axtay*ay) n=sgrt(n*100.0) a moveto(xs, ys 口dt=1.0/n;t=0 ■for(i=0,1<=n;i++ lineto(int) (ax*t*t+bx*t+cx), (int)( ay*t*t+by*t+cy)); t=t+dt ■ lineto(xe,ye);
◼ ax=xe-2*xm+xs; ◼ ay=ye-2*ym+ys; ◼ bx=2.0*(xm-xs); ◼ by=2.0*(ym-ys); ◼ cx=xs; cy=ys; ◼ n=sqrt(ax*ax+ay*ay); ◼ n=sqrt(n*100.0); ◼ moveto(xs,ys); ◼ dt=1.0/n; t=0; ◼ for (i=0;i<=n; i++) ◼ { ◼ lineto((int)(ax*t*t+bx*t+cx),(int)( ay*t*t+by*t+cy)); ◼ t=t+dt; ◼ } ◼ lineto(xe,ye); ◼ }