Sutherland-Hodgeman Polygon Clipping

Ram Pothuraju
This program is for implementing Sutherland-Hodgeman Polygon Clipping .


#include"stdio.h"
#include"conio.h"
#include"graphics.h"
#include"math.h"
void dda(int,int,int,int,int,int,int,int);
void dda(int x1,int y1,int x2,int y2,int xmin,int ymin,int xmax,int ymax)
{
            float dx,dy;
            float steps,x=x1,y=y1;
            int i=0;
            dx=x2-x1;
            dy=y2-y1;
            if(abs(dx)>=abs(dy))
                        steps=abs(dx);
            else
                        steps=abs(dy);
            dx=dx/steps;
            dy=dy/steps;
            while(i++<=steps)
            {
            if(x>=xmin && x<=xmax && y>=ymin && y<=ymax)
            {
                        line(x,y,x2,y2);
                        return;
            }
                        x=x+dx;
                        y=y+dy;
            }
}
void main()
{
            int n,gd,gm,x1,x2,y1,y2,xRec,yRec,b1,b2,b3,b4,l,b,yMin,yMax,xMin,xMax;
            float m;
            int a[10][4],i,j, flag=0,in=0;
            gd=DETECT;
            gm=DETECT;
            initgraph(&gm,&gd,"C:\\TC\\BGI");

            printf("Enter the length and breadth of the clipping window:\n");
            scanf("%d%d",&l,&b);

            printf("Enter the starting co-ord of the rectangle\n");
            scanf("%d%d",&xRec,&yRec);
            clrscr();

            rectangle(xRec,yRec,xRec+l,yRec+b);
            getch();
            clrscr();


            printf("Enter the no of lines\n");
            scanf("%d",&n);

            for(i=0;i<n;i++)
            {
                        printf("Enter the co-ord of line %d\n",i+1);
                        for(j=0;j<2;j++)
                        {
                                    scanf("%d",&a[i][j]);
                        }
                        a[i][2]=a[0][0];
                        a[i][3]=a[0][1];
                        if(i!=0)
                        {
                               a[i-1][2]=a[i][0];
                               a[i-1][3]=a[i][1];
                        }
            }
            clrscr();
            rectangle(xRec,yRec,xRec+l,yRec+b);
            for(i=0;i<n;i++)
            {
                        line(a[i][0],a[i][1],a[i][2],a[i][3]);
            }
            getch();
            clrscr();
            rectangle(xRec,yRec,xRec+l,yRec+b);

            xMin=xRec;
            yMin=yRec;
            xMax=xRec+l;
            yMax=yRec+b;

            for(i=0;i<n;i++)
            {
                        flag=0;
                        x1=a[i][0];
                        x2=a[i][2];
                        y1=a[i][1];
                        y2=a[i][3];

                        if(x1>=xMin && x1<=xMax && y1>=yMin && y1<=yMax)
                                    flag++;
                        if(x2>=xMin && x2<=xMax && y2>=yMin && y2<=yMax)
                                    flag++;


                        switch(flag)
                        {
                                    case 0:
                                                break;

case 1: if(x2>=xMin && x2<=xMax && y2>=yMin &&    y2<=yMax)
                                                {
                                                            dda(x1,y1,x2,y2,xMin,yMin,xMax,yMax);

                                                }
                                                else
                                                {
                                                            dda(x2,y2,x1,y1,xMin,yMin,xMax,yMax);

                                                }
                                                break;
                                    case 2: line(x1,y1,x2,y2);
                                                break;
                        }
            }

            getch();

            closegraph();
}




Post a Comment

0Comments

Post a Comment (0)