📄 zhang.c
字号:
{
int x0,x1,y0,y1,color,width;
int figure;
char ct;
void MidPointLine(int x0,int y0,int x1,int y1,int color,int width,int figure);
printf("Notice:\n");
printf(" you can input the follow parameter:\n");
printf("MidPointLine(50,25,-50,-25,2,1,1)\n");
printf("MidPointLine(-50,25,50,-25,3,2,1)\n");
printf("MidPointLine(-50,25,50,-25,3,2,0)\n");
printf("MidPointLine(-50,75,50,-75,7,5,0)\n");
MidPointLine(50,25,-50,-25,2,1,1);
MidPointLine(-50,25,50,-25,3,2,1);
MidPointLine(-50,-75,50,75,6,3,0);
MidPointLine(-50,75,50,-75,7,5,0);
printf("x0=");
scanf("%d",&x0);
printf("y0=");
scanf("%d",&y0);
printf("x1=");
scanf("%d",&x1);
printf("y1=");
scanf("%d",&y1);
printf("color=");
scanf("%d",&color);
printf("width=");
scanf("%d",&width);
printf("if draw real line,input 1 draw dashed,input else\n");
printf("figure=");
scanf("%d",&figure);
MidPointLine(x0,y0,x1,y1,color,width,figure);
setcolor(YELLOW);
outtextxy(10,370,"If you want to continue to draw line:push Y");
ct = getch(); /* Read a character from kbd */
if( 121 == ct )
{
clearviewport();
moveto(0,0);
setcolor(WHITE);
printf("Try it again!\n");
establishcoordinate();
DrawLine(); }
}
/*--------------------------------------------二维裁剪------------------------------------------*/
void CohenSutherlandLineClip(float x0,float y0,float x1,float y1,Rectangle *rect)
{
void CompOutCode(float x,float y,Rectangle* rect,OutCode* outCode);
int accept,done;
OutCode outCode0,outCode1;
OutCode *outCodeOut;
float x,y;
accept=false;
done=false;
CompOutCode(x0,y0,rect,&outCode0);
CompOutCode(x1,y1,rect,&outCode1);
Pause();
do{
if(outCode0.all==0&&outCode1.all==0)
{
accept=true;
done=true;
}
else if((outCode0.all&outCode1.all)!=0)
done=true;
else
{
if(outCode0.all!=0)
outCodeOut=&outCode0;
else
outCodeOut=&outCode1;
if(outCodeOut->left)
{
y=y0+(y1-y0)*(rect->xmin-x0)/(x1-x0);
x=(float)rect->xmin;
}
else if(outCodeOut->top)
{
x=x0+(x1-x0)*(rect->ymax-y0)/(y1-y0);
y=(float)rect->ymax;
}
else if(outCodeOut->right)
{
y=y0+(y1-y0)*(rect->xmax-x0)/(x1-x0);
x=(float)rect->xmax;
}
else if(outCodeOut->bottom)
{
x=x0+(x1-x0)*(rect->ymin-y0)/(y1-y0);
y=(float)rect->ymin;
}
if(outCodeOut->all==outCode0.all)
{x0=x;
y0=y;
CompOutCode(x0,y0,rect,&outCode0);
}
else
{x1=x;
y1=y;
CompOutCode(x1,y1,rect,&outCode1);
}
}
}while(!done);
setcolor(BLACK);
line(200,0,100,400);
setcolor(WHITE);
if(accept)
line((int)x0,(int)y0,(int)x1,(int)y1);
Pause();
}
void CompOutCode(float x,float y,Rectangle* rect,OutCode* outCode)
/*说明:这个子程序供CohenSutherlandLineClip函数调用
功能:实现对直线端点的编码*/
{
outCode->all=0;
outCode->top=outCode->bottom=0;
if(y>(float)rect->ymax)
{
outCode->top=1;
outCode->all+=8;
}
else if(y<(float)rect->ymin)
{
outCode->bottom=1;
outCode->all+=4;
}
outCode->right=outCode->left=0;
if(x>(float)rect->xmax)
{
outCode->right=1;
outCode->all+=2;
}
else if(x<(float)rect->xmin)
{
outCode->left=1;
outCode->all+=1;
}
}
/*-----------------------显示三次Bezier曲线--------------------*/
void DisplayCubicBezierCurve(float p[4][2],int count)
{
float c[2][4],t,deltat;
float V[2],newV[2];
int i,j;
for(j=0;j<2;j++)
{c[j][0]=p[0][j];
c[j][1]=-3*p[0][j]+3*p[1][j];
c[j][2]=3*p[0][j]-6*p[1][j]+3*p[2][j];
c[j][3]=-p[0][j]+3*p[1][j]-3*p[2][j]+p[3][j];
}
V[0]=p[0][0];V[1]=p[0][1];
deltat=1.0/count;
t=0.0;
for(i=1;i<=count;i++)
{
t+=deltat;
newV[0]=c[0][0]+t*(c[0][1]+t*(c[0][2]+t*c[0][3]));
newV[1]=c[1][0]+t*(c[1][1]+t*(c[1][2]+t*c[1][3]));
line(V[0],V[1],newV[0],newV[1]);
V[0]=newV[0],V[1]=newV[1];
Pause();
}
}
/*----------------------梁友栋-Barsky线段裁剪算法------------------------*/
int ClipT(float q,float d,float* t0,float* t1)
{
float r;
if(q<0)
{
r=d/q;
if(r>*t1)
return 0;
else if(r>*t0)
{
*t0=r;
return 1;
}
}
else if(q>0)
{
r=d/q;
if(r<*t0)
return 0;
else if(r<*t1)
{
*t1=r;
return 1;
}
}
else if(d<0)
return 0;
return 1;
}
void LiangBarskyLineClip(float x0,float y0,float x1,float y1,Rectangle *rect)
{
float deltax,deltay,t0,t1;
t0=0;t1=1;
deltax=x1-x0;
if(ClipT(-deltax,x0-rect->xmin,&t0,&t1))
if(ClipT(deltax,rect->xmax-x0,&t0,&t1))
{deltay=y1-y0;
if(ClipT(-deltay,y0-rect->ymin,&t0,&t1))
if(ClipT(deltay,rect->ymax-y0,&t0,&t1))
{
Pause();
setcolor(BLACK);
line(0,200,400,100);
setcolor(YELLOW);
line((int)(x0+t0*deltax),(int)(y0+t0*deltay),(int)(x0+t1*deltax),(int)(y0+t1*deltay));
Pause();
return;
}
}
outtext("POP1 NOT BE SEEN!");
Pause();
}
int main(void)
{
int radius,list[10][2],x0,x1,y0,y1;
float a,b,c,count=50;
Rectangle rect={100,200,100,300};
float p1[4][2]={{100,400},{200,200},{300,100},{400,300}};
float p2[4][2]={{100,400},{200,200},{300,150},{400,300}};
x0=0;
x1=400;
y0=200;
y1=100;
/*----------------------这组数也可以作为测试数据------------------------*/
/* x0=125;
x1=225;
y0=150;
y1=150;*/
initgr(); /* BGI初始化 */
/*****此部分添加你自己的代码,例如
line(25, 25, 220, 220);
circle(100, 100, 50);
等等*****/
/*----------该小段用于LiangBarskyLineClip program的输入-----*/
setcolor(CYAN);
outtextxy(200,0,"this is a LiangBarskyLineClip program!");
setcolor(YELLOW);
line(0,200,400,100);
rectangle(100,300,200,100);
LiangBarskyLineClip(x0,y0,x1,y1,&rect);
clearviewport();
/*--------该小段用于Bezier program的输入-----*/
setcolor(GREEN);
line(100,400,200,200);
line(200,200,300,100);
line(300,100,400,300);
setcolor(YELLOW);
line(100,400,200,200);
line(200,200,300,150);
line(300,150,400,300);
outtextxy(200,0,"this is a Bezier program!");
setcolor(RED);
DisplayCubicBezierCurve(p1,count);
setcolor(WHITE);
DisplayCubicBezierCurve(p2,count);
clearviewport();
/*--------该小段用于Cohen-Sutherland的输入-----*/
outtextxy(200,0,"this is a Cohen-Sutherland program!");
x0=200;
x1=100;
y0=0;
y1=400;
line(200,0,100,400);
rectangle(100,300,200,100);
CohenSutherlandLineClip(x0,y0,x1,y1,&rect);
clearviewport();
/*--------该小段用于绘制五角星------*/
DrawPentacle(100,450,225);
/*--------该小段用于填充五角星------*/
FillPentacle(RED);
/*--------该小段用于PositiveNegativeParabola program的输入------*/
setcolor(GREEN);
printf("\n");
outtextxy(55,0,"this is a parabola program drawed by positive-negative method");
setcolor(WHITE);
printf("\nstep\n");
printf("First:establish coordinate\n");
Pause();
establishcoordinate();
printf("Second:draw parabola y=a*(x-b)^2+c\n");
printf(" please input parameter:\n");
printf(" a=");
scanf("%f",&a);
printf(" b=");
scanf("%f",&b);
printf(" c=");
scanf("%f",&c);
PositiveNegativeParabola(a,b,c,BLUE);
/*--------该小段用于画直线法的输入------*/
DrawLine();
printf("\n\n");
/*--------该小段用于生成圆的等面积正多边形迫近法------*/
printf("this is a program used for draw circle\n");
printf("please input parameter:radius=");
scanf("%d",&radius);
CircleToPolygon(radius);
Pause();
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -