想做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;
}
浙公网安备 33010602011771号