| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 852 人关注过本帖
标题:请哪位大虾优化一把我的消隐算法(书上的行不通,所以自己写了一个……发现不 ...
只看楼主 加入收藏
woojoe
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2004-5-5
收藏
 问题点数:0 回复次数:7 
请哪位大虾优化一把我的消隐算法(书上的行不通,所以自己写了一个……发现不怎么好)

/*******************************消隐的部分主要是在cube那里面的*************************************/

#include<graphics.h> /*头文件*/ #include<stdio.h> #include<dos.h> #include<math.h> #define PI 3.14159265 /*加入宏定义*/ #define DELTAX 320 #define DELTAY 240 union REGS regs,reg; /*定义寄存器regs、reg*/ int far *buf=0xFFFFF000; void sp();

void RGB(int p,int r,int g,int b) /*RGB调色板程序*/ { p=p%16; if (p>7) p+=48; if (p==6) p=0x14; reg.x.ax=0x1010; /*中断号0x1010*/ reg.x.bx=p; reg.h.ch=g%64; reg.h.cl=b%64; reg.h.dh=r%64; int86(0x10,&reg,&reg); /*调用int86软中断*/ }

void magicline() /*变幻线程序*/ { int i,t,r, xx[4]={242,48,328,534}, yy[4]={450,156,48,136}, xx1[4]={246,52,332,538}, /*初始化第一个多点数组*/ yy1[4]={450,156,48,136}, xx2[4]={250,56,336,542}, yy2[4]={450,156,48,136}, xxc[4]={252,568,50,230}, yyc[4]={234,423,254,413}, xxc1[4]={256,572,54,234}, /*初始化第一个参照多点数组*/ yyc1[4]={234,423,254,413}, xxc2[4]={260,576,58,238}, yyc2[4]={234,423,254,413}, dxx[4],dyy[4],dxx1[4],dyy1[4],dxx2[4],dyy2[4], x[4]={40,248,630,134}, y[4]={57,456,248,436}, x1[4]={44,252,634,138}, /*初始化第二个多点数组*/ y1[4]={57,456,248,436}, x2[4]={48,254,638,140}, y2[4]={57,456,248,436}, xc[4]={250,542,52,612}, yc[4]={391,56,424,413}, xc1[4]={254,546,56,616}, /*初始化第二个参照多点数组*/ yc1[4]={391,56,424,413}, xc2[4]={258,550,60,620}, yc2[4]={391,56,424,413}, dx[4],dy[4],dx1[4],dy1[4],dx2[4],dy2[4]; for(i=0;i<4;i++) { dxx[i]=xxc[i]-xx[i]; /*计算第一组的横纵坐标的差值*/ dyy[i]=yyc[i]-yy[i]; dxx1[i]=xxc1[i]-xx1[i]; dyy1[i]=yyc1[i]-yy1[i]; dxx2[i]=xxc2[i]-xx2[i]; dyy2[i]=yyc2[i]-yy2[i]; dx[i]=xc[i]-x[i]; /*计算第二组的横纵坐标的差值*/ dy[i]=yc[i]-y[i]; dx1[i]=xc1[i]-x1[i]; dy1[i]=yc1[i]-y1[i]; dx2[i]=xc2[i]-x2[i]; dy2[i]=yc2[i]-y2[i]; } for(t=0;t<=5000;t++) /*变幻线主循环程序*/ { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); r=(regs.x.ax==2)?1:0; /*调用鼠标的5号中断,测试右击*/ if(r) { cleardevice(); sp(); /*若在变幻线执行时右击鼠标,退回初始界面*/ } else { cleardevice(); for(i=0;i<4;i++) { if(y[i]>=480||y[i]<=0) /*计算第一组的第一个点*/ dy[i]=(-1)*dy[i]; if(x[i]>=640||x[i]<=0) dx[i]=(-1)*dx[i]; x[i]=x[i]+dx[i]/190; y[i]=y[i]+dy[i]/190;

if(y1[i]>=480||y1[i]<=0) /*计算第一组的第二个点*/ dy1[i]=(-1)*dy1[i]; if(x1[i]>=640||x1[i]<=0) dx1[i]=(-1)*dx1[i]; x1[i]=x1[i]+dx1[i]/190; y1[i]=y1[i]+dy1[i]/190;

if(y2[i]>=480||y2[i]<=0) /*计算第一组的第三个点*/ dy2[i]=(-1)*dy2[i]; if(x2[i]>=640||x2[i]<=0) dx2[i]=(-1)*dx2[i]; x2[i]=x2[i]+dx2[i]/190; y2[i]=y2[i]+dy2[i]/190;

if(yy[i]>=480||yy[i]<=0) /*计算第二组的第一个点*/ dyy[i]=(-1)*dyy[i]; if(xx[i]>=640||xx[i]<=0) dxx[i]=(-1)*dxx[i]; xx[i]=xx[i]+dxx[i]/140; yy[i]=yy[i]+dyy[i]/140;

if(yy1[i]>=480||yy1[i]<=0) /*计算第二组的第二个点*/ dyy1[i]=(-1)*dyy1[i]; if(xx1[i]>=640||xx1[i]<=0) dxx1[i]=(-1)*dxx1[i]; xx1[i]=xx1[i]+dxx1[i]/140; yy1[i]=yy1[i]+dyy1[i]/140;

if(yy2[i]>=480||yy2[i]<=0) /*计算第二组的第三个点*/ dyy2[i]=(-1)*dyy2[i]; if(xx2[i]>=640||xx2[i]<=0) dxx2[i]=(-1)*dxx2[i]; xx2[i]=xx2[i]+dxx2[i]/140; yy2[i]=yy2[i]+dyy2[i]/140; } setlinestyle(0,0,1); /*设定直线类型*/ for(i=0;i<4;i++) { setcolor(1); /*画第一组线*/ line(x[i],y[i],x[(i+1)%4],y[(i+1)%4]); line(x1[i],y1[i],x1[(i+1)%4],y1[(i+1)%4]); line(x2[i],y2[i],x2[(i+1)%4],y2[(i+1)%4]); setcolor(2); /*画第二组线*/ line(xx[i],yy[i],xx[(i+1)%4],yy[(i+1)%4]); line(xx1[i],yy1[i],xx1[(i+1)%4],yy1[(i+1)%4]); line(xx2[i],yy2[i],xx2[(i+1)%4],yy2[(i+1)%4]); } delay(8000); /*设定延迟时间*/ } } }

