B样条曲线

    技术2022-05-19  23

    typedef struct {         int x;         int y;         bool w;     }gVector; gVector vector[100]; double x0,y0,x2,y2; void CQuadBzrDlg::OnGene2Bzr() {     // TODO: Add your control notification handler code here         double t=0;     double step=0.01;     int k=0;//标识点数     int x1=60;     int y1=40;     x0=30;     y0=200;         x2=200;     y2=100;     CDC*pDC=GetDC();        CPen pen,*poldPen;        pen.CreatePen(PS_SOLID,1,RGB(0,0,0));     poldPen=pDC->SelectObject(&pen);         vector[k].x =((1-t)*(1-t)*x0)+(2*t*(1-t)*x1)+(t*t*x2);     vector[k].y =((1-t)*(1-t)*y0)+(2*t*(1-t)*y1)+(t*t*y2);     pDC->MoveTo(vector[k].x ,vector[k].y );     do{                 t=t+step;         k++;         vector[k].x =((1-t)*(1-t)*x0)+(2*t*(1-t)*x1)+(t*t*x2);         vector[k].y =((1-t)*(1-t)*y0)+(2*t*(1-t)*y1)+(t*t*y2);         pDC->LineTo(vector[k].x ,vector[k].y );         pDC->MoveTo(vector[k].x ,vector[k].y );     }while(t<=1);     pDC->SelectObject(poldPen);     ReleaseDC(pDC); } void CQuadBzrDlg::On2fitted() {     // TODO: Add your control notification handler code here     //先计算P1.x         double t=0.0;     double a=0.0;     double b=0.0;     double c=0.0;     double d=0.0;     double x1,y1;         int i;         for(i=0;i<=100;i++)     {         a+=vector[i].x *(2*t*(1-t));         t=t+0.01;     }     t=0.0;     for(i=0;i<=100;i++)     {                b+=x0*((1-t)*(1-t))*2*t*(1-t);         t=t+0.01;     }     t=0.0;     for(i=0;i<=100;i++)     {                c+=x2*(t*t)*(2*t*(1-t));         t=t+0.01;     }     t=0.0;     for(i=0;i<=100;i++)     {         d+=2*t*(1-t)*2*t*(1-t);         t=t+0.01;     }     x1=(a-b-c)/d;     if((x1-(double)((int)x1))*10.0>5.0)         x1=x1+1;     //计算y1     t=0.0;     a=b=c=0.0;     for(i=0;i<=100;i++)     {         a+=vector[i].y *(2*t*(1-t));         t=t+0.01;     }     t=0.0;     for(i=0;i<=100;i++)     {                b+=y0*((1-t)*(1-t))*2*t*(1-t);         t=t+0.01;     }     t=0.0;     for(i=0;i<=100;i++)     {                c+=y2*(t*t)*(2*t*(1-t));         t=t+0.01;     }     t=0.0;         y1=(a-b-c)/d;     if((y1-(double)((int)y1))*10.0>5.0)         y1=y1+1;     //画出拟合曲线     CDC*pDC=GetDC();        CPen pen,*poldPen;        pen.CreatePen(PS_SOLID,1,RGB(255,0,0));     poldPen=pDC->SelectObject(&pen);     //pDC->SelectObject(poldPen);    // vector[k].x =((1-t)*(1-t)*x0)+(2*t*(1-t)*x1)+(t*t*x2); //    vector[k].y =((1-t)*(1-t)*y0)+(2*t*(1-t)*y1)+(t*t*y2);     pDC->MoveTo(((1-t)*(1-t)*x0)+(2*t*(1-t)*x1)+(t*t*x2) ,((1-t)*(1-t)*y0)+(2*t*(1-t)*y1)+(t*t*y2));     do{                 t=t+0.01;     //    k++;     //    vector[k].x =((1-t)*(1-t)*x0)+(2*t*(1-t)*x1)+(t*t*x2);     //  vector[k].y =((1-t)*(1-t)*y0)+(2*t*(1-t)*y1)+(t*t*y2);         pDC->LineTo(((1-t)*(1-t)*x0)+(2*t*(1-t)*x1)+(t*t*x2) ,((1-t)*(1-t)*y0)+(2*t*(1-t)*y1)+(t*t*y2) );     }while(t<=1);     ReleaseDC(pDC); }


    最新回复(0)