Напишите программу на C / C ++ для реализации алгоритма обрезки строк Коэна-Сазерленда. Рассмотрим в этой реализации два случая линии: полностью видимую, полностью невидимую на фоне прямоугольного окна отсечения?

1 Ответы


  • - Отсечение строки с использованием алгоритма cohen sutherland - * /
    / * ------ * /

    #include
    #include

    typedef unsigned int outcode;
    перечисление {TOP = 0x1, BOTTOM = 0x2, RIGHT = 0x4, LEFT = 0x8};

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

    int gd, gm;
    исходящий код code0, code1, codeout;
    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; сделано = 1; }
    иначе,
    если (code0 & code1) done = 1;
    else
    {
    float x, y;
    codeout = code0? Code0: Code1;
    если (codeout & TOP)
    {
    x = x0 + (x1-x0) * (ywmax-y0) / (y1-y0);
    y = ywmax;
    }
    иначе,
    если (codeout & BOTTOM)
    {
    x = x0 + (x1-x0) * (ywmin-y0) / (y1-y0);
    y = ywmin;
    }
    иначе,
    если (codeout & RIGHT)
    {
    y = y0 + (y1-y0) * (xwmax-x0) / (x1-x0);
    x = xwmax;
    }
    иначе
    {
    y = y0 + (y1-y0) * (xwmin-x0) / (x1-x0);
    x = xwmin;
    }
    если (codeout == code0)
    {
    x0 = x; y0 = y;
    code0 = calcode (x0, y0, xwmin, ywmin, xwmax, ywmax);
    }
    иначе
    {
    x1 = x; y1 = y;
    code1 = calcode (x1, y1, xwmin, ywmin, xwmax, ywmax);
    }
    }
    } while (done == 0);

    if (принять) строку (x0, y0, x1, y1);

    прямоугольник (xwmin, ywmin, xwmax, ywmax);

    getch ();

    }
    / * ------ * /

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

    если (y> ywmax)
    код | = TOP;
    иначе, если (y xwmax)
    код | = ВПРАВО;
    иначе, если (x <xwmin)
    код | = LEFT;

    возврат (код);
    }

    / * ------ * /

    main ()
    {

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

    обнаружить граф (& gd, & gm);
    initgraph (& gd, & gm, "C: \\ TC \\ BGI");

    printf ("\ n \ n \ tВведите координаты линии:");

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

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

    printf ("\ n \ tВведите координаты окна: \ n");
    printf ("\ п \ txwmin, ywmin:");
    scanf ("% f% f", & xwmin, & ywmin);
    printf ("\ п \ txwmax, ywmax:");
    scanf ("% f% f", & xwmax, & ywmax);

    строка (x1, y1, x2, y2);
    прямоугольник (xwmin, ywmin, xwmax, ywmax);
    getch ();
    cleardevice ();

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

    }

    / ****** ОБРЕЗКА ЛИНИИ КОЭН-САЗЕРЛЕНДА ****** /

Напишите свой ответ

Ваш ответ появится после модерации