[IFET PLACEMENT] lab ex5 & 6

  • From: kalai vani <kalaivani_floraa@xxxxxxxxx>
  • To: 2012 batch <compass@xxxxxxxxxxxxx>
  • Date: Tue, 23 Aug 2011 13:02:36 +0530 (IST)

hi IV cse,
 i attached the exercise no.4 & 5 programs.
#include<stdio.h>
#include<conio.h>
#include<dos.h>
#include<graphics.h>
#include<stdlib.h>
typedef struct coord
{
int x,y;
char code[4];
}PT;
void drawwindow();
void drawline(PT p1,PT p2,int c1);
PT setcode(PT p);
int visibility(PT p1,PT p2);
PT resetendpt(PT p1,PT p2);
void main()
{
int gd=DETECT,gm,v;
PT p1,p2,ptemp;
initgraph(&gd,&gm,"c:\\tc\\bgi");
cleardevice();
printf("\t\tCOHEN-SUTHERLAND LINE CLIPPING ALGORITHM");
printf("\nEnter the two end points p1(x,y)");
scanf("%d%d",&p1.x,&p1.y);
printf("Enter the two end points p2(x,y):");
scanf("%d%d",&p2.x,&p2.y);
cleardevice();
printf("\t\tCLIPPING WINDOW");
drawwindow();
getch();
printf("\tCOHEN-SUTHERLAND LINE CLIPPING ALGORITHM");
printf("\n\t\tBEFORE CLIPPING");
drawline(p1,p2,4);
getch();
p1=setcode(p1);
p2=setcode(p2);
v=visibility(p1,p2);
switch(v)
{
  case 0:
   cleardevice();
   //printf("\t\tCLIPPING WINDOW");
   drawwindow();
   drawline(p1,p2,15);
  break;
 case 1:
   cleardevice();
   drawwindow();
  break;
  case 2:
   cleardevice();
   p1=resetendpt(p1,p2);
   p2=resetendpt(p2,p1);
   drawwindow();
   printf("\tCOHEN-SUTHERLAND LINE CLIPPING ALGORITHM");
   printf("\n\t\tAFTER CLIPPING");
   drawline(p1,p2,15);
  break;
 }
 getch();
 closegraph();
//return(0);
}
void drawwindow()
{
 setcolor(RED);
 setlinestyle(DOTTED_LINE, 1, 1);
 line(150,100,100,100);
 line(150,100,150,50);
 line(450,100,500,100);
 line(450,100,450,50);
 line(450,350,500,350);
 line(450,350,450,400);
 line(150,350,150,400);
 line(150,350,100,350) ;
 line(150,100,100,100);
 line(150,100,150,50);
 setlinestyle(SOLID_LINE, 1, 1);
 line(150,100,450,100);
 line(450,100,450,350);
 line(450,350,150,350);
 line(150,350,150,100);

 outtextxy(450,30,"1001");
 outtextxy(470,200,"1000");
 outtextxy(470,370,"1010");
 outtextxy(300,370,"0010");
 outtextxy(120,370,"0110");
 outtextxy(120,200,"0100");
 outtextxy(120,30,"0101");
 outtextxy(300,30,"0001");
 outtextxy(300,200,"0000");
}
void drawline(PT p1,PT p2,int c1)
{
 setcolor(c1);
 line(p1.x,p1.y,p2.x,p2.y);
}

PT setcode(PT p)
{
 PT ptemp;
 if(p.y<100)
  ptemp.code[0]='1';
 else
  ptemp.code[0]='0';
 if(p.y>350)
  ptemp.code[1]='1';
 else
  ptemp.code[1]='0';
 if(p.x>200)
  ptemp.code[2]='1';
 else
  ptemp.code[2]='0';
 if(p.x<150)
  ptemp.code[3]='1';
 else
  ptemp.code[3]='0';
  ptemp.x=p.x;
  ptemp.y=p.y;
 return(ptemp);
}
int visibility(PT p1,PT p2)
{
 int i,flag=0;
 for(i=0;i<4;i++)
 {
  if((p1.code[i]!='0')||(p2.code[i]!='0'))
  flag=1;
 }
 if(flag==0)
 return(0);
 for(i=0;i<4;i++)
 {
  if((p1.code[i]==p2.code[i])&&(p1.code[i]=='1'))
  flag=0;
 }
 if(flag==0)
 return(1);
 return(2);
}
PT resetendpt(PT p1,PT p2)
{
 PT temp;
 int x,y,i;
 float m,k;
 if(p1.code[3]=='1')
 x=150;
 if(p1.code[2]=='1')
 x=450;
 if((p1.code[3]=='1')||(p1.code[2]=='1'))
 {
  m=(float)(p2.y-p1.y)/(p2.x-p1.x);
  k=(p1.y+(m*(x-p1.x)));
  temp.y=k;
  temp.x=x;
  for(i=0;i<4;i++)
  {
   temp.code[i]=p1.code[i];
   if(temp.y<=350 && temp.y>=100)
    return(temp);
  }
  if(p1.code[0]=='1')
  y=100;
  if(p1.code[1]=='1')
  y=350;
  if((p1.code[0]=='1')||(p1.code[1]=='1'))
  {
   m=(float)(p2.y-p1.y)/(p2.x-p1.x);
   k=(float)p1.x+(float)(y-p1.y)/m;
   temp.y=y;
   temp.x=k;
   for(i=0;i<4;i++)
   temp.code[i]=p1.code[i];
   return(temp);
  }
 }
 else
 return(p1);
 return(p2);
}
//POLYGON CLIPPING USING SUTHERLAND-HODGMAN METHOD