rfs(x0,y0,l,a,b) /*五角星程序*/ int x0,y0,l; float a,b; { int i,j,k,n,r,rr,s,z0,z1,z2; int x1,y1,x2,y2,x3,y3,x4,y4,x5,y5; int p[5],q[5],x[5],y[5],X[5],Y[5]; int graphdriver=DETECT,graphmode; initgraph(&graphdriver,&graphmode,""); /*设定所需要的变量*/ x1=x0-l*sin(PI*54/180), y1=y0+l*cos(PI*54/180), x2=x1+l*cos(PI*72/180), y2=y1+l*sin(PI*72/180), x3=x2+l, y3=y2, x4=x0+l*sin(PI*54/180), y4=y1, x5=x0, y5=y0+(l/2)/cos(PI*54/180); /*静止的五角星*/ x[0]=x0,x[1]=x1,x[2]=x2,x[3]=x3,x[4]=x4; y[0]=y0,y[1]=y1,y[2]=y2,y[3]=y3,y[4]=y4; r=x0-x1; s=x0-x2; z0=y5-y0; z1=y5-y1; z2=y2-y5; /*五角星的中心坐标*/

setbkcolor(0); for(n=0;n<=1;n++) /*五角星绕y轴旋转*/ { for(k=0;k<=100;k++) { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); rr=(regs.x.ax==2)?1:0; /*若右击则退出*/ if(rr) { cleardevice(); sp(); } else { /*确定下一个点的坐标,只需要横坐标*/ x[1]=x1+2*r*sin(k*PI/200); x[2]=x2+2*s*sin(k*PI/200); x[3]=x3-2*s*sin(k*PI/200); x[4]=x4-2*r*sin(k*PI/200); setlinestyle(0,0,1); setcolor(k%15); /*选择颜色*/ for(i=0;i<=4;i++) for(j=1;j<=4;j++) line(x[i],y[i],x[(i+j)%5],y[(i+j)%5]); /*画五角星*/ setcolor(0); for(i=0;i<=4;i++) line(x[i],y[i],x[(i+1)%5],y[(i+1)%5]); delay(10000); cleardevice(); /*清屏*/ } } }

