Escriba un programa en C / C ++ para implementar el algoritmo de recorte de línea de Cohen-Sutherland. En esta implementación, considere dos casos de una línea: ¿Totalmente visible, totalmente invisible, contra la ventana de recorte rectangular?

1 Respuestas


  • - Recorte de línea usando cohen sutherland algo - * /
    / * ------ * /

    #include
    #include

    typedef unsigned int outcode;
    enumeración {ARRIBA = 0x1, ABAJO = 0x2, DERECHA = 0x4, IZQUIERDA = 0x8};

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

    int gd, gm;
    outcode code0, code1, codeout;
    int aceptar = 0, hecho = 0;

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

    hacer {
    si (! (código0 | código1))
    {aceptar = 1; hecho = 1; }
    else
    if (code0 & code1) done = 1;
    else
    {
    flotar x, y;
    codeout = code0? Code0: Code1;
    if (salida de código y TOP)
    {
    x = x0 + (x1-x0) * (ywmax-y0) / (y1-y0);
    y = ywmax;
    }
    else
    if (salida de código & BOTTOM)
    {
    x = x0 + (x1-x0) * (ywmin-y0) / (y1-y0);
    y = ywmin;
    }
    más
    si (salida de código y DERECHA)
    {
    y = y0 + (y1-y0) * (xwmax-x0) / (x1-x0);
    x = xwmax;
    }
    más
    {
    y = y0 + (y1-y0) * (xwmin-x0) / (x1-x0);
    x = xwmin;
    }
    si (codeout == code0)
    {
    x0 = x; y0 = y;
    code0 = calcode (x0, y0, xwmin, ywmin, xwmax, ywmax);
    }
    más
    {
    x1 = x; y1 = y;
    code1 = calcode (x1, y1, xwmin, ywmin, xwmax, ywmax);
    }
    }
    } while (hecho == 0);

    if (aceptar) línea (x0, y0, x1, y1);

    rectángulo (xwmin, ywmin, xwmax, ywmax);

    getch ();

    }
    / * ------ * /

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

    if (y> ywmax)
    código | = TOP;
    else if (y xwmax)
    código | = DERECHA;
    si no (x <xwmin)
    código | = IZQUIERDA;

    código de retorno);
    }

    / * ------ * /

    main ()
    {

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

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

    printf ("\ n \ n \ tIntroduce las coordenadas de la Línea:");

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

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

    printf ("\ n \ tIntroduce las coordenadas de la ventana: \ n");
    printf ("\ n \ txwmin, ywmin:");
    scanf ("% f% f", & xwmin, & ywmin);
    printf ("\ n \ txwmax, ywmax:");
    scanf ("% f% f", & xwmax, & ywmax);

    línea (x1, y1, x2, y2);
    rectángulo (xwmin, ywmin, xwmax, ywmax);
    getch ();
    cleardevice ();

    clip de línea (x1, y1, x2, y2, xwmin, ywmin, xwmax, ywmax);
    getch ();
    closegraph ();

    }

    / ****** RECORTES DE LÍNEA COHEN-SUTHERLAND ****** /

Escribe tu respuesta

Tu respuesta aparecerá después de la moderación