Écrire un programme en C/C++ pour implémenter l'algorithme de découpage de ligne de Cohen-Sutherland. Dans cette implémentation, considérons deux cas d'une ligne : totalement visible, totalement invisible, contre la fenêtre de découpage rectangulaire ?

1 Réponses


  • - Coupure de ligne en utilisant cohen sutherland algo -*/
    /*------*/

    #include
    #include

    typedef unsigned int outcode ;
    enum { HAUT=0x1, BAS=0x2, DROIT=0x4, GAUCHE=0x8 } ;

    void lineclip(x0,y0,x1,y1,xwmin,ywmin,xwmax,ywmax )
    float x0,y0,x1,y1,xwmin,ywmin,xwmax,ywmax;
    {

    int gd, gm;
    code de sortie 0, code 1, code de sortie ;
    int accept = 0, done=0 ;

    code0 = calcode(x0,y0,xwmin,ywmin,xwmax,ywmax);
    code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);

    do{
    if(!(code0 | code1))
    { accept =1 ; fait =1; }
    else
    if(code0 & code1) done = 1;
    else
    {
    float x,y;
    code out = code0 ? Code0 : Code1;
    if(codeout & TOP)
    {
    x = x0 + (x1-x0)*(ywmax-y0)/(y1-y0) ;
    y = ywmax;
    }
    else
    if( codeout & BOTTOM)
    {
    x = x0 + (x1-x0)*(ywmin-y0)/(y1-y0);
    y = ywmin;
    }
    else
    if ( codeout & RIGHT)
    {
    y = y0+(y1-y0)*(xwmax-x0)/(x1-x0);
    x = xwmax ;
    }
    else
    {
    y = y0 + (y1-y0)*(xwmin-x0)/(x1-x0) ;
    x = xwmin;
    }
    if( codeout == code0)
    {
    x0 = x; y0 = y;
    code0=calcode(x0,y0,xwmin,ywmin,xwmax,ywmax);
    }
    else
    {
    x1 = x; y1 = y;
    code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);
    }
    }
    } while( done == 0);

    if(accepte) ligne(x0,y0,x1,y1) ;

    rectangle(xwmin,ywmin,xwmax,ywmax);

    getch();

    }
    /*------*/

    int calcode (x,y,xwmin,ywmin,xwmax,ywmax)
    float x,y,xwmin,ywmin,xwmax,ywmax;
    {
    code int =0;

    if(y> ywmax)
    code |=TOP;
    sinon si( y xwmax)
    code |= DROITE;
    sinon si ( x< xwmin)
    code |= GAUCHE;

    Code de retour);
    }

    /*------*/

    main()
    {

    float x2,y2,x1,y1,xwmin,ywmin,xwmax,ywmax;
    int gd,gm;

    detectgraph(&gd,&gm);
    initgraph(&gd,&gm,"C:\\TC\\BGI");

    printf("\n\n\tEntrez les coordonnées de la ligne :");

    printf("\n\n\tX1 Y1 : ");
    scanf("%f %f",&x1,&y1);

    printf("\n\n\tX2 Y2 : ");
    scanf("%f %f",&x2,&y2);

    printf("\n\tEntrez les coordonnées de la fenêtre :\n ");
    printf("\n\txwmin , ywmin : ");
    scanf("%f %f", &xwmin,&ywmin);
    printf("\n\txwmax , ywmax : ");
    scanf("%f %f",&xwmax,&ywmax);

    ligne(x1,y1,x2,y2) ;
    rectangle(xwmin,ywmin,xwmax,ywmax);
    getch();
    cleardevice();

    lineclip(x1,y1,x2,y2,xwmin,ywmin,xwmax,ywmax );
    getch();
    closegraph();

    }

    /****** COUPE DE LIGNE COHEN-SUTHERLAND ******/

Ecrivez votre réponse

Votre réponse apparaîtra après modération