for(n=0;n<=1;n++) /*五角星绕x轴旋转*/ { for(k=0;k<=100;k++) { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); rr=(regs.x.ax==2)?1:0; /*若右击则退出*/ if(rr) { cleardevice(); sp(); } else /*确定下一个点的坐标,只需要纵坐标*/ { y[0]=y0+2*z0*sin(k*PI/100); y[1]=y[4]=y1+2*z1*sin(k*PI/100); y[2]=y[3]=y2-2*z2*sin(k*PI/100); setlinestyle(0,0,1); setcolor(k%15); /*选择颜色*/ for(i=0;i<=4;i++) for(j=1;j<=4;j++) line(x[i],y[i],x[(i+j)%5],y[(i+j)%5]); /*画五角星*/ setcolor(0); for(i=0;i<=4;i++) line(x[i],y[i],x[(i+1)%5],y[(i+1)%5]); delay(15000); cleardevice(); /*清屏*/ } } }

for(n=0;n<=20;n++) /*五角星绕垂直平面的轴旋转*/ { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); rr=(regs.x.ax==2)?1:0; if(rr) /*若右击则退出*/ { cleardevice(); sp(); } else { /*确定下一点的坐标*/ for(i=0;i<=4;i++) { x[i]=2*x5-x[i]; y[i]=2*y5-y[i]; } for(k=0;k<=60;k++) /*画五角星*/ { setcolor(k%15); for(i=0;i<=4;i++) for(j=1;j<=4;j++) line(x[i],y[i],x[(i+j)%5],y[(i+j)%5]); setcolor(0); /*清五角星*/ for(j=0;j<=4;j++) { for(i=0;i<=4;i++) line(x[i],y[i],x[(i+1)%5],y[(i+1)%5]); } delay(10); /*设定延时*/ } cleardevice(); } }

p[0]=x0,p[1]=x1,p[2]=x2,p[3]=x3,p[4]=x4; /*五角星的拉伸效果程序*/ q[0]=y0,q[1]=y1,q[2]=y2,q[3]=y3,q[4]=y4; for(n=0;n<=1;n++) { for(k=0;k<=100;k++) /*第一种拉伸效果*/ { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); rr=(regs.x.ax==2)?1:0; /*若右击则退出*/ if(rr) { cleardevice(); sp(); } else { for(i=0;i<=4;i++) /*计算下一步的坐标*/ { X[i]=(-a*a*p[i]+a*q[i]-a*b)/(a*a+1); Y[i]=(a*p[i]-q[i]+b)/(a*a+1); x[i]=p[i]+2*X[i]*sin(k*PI/100); y[i]=q[i]+2*Y[i]*sin(k*PI/100); } setcolor(k%15); /*画五角星*/ for(i=0;i<=4;i++) for(j=1;j<=4;j++) line(x[i],y[i],x[(i+j)%5],y[(i+j)%5]); setcolor(0); /*清五角星*/ for(i=0;i<=4;i++) line(x[i],y[i],x[(i+1)%5],y[(i+1)%5]); delay(80000); cleardevice(); /*清屏*/ } } }

for(n=0;n<=1;n++) /*第二种拉伸效果*/ { for(k=0;k<=200;k++) { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); rr=(regs.x.ax==2)?1:0; /*若右击则退出*/ if(rr) { cleardevice(); sp(); } else { for(i=0;i<=4;i++) /*计算下一步的坐标*/ { X[i]=(-a*a*p[i]+a*q[i]-a*b)/(a*a+1); Y[i]=(a*p[i]-q[i]+b)/(a*a+1); x[i]=p[i]+2*X[i]*cos(k*PI/100); y[i]=q[i]+2*Y[i]*cos(k*PI/100); } setcolor(k%15); /*画五角星*/ for(i=0;i<=4;i++) for(j=1;j<=4;j++) line(x[i],y[i],x[(i+j)%5],y[(i+j)%5]); setcolor(0); /*清五角星*/ for(i=0;i<=4;i++) line(x[i],y[i],x[(i+1)%5],y[(i+1)%5]); delay(10000); cleardevice(); /*清屏*/ } } }

