Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <allegro.h>
- #include<math.h>
- double xmax, xmin, ymax, ymin;
- typedef int OutCode;
- const int INSIDE = 0; // 0000
- const int LEFT = 1; // 0001
- const int RIGHT = 2; // 0010
- const int BOTTOM = 4; // 0100
- const int TOP = 8; // 1000
- OutCode ComputeOutCode(double x, double y)
- {
- OutCode code;
- code = INSIDE;
- if (x < xmin)
- code |= LEFT;
- else if (x > xmax)
- code |= RIGHT;
- if (y < ymin)
- code |= BOTTOM;
- else if (y > ymax)
- code |= TOP;
- return code;
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////ALGORYTM COHEN SUTHERLAND/////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void CohenSutherland(double x0, double y0, double x1, double y1, int kolor, bool bscreen, BITMAP * bufor, BITMAP * buffer)
- {
- OutCode outcode0 = ComputeOutCode(x0, y0); // obliczanie gdzie lezy poczatek odcinka w stosunku do obcinajacego prostokata // obliczanie gdzie lezy poczatek odcinka w stosunku do obcinajacego prostokata
- OutCode outcode1 = ComputeOutCode(x1, y1); // obliczanie gdzie lezy koniec odcinka w stosunku do obcinajacego prostokata // obliczanie gdzie lezy koniec odcinka w stosunku do obcinajacego prostokata
- bool accept = false;
- while (true)
- {
- if (!(outcode0 | outcode1))
- {
- accept = true;
- break;
- }
- else if (outcode0 & outcode1)
- {
- break;
- }
- else
- {
- double x, y;
- OutCode outcodeOut = outcode0? outcode0 : outcode1;
- if (outcodeOut & TOP) // punkt jest ponad obcinajacym prostokatem // punkt jest ponad obcinajacym prostokatem
- {
- x = x0 + (x1 - x0) * (ymax - y0) / (y1 - y0);
- y = ymax;
- }
- else if (outcodeOut & BOTTOM) // punkt jest pod obcinajacym prostokatem // punkt jest pod obcinajacym prostokatem
- {
- x = x0 + (x1 - x0) * (ymin - y0) / (y1 - y0);
- y = ymin;
- }
- else if (outcodeOut & RIGHT) // punkt jest na prawo od obcinajacego // punkt jest na prawo od obcinajacego prostokata
- {
- y = y0 + (y1 - y0) * (xmax - x0) / (x1 - x0);
- x = xmax;
- }
- else if (outcodeOut & LEFT) // punkt jest na lewo od obcinajacego // punkt jest na lewo od obcinajacego prostokata
- {
- y = y0 + (y1 - y0) * (xmin - x0) / (x1 - x0);
- x = xmin;
- }
- if (outcodeOut == outcode0)
- {
- x0 = x;
- y0 = y;
- outcode0 = ComputeOutCode(x0, y0);
- }
- else
- {
- x1 = x;
- y1 = y;
- outcode1 = ComputeOutCode(x1, y1);
- }
- }
- }
- if (accept)
- {
- if(bscreen)
- {
- rect(bufor, xmin, ymin, xmax, ymax, makecol(0,255,0));
- }
- else
- {
- line(buffer, 2*(x0-xmin), 2*(y0-ymin), 2*(x1-xmin), 2*(y1-ymin), kolor);
- blit(buffer,bufor, 0, 0, 0, 0, 200, 200);
- }
- }
- if (!accept)
- {
- if(bscreen)
- {
- rect(bufor, xmin, ymin, xmax, ymax, makecol(0,255,0));
- }
- }}
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////REPREZENTACJA GRAFICZNA COHEN SUTHERLAND///////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- int Cohen(void)
- {
- BITMAP *bufor;
- bufor = create_bitmap(800, 600);
- BITMAP *buffer;
- buffer = create_bitmap(200, 200);
- clear_to_color(buffer, makecol(0, 0, 0));
- xmin = 300; //wspolrzedne poczatkowe prostokata
- ymin = 300;
- xmax = 400;
- ymax = 400;
- while(!key[KEY_SPACE])
- {
- clear_to_color(bufor, makecol(0, 0, 0));
- clear_to_color(buffer, makecol(255, 255, 255));
- double x = 400, y = 300; //wsporzedne srodka
- double r = 200; //promien
- const int ile = 20; //ilosc punktow
- double theta = 0; //kat poczatkowy
- double thinc = 2 * 3.14159 / ile; //przyrost kata
- double X[ile], Y[ile]; //tablice wsporzednych
- for(int i = 0; i < ile; i++) //obliczanie wsporzednych
- {
- X[i] = x + r * cos(theta);
- Y[i] = y + r * sin(theta);
- theta = theta + thinc;
- }
- for(int j = 0; j < ile - 1; j++) //laczenie punktow
- {
- for(int i = j+1; i < ile; i++)
- {
- line(bufor, X[j], Y[j], X[i],Y[i], makecol(255, 255, 0));
- }
- }
- if(key[KEY_UP]) //sterowanie prostokatem
- {
- ymax--;
- ymin--;
- }
- if(key[KEY_DOWN])
- {
- ymax++;
- ymin++;
- }
- if(key[KEY_LEFT])
- {
- xmax--;
- xmin--;
- }
- if(key[KEY_RIGHT])
- {
- xmax++;
- xmin++;
- }
- for(int j = 0; j < ile - 1; j++) //rysowanie obcietych i powiekszonych linii
- {
- for(int i = j+1; i < ile; i++)
- {
- CohenSutherland(X[j], Y[j], X[i],Y[i], makecol(0, 0, 255), true, bufor, buffer);
- CohenSutherland(X[j], Y[j], X[i],Y[i], makecol(0, 0, 255), false, bufor, buffer);
- }
- }
- blit(bufor, screen, 0, 0, 150, 0, 800, 600);
- }
- blit(bufor, screen, 0, 0, 150, 0, 800, 600);
- return D_O_K;
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////ALGORYTM CYRUS BECK/////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- float max(float value1, float value2)
- {
- return ( (value1 > value2) ? value1 : value2);
- }
- float min(float value1, float value2)
- {
- return ( (value1 < value2) ? value1 : value2);
- }
- int CyrusBeck(double x1, double y1, double x2, double y2, int kolor, bool bscreen, BITMAP * bufor, BITMAP * buffer)
- {
- int p[5],q[5];
- p[1] = -(x2-x1);
- p[2] = x2-x1;
- p[3] = -(y2-y1);
- p[4] = y2-y1;
- q[1] = x1-xmin;
- q[2] = xmax-x1;
- q[3] = y1-ymin;
- q[4] = ymax-y1;
- float u1=0, u2=1;
- float r[5];
- for(int i=1; i<5; i++)
- {
- if(p[i] != 0)
- r[i] = q[i] * 1.0/p[i];
- }
- for(int i=1; i<5; i++)
- {
- if(p[i] == 0)
- continue;
- if(p[i] < 0)
- {
- u1 = max(u1, r[i]);
- }
- else
- {
- u2 = min(u2, r[i]);
- }
- }
- rect(bufor, xmin, ymin, xmax, ymax, makecol(255,255,0));
- if(u1 < u2) //wyliczamy wspolrzedne nowych punktow linii
- {
- if(bscreen) //jezeli rysujemy na ekranie
- {
- rect(bufor, xmin, ymin, xmax, ymax, kolor); //jezeli rysujemy na ekranie
- }
- else //jezeli rysujemy na obszarze powiekszenia
- {
- line(buffer, 2*(x1-xmin), 2*(y1-ymin), 2*(x2-xmin), 2*(y2-ymin), kolor); //jezeli rysujemy na obszarze powiekszenia
- blit(buffer, bufor, 0, 0, 0, 0, 200, 200);
- }
- }
- return(0);
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////REPREZENTACJA GRAFICZNA CYRUS BECK///////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////////////
- int Cyrus(void)
- {
- BITMAP *bufor;
- bufor = create_bitmap(800, 600);
- BITMAP *buffer;
- buffer = create_bitmap(200, 200);
- clear_to_color(buffer, makecol(255, 255, 255));
- xmin = 300; //wspolrzedne poczatkowe prostokata
- ymin = 300;
- xmax = 400;
- ymax = 400;
- while(!key[KEY_SPACE])
- {
- clear_to_color(bufor, makecol(0, 0, 0));
- clear_to_color(buffer, makecol(255, 255, 255));
- double x = 400, y = 300; //wsporzedne srodka
- double r = 200; //promien
- const int ile = 20; //ilosc punktow
- double theta = 0; //kat poczatkowy
- double thinc = 2 * 3.14159 / ile; //przyrost kata
- double X[ile], Y[ile]; //tablice wsporzednych
- for(int i = 0; i < ile; i++) //obliczanie wsporzednych
- {
- X[i] = x + r * cos(theta);
- Y[i] = y + r * sin(theta);
- theta = theta + thinc;
- }
- for(int j = 0; j < ile - 1; j++) //laczenie punktow
- {
- for(int i = j+1; i < ile; i++)
- {
- line(bufor, X[j], Y[j], X[i],Y[i], makecol(0, 255, 0));
- }
- }
- if(key[KEY_UP]) //sterowanie prostokatem
- {
- ymax--;
- ymin--;
- }
- if(key[KEY_DOWN])
- {
- ymax++;
- ymin++;
- }
- if(key[KEY_LEFT])
- {
- xmax--;
- xmin--;
- }
- if(key[KEY_RIGHT])
- {
- xmax++;
- xmin++;
- }
- for(int j = 0; j < ile - 1; j++) //rysowanie obcietych i powiekszonych linii
- {
- for(int i = j+1; i < ile; i++)
- {
- CyrusBeck(X[j], Y[j], X[i],Y[i], makecol(0, 0, 255), true, bufor, buffer);
- CyrusBeck(X[j], Y[j], X[i],Y[i], makecol(0, 0, 255), false, bufor, buffer);
- }
- }
- blit(bufor, screen, 0, 0, 150, 0, 800, 600);
- }
- blit(bufor, screen, 0, 0, 150, 0, 800, 600);
- return D_O_K;
- }
- MENU file_menu[] =
- {
- { "&Nieaktywne", NULL, NULL, D_DISABLED, NULL },
- { "", NULL, NULL, 0, NULL },
- { NULL, NULL, NULL, 0, NULL }
- };
- /*MENU child[] =
- {
- { "&Parametry", grafika1, NULL, 0, NULL },
- { "&Parametry", grafika2, NULL, 0, NULL },
- //{ "&Parametry", NULL, NULL, 0, NULL },
- { NULL, NULL, NULL, 0, NULL },
- };
- */
- MENU grafika_menu[] =
- {
- { "&CohenSutherland", Cohen, NULL, 0, NULL },
- { "&CyrusBeck", Cyrus, NULL, 0, NULL },
- { NULL, NULL, NULL, 0, NULL }
- };
- MENU main_menu[] =
- {
- { "&Plik", NULL, file_menu, 0, NULL },
- { "&Grafika", NULL, grafika_menu, 0, NULL },
- { NULL, NULL, NULL, 0, NULL }
- };
- #define ctrl(x) (x - 'a' + 1)
- DIALOG main_dialog[] =
- {
- /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) */
- { d_clear_proc, 0, 0, 640, 480, 0, 0, 0, 0, 0, 0, NULL },
- //{d_edit_proc, 320, 240, 300, 20, 250, 0, 0, 0, 0, 0, "Some sample text" },
- { d_menu_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, main_menu },
- { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }
- };
- int main()
- {
- allegro_init();
- install_keyboard();
- install_mouse();
- show_mouse(screen);
- unscare_mouse();
- install_timer();
- set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0);
- show_mouse(screen);
- unscare_mouse();
- set_palette( default_palette );
- gui_fg_color = makecol( 0, 0, 0 );
- gui_mg_color = makecol( 0, 0, 255 );
- gui_bg_color = makecol( 0, 0, 255 );
- set_dialog_color( main_dialog, gui_fg_color, gui_bg_color );
- /* run the dialog */
- main_dialog[ 0 ].bg = makecol( 255,255, 255 );
- //position_dialog( the_dialog, 2, 2 );
- do_dialog(main_dialog, -1);
- return 0;
- }
- END_OF_MAIN()
Add Comment
Please, Sign In to add comment