Schreiben Sie ein Programm in C/C++, um den Cohen-Sutherland-Line-Clipping-Algorithmus zu implementieren. Betrachten Sie in dieser Implementierung zwei Fälle einer Linie: Völlig sichtbar, Völlig unsichtbar, gegen das rechteckige Clipping-Fenster?

1 Antworten


  • - Linien-Clipping mit Cohen-Sutherland-Algo -*/
    /*------*/

    #include
    #include

    typedef unsigned int outcode;
    Aufzählung { TOP=0x1, UNTEN=0x2, RECHTS=0x4, LINKS=0x8};

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

    int gd,gm;
    outcode code0,code1,codeout;
    int akzeptieren = 0, fertig = 0;

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

    do{
    if(!(code0 | code1))
    { akzeptieren =1; fertig =1; }
    else
    if(code0 & code1) done = 1;
    else
    {
    float x,y;
    Codeout = Code0 ? Code0: Code1;
    if(codeout & TOP)
    {
    x = x0 + (x1-x0)*(ywmax-y0)/(y1-y0);
    y = ywmax;
    }
    Else
    if (CodeOut & unten)
    {
    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);
    }
    sonst
    {
    x1 = x; y1 = y;
    code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);
    }
    }
    } Während (erledigt == 0);

    if(akzeptieren) line(x0,y0,x1,y1);

    Rechteck(xwmin,ywmin,xwmax,ywmax);

    getch();

    }
    /*------*/

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

    if(y> ywmax)
    Code |=TOP;
    sonst if( y xwmax)
    Code |= RECHTS;
    else if ( x< xwmin)
    Code |= LINKS ;

    Rückgabe Code);
    }

    /*------*/

    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\tGeben Sie die Koordinaten der Linie ein:");

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

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

    printf("\n\tGeben Sie die Koordinaten des Fensters ein :\n ");
    printf("\n\txwmin , ywmin : ");
    scanf("%f %f", &xwmin,&ywmin);
    printf("\n\txwmax , ywmax : ");
    scanf("%f %f",&xwmax,&ywmax);

    Linie(x1,y1,x2,y2);
    Rechteck(xwmin,ywmin,xwmax,ywmax);
    getch();
    cleardevice();

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

    }

    /****** COHEN-SUTHERLAND LINIENAUSSCHNITT ******/

Schreibe deine Antwort

Ihre Antwort erscheint nach der Moderation appear