for(n=0;n<=1;n++) /*第三种拉伸效果*/ { for(k=0;k<=200;k++) { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); rr=(regs.x.ax==2)?1:0; /*若右击则退出*/ if(rr) { cleardevice(); sp(); } else { for(i=0;i<=4;i++) /*计算下一步的坐标*/ { X[i]=(-a*a*p[i]+a*q[i]-a*b)/(a*a+1); Y[i]=(a*p[i]-q[i]+b)/(a*a+1); x[i]=p[i]+2*X[i]*cos(k*PI/100); y[i]=q[i]+2*Y[i]*sin(k*PI/100); } setcolor(k%15); /*画五角星*/ for(i=0;i<=4;i++) for(j=1;j<=4;j++) line(x[i],y[i],x[(i+j)%5],y[(i+j)%5]); setcolor(0); /*清五角星*/ for(i=0;i<=4;i++) line(x[i],y[i],x[(i+1)%5],y[(i+1)%5]); delay(10000); cleardevice(); /*清屏*/ } } }

for(n=0;n<=1;n++) /*第四种拉伸效果*/ { for(k=0;k<=200;k++) { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); rr=(regs.x.ax==2)?1:0; /*若右击则退出*/ if(rr) { cleardevice(); sp(); } else { for(i=0;i<=4;i++) /*计算下一步的坐标*/ { X[i]=(-a*a*p[i]+a*q[i]-a*b)/(a*a+1); Y[i]=(a*p[i]-q[i]+b)/(a*a+1); x[i]=p[i]+2*X[i]*sin(k*PI/100); y[i]=q[i]+2*Y[i]*cos(k*PI/100); } setcolor(k%15); /*画五角星*/ for(i=0;i<=4;i++) for(j=1;j<=4;j++) line(x[i],y[i],x[(i+j)%5],y[(i+j)%5]); setcolor(0); /*清五角星*/ for(i=0;i<=4;i++) line(x[i],y[i],x[(i+1)%5],y[(i+1)%5]); delay(10000); cleardevice(); /*清屏*/ } } } }

/***************************** 下面继续*****************************/

[此贴子已经被作者于2004-11-13 17:29:56编辑过]

搜索更多相关主题的帖子: 算法 消隐 
2004-11-13 17:25
woojoe
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2004-5-5
收藏
得分:0 

float in_prd(x,y) /*内积计算函数*/ float x[3],y[3]; { float p=0; int i; for(i=0;i<3;i++) /*计算两个三维向量的内积*/ p+=x[i]*y[i]; return p; }

void initial(x) /*初始化函数*/ int x[8]; { int i; for(i=0;i<8;i++) x[i]=0; /*初始一个全零数组*/ }

