microsoftxiao

记忆 流逝

导航

想做Bezier动画,可惜弄出来这个差远了。

//三螺曲线
int DrawThreeSnailCurve(Graphics* grp,int *CtrlPoint)
{
 
 Pen pen(Color(255,0,255,0),1);
   
 Point p[] = {Point(200,150), //P
           Point(CtrlPoint[0],CtrlPoint[1]),Point(200,100),
              Point(100,100), //P

     Point(CtrlPoint[2],CtrlPoint[3]),Point(200,100),
     Point(300,200), //P

     Point(CtrlPoint[4],CtrlPoint[5]),Point(200,200),
     Point(200,150), //P
                
     Point(CtrlPoint[6],CtrlPoint[7]),Point(200,250),
     Point(300,250),//P

     Point(CtrlPoint[8],CtrlPoint[9]),Point(200,150),
     Point(50,150),//P

     Point(CtrlPoint[10],CtrlPoint[11]),Point(300,160),
     Point(700,500),//P

     Point(CtrlPoint[12],CtrlPoint[13]),Point(700,200),
     Point(600,200),//P

     Point(CtrlPoint[14],CtrlPoint[15]), Point(800,655),
     Point(800,600),//P

     Point(CtrlPoint[16],CtrlPoint[17]),Point(300,240),
     Point(250,240),//P
 };
   
 float zstep = 0.0f;
 
  for(int i=0;i<10;i++){
 
     grp->TranslateTransform(0.0f,zstep);
  grp->DrawBeziers(&pen,p,28);
  zstep+=3.0f;
 }
   
    return 0;
}

int cp[56];
RECT DrawRect;
RECT SpecRect;


//WinAPI里没有的我又经常要用到的函数,模块就是值得封装的。因为总要调用
time_t     fstime = 0;
time_t     frtime = 0;
struct tm*    fpstime = 0;
struct tm*    fprtime = 0;
int        fistime = 0;  //起始时间
int        firtime = 0;  //实时时间

//得到首次时间
int GetInitTime()
{
 time(&fstime);
 fpstime = localtime(&fstime);
    fistime = fpstime->tm_sec;
    return 0;
}

//实时调用
int RunTime()
{
    time(&frtime);
    fprtime = localtime(&frtime);
    firtime = fprtime->tm_sec;
 return 0;
}
//初始化画笔画刷等
int InitGDI()
{
 hdc = GetDC(hWnd);

    hPen = CreatePen(PS_DOT,2,RGB(255,0,0));
 SelectObject(hdc,hPen);

 GetWindowRect(hWnd,&rect);
   
 for(int i=0;i<56;i++)
  cp[i] = 0;
    cp[0] = 200; cp[1] = 150;
 cp[2] = 200; cp[3] = 200;
 cp[4] = 300; cp[5] = 200;
 cp[6] = 200; cp[7] = 150;
 cp[8] = 200; cp[9] = 250;
 cp[10] = 50; cp[11] = 250;
    cp[12] = 700; cp[13] = 500;
 cp[14] = 500; cp[15] = 250;
 cp[16] = 400; cp[17] = 600;

 DrawRect.left = -100;
 DrawRect.right = 2048;
 DrawRect.top = -100;
 DrawRect.bottom = 1024;

 //右边特殊 控制点范围
 SpecRect.left = -1024;
 SpecRect.right = 1100;
 SpecRect.top = -500;
 SpecRect.bottom = 1024;

 GetInitTime();
    return 0;
}


const int rStep = 10;
int rAspectx0 = rStep;
int rAspecty0 = rStep;
int rAspectx1 = -rStep;
int rAspecty1 = rStep;

int rAspectx2 = rStep;
int rAspecty2 = -rStep;
int rAspectx3 = -rStep;
int rAspecty3 = -rStep;

int rAspectx4 = rStep;
int rAspecty4 = rStep;
int rAspectx5 = rStep;
int rAspecty5 = rStep;

int rAspectx6 = rStep;
int rAspecty6 = rStep;
int rAspectx7 = rStep;
int rAspecty7 = rStep;

int rAspectx8 = rStep;
int rAspecty8 = rStep;

//随机控制点范围
int rCRangeX0 = 2048;
int rCRangeX1 = -100;
int cRnY0 = -100;
int cRnY1 = 1024;

