Tubor C 直线裁剪算法 Cohen-Sutherland算法 (可运行代码)

来源:互联网 发布:绘画小区平面图软件 编辑:程序博客网 时间:2024/06/05 23:58

因为TuborC 程序的编辑页面的宽度最多是250,所以为了控制edit时候的代码宽度,所以直接全部左对齐。

(下面程序暂时不能裁剪 斜率为零 或者 斜率不存在的情况, 近期将完善更新)

#include <graphics.h> #include <stdio.h>  int x_min,x_max,y_min, y_max; main() {   int driver,mode; int x1,y1,x2,y2;   x_min=150; y_min=100; x_max=500; y_max=300; driver=DETECT;  initgraph(&driver,&mode,"c:\\tc\\bgi"); draw_win(3);  x1=60;y1=120;x2=580;y2=270; line(x1,480-y1,x2,480-y2); getch();  clipline(x1,y1,x2,y2);  x1=200;y1=360;x2=280;y2=250; setcolor(7);  line(x1,480-y1,x2,480-y2); getch();  clipline(x1,y1,x2,y2); x1=350;y1=170;x2=550;y2=200; setcolor(7);  line(x1,480-y1,x2,480-y2); getch();  clipline(x1,y1,x2,y2); x1=260;y1=150;x2=220;y2=60; setcolor(7);  line(x1,480-y1,x2,480-y2); getch();  clipline(x1,y1,x2,y2); x1=50;y1=150;x2=50;y2=150; setcolor(7);  line(x1,480-y1,x2,480-y2); getch();  clipline(x1,y1,x2,y2); x1=150;y1=50;x2=150;y2=400; setcolor(7);  line(x1,480-y1,x2,480-y2); getch();  clipline(x1,y1,x2,y2); getch();  closegraph(); }  clipline(int x1,int y1,int x2,int y2) {  int i,code1[4],code2[2],display; float k;  display=0;  k = (float)(y2-y1)/(float)(x2-x1); while(1) {  encode(x1,y1,code1); encode(x2,y2,code2); if(accept(code1,code2)) {  display=1; break; }  else if(reject(code1,code2)) {  break; }  if(swapyn(code1,code2)==1){int t;t = x1;x1 = x2;x2 = t;t = y1;y1 = y2;y2 = t;} if(code1[0])   {x1 = x1 + (y_max-y1)/k;y1 = y_max;}else if(code1[1]){x1 = x1 + (y_min-y1)/k;y1 = y_min;}else if(code1[2]){y1 = y1 + (x_max-x1)*k; x1 = x_max;}else if(code1[3]){y1 = y1 + (x_min-x1)*k;x1 = x_min;}}  if(display==1) {setcolor(4);  line(x1,480-y1,x2,480-y2); }} encode(int x,int y,int code[]){int i;for(i=0; i<4; i++)  code[i]=0;if(y > y_max) code[0]=1;if(y < y_min) code[1]=1;if(x > x_max) code[2]=1;if(x < x_min) code[3]=1;}accept(int code1[],int code2[]) {  int i,flag; flag=1;  for(i=0;i<4;i++)  if((code1[i]==1)||(code2[i]==1)) {  flag=0; break; }  return flag; }   reject(int code1[],int code2[]) {  int i,flag; flag=0;  for(i=0;i<4;i++)  if((code1[i]==1)&&(code2[i]==1)) {  flag=1; break; }  return flag; }   swapyn(int code1[],int code2[]){int i,flag1,flag2,tmp;flag1=0;if(code1[0]+code1[1]+code1[2]+code1[3] !=0)flag1 = 1;flag2=0;if(code2[0]+code2[1]+code2[2]+code2[3] !=0)flag2 = 1;if(flag1==1 && flag2==1)    return 0;else if(flag1==0 && flag2==1) {  for(i=0; i<4; i++) {  tmp = code1[i];  code1[i] = code2[i];  code2[i] = tmp;}return  1; } elsereturn  0;}draw_win(int c) {  setcolor(c);  line(x_min,480-y_min,x_max,480-y_min); line(x_max,480-y_min,x_max,480-y_max); line(x_max,480-y_max,x_min,480-y_max); line(x_min,480-y_max,x_min,480-y_min); setcolor(7); getch(); }


阅读全文
0 0
原创粉丝点击