void reflag(x0,y0,z0,flag,l) /*更新标志值函数*/ float x0[8],y0[8],z0[8],l; int flag[8]; { float p[3],q[3],x,y,z; float a,b,c,s=l/50;

x=(x0[0]+x0[2])/2; /*计算上表面中心坐标,并判断其与指定向量的内积*/ y=(y0[0]+y0[2])/2; z=(z0[0]+z0[2])/2; p[0]=x; p[1]=y; p[2]=z; x=s*71-x; y=0-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; a=in_prd(p,q); /*从第一个参考点计算*/ x=(x0[0]+x0[2])/2; y=(y0[0]+y0[2])/2; z=(z0[0]+z0[2])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=s*71-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; b=in_prd(p,q); /*从第二个参考点计算*/ x=(x0[0]+x0[2])/2; y=(y0[0]+y0[2])/2; z=(z0[0]+z0[2])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=0-y; z=s*156-z; q[0]=x; q[1]=y; q[2]=z; c=in_prd(p,q); /*从第三个参考点计算*/ if(a<0&&b<0&&c<0) { flag[0]++; flag[1]++; flag[2]++; flag[3]++; /*修改上表面各点标志值*/ }

x=(x0[5]+x0[7])/2; /*计算下表面中心坐标,并判断其与指定向量的内积*/ y=(y0[5]+y0[7])/2; z=(z0[5]+z0[7])/2; p[0]=x; p[1]=y; p[2]=z; x=s*71-x; y=0-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; a=in_prd(p,q); /*从第一个参考点计算*/ x=(x0[5]+x0[7])/2; y=(y0[5]+y0[7])/2; z=(z0[5]+z0[7])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=s*71-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; b=in_prd(p,q); /*从第二个参考点计算*/ x=(x0[5]+x0[7])/2; y=(y0[5]+y0[7])/2; z=(z0[5]+z0[7])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=0-y; z=s*156-z; q[0]=x; q[1]=y; q[2]=z; c=in_prd(p,q); /*从第三个参考点计算*/ if(a<0&&b<0&&c<0) { flag[4]++; flag[5]++; flag[6]++; flag[7]++; /*修改下表面各点标志值*/ }

x=(x0[0]+x0[7])/2; /*计算左表面中心坐标,并判断其与指定向量的内积*/ y=(y0[0]+y0[7])/2; z=(z0[0]+z0[7])/2; p[0]=x; p[1]=y; p[2]=z; x=s*71-x; y=0-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; a=in_prd(p,q); /*从第一个参考点计算*/ x=(x0[0]+x0[7])/2; y=(y0[0]+y0[7])/2; z=(z0[0]+z0[7])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=s*71-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; b=in_prd(p,q); /*从第二个参考点计算*/ x=(x0[0]+x0[7])/2; y=(y0[0]+y0[7])/2; z=(z0[0]+z0[7])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=0-y; z=s*156-z; q[0]=x; q[1]=y; q[2]=z; c=in_prd(p,q); /*从第三个参考点计算*/ if(a<0&&b<0&&c<0) { flag[0]++; flag[3]++; flag[4]++; flag[7]++; /*修改左表面各点标志值*/ }

x=(x0[5]+x0[2])/2; /*计算右表面中心坐标,并判断其与指定向量的内积*/ y=(y0[5]+y0[2])/2; z=(z0[5]+z0[2])/2; p[0]=x; p[1]=y; p[2]=z; x=s*71-x; y=0-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; a=in_prd(p,q); /*从第一个参考点计算*/ x=(x0[5]+x0[2])/2; y=(y0[5]+y0[2])/2; z=(z0[5]+z0[2])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=s*71-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; b=in_prd(p,q); /*从第二个参考点计算*/ x=(x0[5]+x0[2])/2; y=(y0[5]+y0[2])/2; z=(z0[5]+z0[2])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=0-y; z=s*156-z; q[0]=x; q[1]=y; q[2]=z; c=in_prd(p,q); /*从第三个参考点计算*/ if(a<0&&b<0&&c<0) { flag[5]++; flag[1]++; flag[2]++; flag[6]++; /*修改左表面各点标志值*/ }

x=(x0[1]+x0[4])/2; /*计算前表面中心坐标,并判断其与指定向量的内积*/ y=(y0[1]+y0[4])/2; z=(z0[1]+z0[4])/2; p[0]=x; p[1]=y; p[2]=z; x=s*71-x; y=0-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; a=in_prd(p,q); /*从第一个参考点计算*/ x=(x0[1]+x0[4])/2; y=(y0[1]+y0[4])/2; z=(z0[1]+z0[4])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=s*71-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; b=in_prd(p,q); /*从第二个参考点计算*/ x=(x0[1]+x0[4])/2; y=(y0[1]+y0[4])/2; z=(z0[1]+z0[4])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=0-y; z=s*156-z; q[0]=x; q[1]=y; q[2]=z; c=in_prd(p,q); /*从第三个参考点计算*/ if(a<0&&b<0&&c<0) { flag[0]++; flag[1]++; flag[4]++; flag[5]++; /*修改前表面各点标志值*/ }

x=(x0[3]+x0[6])/2; /*计算后表面中心坐标,并判断其与指定向量的内积*/ y=(y0[3]+y0[6])/2; z=(z0[3]+z0[6])/2; p[0]=x; p[1]=y; p[2]=z; x=s*71-x; y=0-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; a=in_prd(p,q); /*从第一个参考点计算*/ x=(x0[3]+x0[6])/2; y=(y0[3]+y0[6])/2; z=(z0[3]+z0[6])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=s*71-y; z=s*45-z; q[0]=x; q[1]=y; q[2]=z; b=in_prd(p,q); /*从第二个参考点计算*/ x=(x0[3]+x0[6])/2; y=(y0[3]+y0[6])/2; z=(z0[3]+z0[6])/2; p[0]=x; p[1]=y; p[2]=z; x=0-x; y=0-y; z=s*156-z; q[0]=x; q[1]=y; q[2]=z; c=in_prd(p,q); /*从第三个参考点计算*/ if(a<0&&b<0&&c<0) { flag[6]++; flag[7]++; flag[2]++; flag[3]++; /*修改后表面各点标志值*/ } }