#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#define round(a) ((int)(a+0.5))
int k;
float xmin,ymin,xmax,ymax,arr[20],m;

void clipl(float x1,float y1,float x2,float y2)
{
        if(x2-x1)
                m=(y2-y1)/(x2-x1);
        else
                m=100000;
        if(x1>=xmin && x2>=xmin)
        {
                arr[k]=x2;
                arr[k+1]=y2;
                k+=2;
        }
        if(x1<xmin && x2>=xmin)
        {
                arr[k]=xmin;
                arr[k+1]=y1+m*(xmin-x1);
                arr[k+2]=x2;
                arr[k+3]=y2;
                k+=4;
        }
        if(x1>=xmin  && x2<xmin)
        {
                arr[k]=xmin;
                arr[k+1]=y1+m*(xmin-x1);
                k+=2;
        }
}

void clipt(float x1,float y1,float x2,float y2)
{
        if(y2-y1)
                m=(x2-x1)/(y2-y1);
        else
                m=100000;
        if(y1<=ymax && y2<=ymax)
        {
                arr[k]=x2;
                arr[k+1]=y2;
                k+=2;
        }
        if(y1>ymax && y2<=ymax)
        {
                arr[k]=x1+m*(ymax-y1);
                arr[k+1]=ymax;
                arr[k+2]=x2;
                arr[k+3]=y2;
                k+=4;
        }
        if(y1<=ymax  && y2>ymax)
        {
                arr[k]=x1+m*(ymax-y1);
                arr[k+1]=ymax;
                k+=2;
        }
}

void clipr(float x1,float y1,float x2,float y2)
{
        if(x2-x1)
                m=(y2-y1)/(x2-x1);
        else
                m=100000;
        if(x1<=xmax && x2<=xmax)
        {
                arr[k]=x2;
                arr[k+1]=y2;
                k+=2;
        }
        if(x1>xmax && x2<=xmax)
        {
                arr[k]=xmax;
                arr[k+1]=y1+m*(xmax-x1);
                arr[k+2]=x2;
                arr[k+3]=y2;
                k+=4;
        }
        if(x1<=xmax  && x2>xmax)
        {
                arr[k]=xmax;
                arr[k+1]=y1+m*(xmax-x1);
                k+=2;
        }
}

void clipb(float x1,float y1,float x2,float y2)
{
        if(y2-y1)
                m=(x2-x1)/(y2-y1);
        else
                m=100000;
        if(y1>=ymin && y2>=ymin)
        {
                arr[k]=x2;
                arr[k+1]=y2;
                k+=2;
        }
        if(y1<ymin && y2>=ymin)
        {
                arr[k]=x1+m*(ymin-y1);
                arr[k+1]=ymin;
                arr[k+2]=x2;
                arr[k+3]=y2;
                k+=4;
        }
        if(y1>=ymin  && y2<ymin)
        {
                arr[k]=x1+m*(ymin-y1);
                arr[k+1]=ymin;
                k+=2;
        }
}

void main()
{
        int gdriver=DETECT,gmode,n,poly[20];
        float xi,yi,xf,yf,polyy[20];
        initgraph(&gdriver,&gmode,"c:\\tc\\bgi");
        clrscr();
        printf("Coordinates of rectangular clip window :\nxmin,ymin             
:");
        cin>>xmin>>ymin;
        printf("xmax,ymax             :");
        cin>>xmax>>ymax;
        printf("\n\nPolygon to be clipped :\nNumber of sides       :");
        cin>>n;
        printf("Enter the coordinates :");
        for(int i=0;i<2*n;i++)
                cin>>polyy[i];
        polyy[i]=polyy[0];
        polyy[i+1]=polyy[1];
        for(i=0;i<2*n+2;i++)
                poly[i]=round(polyy[i]);
        initgraph(&gdriver,&gmode,"c:\\tc\bgi");
        setcolor(RED);
        rectangle(xmin,ymax,xmax,ymin);
        printf("\t\tUNCLIPPED POLYGON");
        setcolor(WHITE);
        fillpoly(n,poly);
        getch();
        cleardevice();
        k=0;
        for(i=0;i<2*n;i+=2)
                clipl(polyy[i],polyy[i+1],polyy[i+2],polyy[i+3]);
        n=k/2;
        for(i=0;i<k;i++)
                polyy[i]=arr[i];
        polyy[i]=polyy[0];
        polyy[i+1]=polyy[1];
        k=0;
        for(i=0;i<2*n;i+=2)
                clipt(polyy[i],polyy[i+1],polyy[i+2],polyy[i+3]);
        n=k/2;
        for(i=0;i<k;i++)
                polyy[i]=arr[i];
        polyy[i]=polyy[0];
        polyy[i+1]=polyy[1];
        k=0;
        for(i=0;i<2*n;i+=2)
                clipr(polyy[i],polyy[i+1],polyy[i+2],polyy[i+3]);
        n=k/2;
        for(i=0;i<k;i++)
                polyy[i]=arr[i];
        polyy[i]=polyy[0];
        polyy[i+1]=polyy[1];
        k=0;
        for(i=0;i<2*n;i+=2)
                clipb(polyy[i],polyy[i+1],polyy[i+2],polyy[i+3]);
        for(i=0;i<k;i++)
                poly[i]=round(arr[i]);
        if(k)
                fillpoly(k/2,poly);
        setcolor(RED);
        rectangle(xmin,ymax,xmax,ymin);
        printf("\tCLIPPED POLYGON");
        getch();
        closegraph();
}

Other related posts:

  • » [IFET PLACEMENT] lab ex5 & 6 - kalai vani