int cRnX2 = 2048;
int cRnX3 = -100;
int cRnX4 = 2048;
int cRnX5 = -100;
int cRnX6 = 2048;
int cRnX7 = -100;
int cRnX8 = 2048;
int cRnX9 = -100;
int cRnX10 = 2048;
int cRnX11 = -100;
int cRnX12 = 2048;
int cRnX13 = -100;
int cRnX14 = 2048;
int cRnX15 = -100;
int cRnX16 = 2048;
int cRnX17 = -100;
int cRnY2 = -100;
int cRnY3 = 1024 ;
int cRnY4 = -100;
int cRnY5 = 1024;
int cRnY6 = -100;
int cRnY7 = 1024;
int cRnY8 = -100;
int cRnY9 = 1024;
int cRnY10 = -100;
int cRnY11 = 1024;
int cRnY12 = -100;
int cRnY13 = 1024;
int cRnY14 =-100;
int cRnY15 = 1024;
int cRnY16 = -100;
int cRnY17 = 1024;

char szMsg[MAX_PATH];
wchar_t szMulb[MAX_PATH];

int MakePoint()
{
    rCRangeX0 = rand()%2000;
 rCRangeX1 = rand()%2000;
 cRnY0 = rand()%1024;
 cRnY1 = rand()%1024;

 cRnX2 = rand()%2000;
 cRnX3 = rand()%2000;

    cRnY2 = rand()%1024;
 cRnY3 = rand()%1024;

    cRnX4 = rand()%2000;
 cRnX5 = rand()%2000;
   
 cRnY4 = rand()%1024;
 cRnX5 = rand()%1024;

    cRnX6 = rand()%2000;
 cRnX7 = rand()%2000;

 cRnY6 = rand()%1024;
 cRnY7 = rand()%1024;
   
 cRnX8 = rand()%2000;
 cRnY9 = rand()%2000;

 cRnY8 = rand()%1024;
 cRnY9 = rand()%1024;
   
 cRnX10 = rand()%2000;
 cRnX11 = rand()%2000;

 cRnY10 = rand()%1024;
 cRnY11 = rand()%1024;
   
 cRnX12 = rand()%2000;
 cRnX13 = rand()%2000;
 
    cRnX14 = rand()%1024;
 cRnX15 = rand()%1024;

 cRnX16 = rand()%2000;
 cRnX17 = rand()%2000;

 cRnY12 = rand()%1024;
 cRnY13 = rand()%1024;

    cRnY14 = rand()%2000;
 cRnY15 = rand()%2000;

 cRnY16 = rand()%1024;
 cRnY17 = rand()%1024;

  if(abs(rCRangeX0 - rCRangeX1) < 100){
  rCRangeX1 = DrawRect.left;
  return 0;
 }
 if(abs(cRnX2 - cRnX3) < 100){
  cRnX3 = DrawRect.left;
  return 0;
 }
 if(abs(cRnX4 - cRnX5) < 100){
        cRnX5 = DrawRect.left;
  return 0;
 }
   
 if(abs(cRnX6 - cRnX7) < 100){
  cRnY7 = DrawRect.left;
  return 0;
 }
 if(abs(cRnX8 - cRnX9) < 100){
  cRnX9 = DrawRect.left;
  return 0;
 }
 if(abs(cRnX10 - cRnX11) < 100){
  cRnX11 = DrawRect.left;
  return 0;
 }
    if(abs(cRnX12 - cRnX13) < 100){
  cRnX13 = DrawRect.left;
  return 0;
 }
    if(abs(cRnX14 - cRnX15) < 100){
  cRnX15 = DrawRect.left;
  return 0;
 }
    if(abs(cRnX16 - cRnX17) < 100){
  cRnX17 = DrawRect.left;
  return 0;
 }

 if(abs(cRnY6 - cRnY7) < 100){
  cRnY7 = DrawRect.top;
  return 0;
 }
 if(abs(cRnY8 - cRnY9) < 100){
  cRnY9 = DrawRect.top;
  return 0;
 }
 if(abs(cRnY10 - cRnY11) < 100){
  cRnY11 = DrawRect.top;
  return 0;
 }
 if(abs(cRnY12 - cRnY13) < 100){
  cRnY13 = DrawRect.top;
  return 0;
 }
 if(abs(cRnY14 - cRnY15) < 100){
  cRnY15 = DrawRect.top;
  return 0;
 }
 if(abs(cRnY16 - cRnY17) < 100){
  cRnY17 = DrawRect.top;
  return 0;
 }
 if(abs(cRnY0 - cRnY1) < 100){
  cRnY1 = DrawRect.top;
  return 0;
 }
 
 if(abs(cRnY2-cRnY3) > 400){
  cRnY3 = DrawRect.top;
  return 0;
 }
 if(abs(cRnY4-cRnY5) > 400){
  cRnY5 = DrawRect.top;
  return 0;
 }
    return 0;
}