void paint(x,y,flag) /*画图函数*/ float x[8],y[8]; int flag[8]; { setlinestyle(0,0,1); if(flag[0]+flag[1]<4) /*绘制上表面*/ line(x[0],y[0],x[1],y[1]); if(flag[0]+flag[3]<4) line(x[0],y[0],x[3],y[3]); if(flag[0]+flag[4]<4) line(x[0],y[0],x[4],y[4]); /*绘制下表面*/ if(flag[1]+flag[2]<4) line(x[1],y[1],x[2],y[2]); if(flag[1]+flag[5]<4) line(x[1],y[1],x[5],y[5]); /*绘制左表面*/ if(flag[2]+flag[3]<4) line(x[2],y[2],x[3],y[3]); if(flag[2]+flag[6]<4) line(x[2],y[2],x[6],y[6]); /*绘制右表面*/ if(flag[3]+flag[7]<4) line(x[3],y[3],x[7],y[7]); if(flag[4]+flag[5]<4) line(x[4],y[4],x[5],y[5]); /*绘制前表面*/ if(flag[4]+flag[7]<4) line(x[4],y[4],x[7],y[7]); if(flag[5]+flag[6]<4) line(x[5],y[5],x[6],y[6]); /*绘制后表面*/ if(flag[6]+flag[7]<4) line(x[6],y[6],x[7],y[7]); }

void v_w_x(x0,y0,z0,xx,yy,xc,yc,l) /*绕x周旋转函数*/ float x0[8],y0[8],z0[8]; float xx,yy,xc,yc,l; { int i,r; int flag[8]; float x[8],y[8],z[8]; float a,b,c,t,dx=xc-xx,dy=yc-yy; /*设定移动方向*/ for(t=0;t<=PI;t+=PI/2000) { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); r=(regs.x.ax==2)?1:0; /*若右击则退出*/ if(r) { cleardevice(); sp(); } else { if(yy>=480-l*sqrt(2)||yy<=l*sqrt(2)) /*撞壁反弹*/ dy=(-1)*dy; if(xx>=640-l*sqrt(2)||xx<=l*sqrt(2)) dx=(-1)*dx; xx=xx+dx/200; yy=yy+dy/200; RGB(1,(int)(t*33+20)%64,(int)(t*35+40)%64,(int)(t*37+60)%64); /*定义颜色*/ initial(flag); cleardevice(); for(i=0;i<8;i++) { a=x0[i]; /*三维坐标转化为二维坐标*/ b=y0[i]*cos(t)-z0[i]*sin(t); c=z0[i]*cos(t)+y0[i]*sin(t); x0[i]=a,y0[i]=b,z0[i]=c; x[i]=x0[i]-0.25*sqrt(2)*z0[i]+xx, y[i]=-y0[i]+0.25*sqrt(2)*z0[i]+yy; } reflag(x0,y0,z0,flag,l); /*更新标志值,并画图*/ paint(x,y,flag); getch(); } } }

void v_w_y(x0,y0,z0,xx,yy,xc,yc,l) /*绕y周旋转函数*/ float x0[8],y0[8],z0[8]; float xx,yy,xc,yc,l; { int i,r; int flag[8]; float x[8],y[8],z[8]; float a,b,c,t,dx=xc-xx,dy=yc-yy; /*设定移动方向*/ for(t=0;t<=PI;t+=PI/2000) { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); r=(regs.x.ax==2)?1:0; /*若右击则退出*/ if(r) { cleardevice(); sp(); } else { if(yy>=480-l*sqrt(2)||yy<=l*sqrt(2)) /*撞壁反弹*/ dy=(-1)*dy; if(xx>=640-l*sqrt(2)||xx<=l*sqrt(2)) dx=(-1)*dx; xx=xx+dx/200; yy=yy+dy/200; RGB(1,(int)(t*33+20)%64,(int)(t*35+40)%64,(int)(t*37+60)%64); /*定义颜色*/ initial(flag); cleardevice(); for(i=0;i<8;i++) { a=x0[i]*cos(t)+z0[i]*sin(t); /*三维坐标转化为二维坐标*/ b=y0[i]; c=z0[i]*cos(t)-x0[i]*sin(t); x0[i]=a,y0[i]=b,z0[i]=c; x[i]=x0[i]-0.25*sqrt(2)*z0[i]+xx, y[i]=-y0[i]+0.25*sqrt(2)*z0[i]+yy; } reflag(x0,y0,z0,flag,l); /*更新标志值,并画图*/ paint(x,y,flag); getch(); } } }

void v_w_z(x0,y0,z0,xx,yy,xc,yc,l) /*绕z周旋转函数*/ float x0[8],y0[8],z0[8]; float xx,yy,xc,yc,l; { int i,r; int flag[8]; float x[8],y[8],z[8]; float a,b,c,t,dx=xc-xx,dy=yc-yy; /*设定移动方向*/ for(t=0;t<=PI;t+=PI/2000) { regs.x.ax=5; regs.x.bx=0; int86(51,&regs,&regs); r=(regs.x.ax==2)?1:0; /*若右击则退出*/ if(r) { cleardevice(); sp(); } else { if(yy>=480-l*sqrt(2)||yy<=l*sqrt(2)) /*撞壁反弹*/ dy=(-1)*dy; if(xx>=640-l*sqrt(2)||xx<=l*sqrt(2)) dx=(-1)*dx; xx=xx+dx/200; yy=yy+dy/200; RGB(1,(int)(t*33+20)%64,(int)(t*35+40)%64,(int)(t*37+60)%64); /*定义颜色*/ initial(flag); cleardevice(); for(i=0;i<8;i++) { a=x0[i]*cos(t)-y0[i]*sin(t); /*三维坐标转化为二维坐标*/ b=y0[i]*cos(t)+x0[i]*sin(t); c=z0[i]; x0[i]=a,y0[i]=b,z0[i]=c; x[i]=x0[i]-0.25*sqrt(2)*z0[i]+xx, y[i]=-y0[i]+0.25*sqrt(2)*z0[i]+yy; } reflag(x0,y0,z0,flag,l); /*更新标志值,并画图*/ paint(x,y,flag); getch(); } } }

/****************************下面继续*********************************/


2004-11-13 17:26
woojoe
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2004-5-5
收藏
得分:0 

void cube(l,xx,yy,xc,yc) /*旋转移动立方体程序*/ float l,xx,yy,xc,yc; { union k { char c[2]; int i; }key; /*设键值用于判断*/ float x[8],y[8]; float x0[8],y0[8],z0[8]; int f[8]={0,0,0,0,0,0,0,0},n;

x0[0]=-l,x0[1]=l,x0[2]=l,x0[3]=-l,x0[4]=-l,x0[5]=l,x0[6]=l,x0[7]=-l, /*初始化立方体*/ y0[0]=l,y0[1]=l,y0[2]=l,y0[3]=l,y0[4]=-l,y0[5]=-l,y0[6]=-l,y0[7]=-l, z0[0]=l,z0[1]=l,z0[2]=-l,z0[3]=-l,z0[4]=l,z0[5]=l,z0[6]=-l,z0[7]=-l; for(n=0;n<8;n++) { x[n]=x0[n]-0.25*sqrt(2)*z0[n]+xx; y[n]=-y0[n]+0.25*sqrt(2)*z0[n]+yy; /*三维坐标到二维的转化*/ } RGB(1,20,40,60); setcolor(1); reflag(x0,y0,z0,f); paint(x,y,f); /*画初始时静态的立方体*/ do { key.i=bioskey(0); switch(key.c[1]) { case 0x4d: /*按相左的方向键,立方体绕x轴旋转*/ v_w_x(x0,y0,z0,xx,yy,xc,yc,l); break; case 0x48: /*按相右的方向键,立方体绕y轴旋转*/ v_w_y(x0,y0,z0,xx,yy,xc,yc,l); break; case 0x4b: /*按相上的方向键,立方体绕z轴旋转*/ v_w_z(x0,y0,z0,xx,yy,xc,yc,l); break; default: break; } } while(key.c[0]!='q'); /*按q退出*/ }

void button() /*整个程序的主界面函数*/ { settextstyle(0,0,1); setlinestyle(0,0,3); setcolor(1); rectangle(70,235,140,265); /*绘制各个按键*/ rectangle(200,235,380,265); rectangle(440,235,560,265); setcolor(14); outtextxy(90,247,"CUBE"); /*绘制按键上的文字*/ outtextxy(220,247,"FIVE-POINTED STAR"); outtextxy(460,247,"MAGIC LINE"); setlinestyle(0,0,1); setcolor(WHITE); rectangle(600,10,610,20); /*绘制退出键*/ line(600,10,610,20); line(600,20,610,10); RGB(1,30,40,60); setcolor(1); settextstyle(4,0,5); /*绘制文字*/ outtextxy(120,70,"The Screen Protectors"); setcolor(14); rectangle(20,0,620,479); /*绘制主框图*/ settextstyle(1,0,2); setcolor(1); outtextxy(170,370,"----- WRITED BY JOE -----");

} void cursor(int x,int y) /*鼠标形状函数*/ { line(x,y,x+20,y+20); line(x,y,x,y+20); line(x,y+20,x+8,y+14); line(x+20,y+20,x+8,y+14); }