int DrawFiveSnail()
{
 //在指定时间间隔内产生一次随机数
 RunTime();
 wsprintf(szMulb,L"%d %d",firtime,fistime);
    TextOut(hdc,0,0,szMulb,(int)wcslen(szMulb));

 if(abs(firtime - fistime) >= 2)
    {
    fistime = firtime;
       MakePoint();
    }
 

 Graphics graphic(hdc);
 
 if(cp[1] > cRnY0  || cp[1] < cRnY1){
  rAspecty0 = -rAspecty0;
 }
   
 if(cp[0] > rCRangeX0 || cp[0] < rCRangeX1){
       rAspectx0 = -rAspectx0;
 }
   
 //控制点2
 if(cp[3] > cRnY2  || cp[3] < cRnY3){
      rAspecty1 = -rAspecty1;
 }
 if(cp[2] < cRnX2 || cp[2] > cRnX3){
   rAspectx1 = -rAspectx1;
 }
   
 //控制点3
 if(cp[5] > cRnY4 || cp[5] < cRnY5){
       rAspecty2 = -rAspecty2;  
 }
 if(cp[4] > cRnX4 || cp[4] < cRnX5){
  rAspectx2 = -rAspectx2;
 }

 //控制点4
 if(cp[7] > cRnY6 || cp[7] < cRnY7){
       rAspecty3 = -rAspecty3;
 }

 if(cp[6] > cRnX6 || cp[6] < cRnX7){
  rAspectx3 = -rAspectx3;
 }

 //控制点5
 if(cp[8] > cRnY8 || cp[8] < cRnY9){
  rAspectx4 = -rAspectx4;
 }
 if(cp[9] > cRnX8 || cp[9] < cRnX9){
  rAspecty4 = -rAspecty4;
 }
   
 //控制点6
 if(cp[11] > cRnY10 || cp[11] < cRnY11){
  rAspecty5 = -rAspecty5;
 }
 if(cp[10] > cRnX10 || cp[10] < cRnX11){
  rAspectx5 = -rAspectx5;
 }
   
 // * 表示特殊控制点
 //控制点7 - *
 if(cp[13] > cRnY12 || cp[13] < cRnY13){
  rAspecty6 = -rAspecty6;
 }
 if(cp[12] > cRnX12 || cp[12] < cRnX13){
  rAspectx6 = -rAspectx6;
 }

 //控制点8 - *
 if(cp[15] > cRnY14 || cp[15] < cRnY15){
  rAspecty7 = -rAspecty7;
 }
 if(cp[14] > cRnX14 || cp[14] < cRnX15){
  rAspectx7 = -rAspectx7;
 }
 //控制点9 - *
 if(cp[17] > cRnY16 || cp[17] < cRnY17){
  rAspecty8 = -rAspecty8;
 }
 if(cp[16] > cRnX16 || cp[16] < cRnX17){
  rAspectx8 = -rAspectx8;
 }
 //增量
 cp[0] += rAspectx0;
 cp[1] += rAspecty0;
 cp[2] += rAspectx1;
 cp[3] += rAspecty1;
 cp[4] += rAspectx2;
    cp[5] += rAspecty2;
    cp[6] += rAspectx3;
 cp[7] += rAspecty3;
 cp[8] += rAspectx4;
 cp[9] += rAspecty4;
    cp[10] += rAspectx5;
 cp[11] += rAspecty5;
    cp[12] += rAspectx6;
 cp[13] += rAspecty6;

 cp[14] += rAspectx7;
 cp[15] += rAspecty7;
   
 cp[16] += rAspectx8;
 cp[17] += rAspecty8;
    DrawThreeSnailCurve(&graphic,cp);
 InvalidateRect(hWnd,&rect,true);
 return 0;
}

int Render()
{
 DrawFiveSnail();
 Sleep(5);
   
 return 0;
}

posted on 2006-10-05 23:04  龙巢NET刀  阅读(471)  评论(2)    收藏  举报