int init(int xmi,int xma,int ymi,int yma) /*鼠标初始化函数*/ { int retcode; regs.x.ax=0; int86(51,&regs,&regs); /*调用51中断*/ retcode=regs.x.ax; if(retcode==0) return 0; regs.x.ax=7; /*设定水平光标最大/最小位置*/ regs.x.cx=xmi; regs.x.dx=xma; int86(51,&regs,&regs); regs.x.ax=8; /*设定垂直光标最大/最小位置*/ regs.x.cx=ymi; regs.x.dx=yma; int86(51,&regs,&regs); return retcode; }

int read(int *mx,int *my,int *mbutt) /*读取鼠标状态函数*/ { int xnew,ynew; regs.x.ax=3; /*取得鼠标状态和当前位置*/ int86(51,&regs,&regs); xnew=regs.x.cx; ynew=regs.x.dx; *mbutt=regs.x.bx; *mx=xnew; /*鼠标当前位置的坐标*/ *my=ynew; return 1; }

void press() /*鼠标单击事件响应函数*/ { int i,l,ll,xx,yy; regs.x.ax=5; /*取得鼠标按下信息*/ regs.x.bx=0; int86(51,&regs,&regs); l=(regs.x.ax==1)?1:0; /*判断是否为左键*/ regs.x.ax=3; /*取得鼠标状态和当前位置*/ int86(51,&regs,&regs); xx=regs.x.cx; yy=regs.x.dx; if(l) /*左键事件处理*/ { if(yy>=235&&yy<=265) { if(xx>=70&&xx<=140) /*点击CUBE键的处理*/ { cleardevice(); cube(50.0,560.0,260.0,240.0,480.0); } if(xx>=200&&xx<=380) /*点击FIVE-POINTED STAR键的处理*/ { cleardevice(); rfs(200,100,80,1.3,77.3); } if(xx>=440&&xx<=560) /*点击MAGIC LINE键的处理*/ { cleardevice(); magicline(); } } if(xx>=590&&yy<=600&&yy>=10&&yy<=20) /*点击"X"型键,退出整个程序*/ { exit(1); } } }

void newxy(int *mx,int *my,int *mbutt) /*鼠标移动函数*/ { int xx0=*mx,yy0=*my; int xm,ym; read(&xm,&ym,&mbutt); if(xm==xx0&&ym==yy0); /*判断鼠标是否移动*/ else { putimage(xx0,yy0,buf,0); getimage(xm,ym,xm+20,ym+20,buf); setcolor(2); cursor(xm,ym); /*清除旧鼠标,绘制新鼠标*/ } *mx=xm; *my=ym; }

void sp() /*主程序*/ { int x,y,b; setbkcolor(0); init(0,610,0,480); button(); setcolor(15); while(1){ /*实现鼠标的移动和点击事件的响应*/ newxy(&x,&y,&b); press();} }

main() /*main函数*/ { int graphdriver=DETECT,graphmode; initgraph(&graphdriver,&graphmode,""); sp(); }


2004-11-13 17:30
Dream
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2004-11-5
收藏
得分:0 
不好意思,昨天刚考完VB……全脑袋的代码。耐心都消磨光了!看不完你的程序!

!..我鄙视浮躁的人..! 浮躁的人容易问: 我到底该学什么? 别问,学就对了! 浮躁的人容易问: JS有前途吗? 建议你去抢银行! 浮躁的人容易问: 我要中问版,我英文不行! 不行?学呀! 浮躁的人分两种: 只观望而不学的人; 只学而不坚持的人;
2004-11-13 17:40
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

大师,我没看懂你代码,没有graphics.h和dos.h,难道真的要小弟下载个TC下来?

2004-11-13 19:21
anhua200hl
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2004-10-10
收藏
得分:0 
好晕

我是菜鸟,我想飞..............................
2004-11-14 21:57
onlyonly
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-6-28
收藏
得分:0 
好厉害!
2006-06-28 14:51
onlyonly
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-6-28
收藏
得分:0 
怎么运行这个程序?
2006-06-28 14:52
快速回复:请哪位大虾优化一把我的消隐算法(书上的行不通,所以自己写了一个…… ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021267 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved