Guest User

Untitled

a guest
Apr 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.31 KB | None | 0 0
  1. #include <allegro.h>
  2. #include<math.h>
  3.  
  4. double xmax, xmin, ymax, ymin;
  5. typedef int OutCode;
  6.  
  7. const int INSIDE = 0; // 0000
  8. const int LEFT = 1; // 0001
  9. const int RIGHT = 2; // 0010
  10. const int BOTTOM = 4; // 0100
  11. const int TOP = 8; // 1000
  12.  
  13. OutCode ComputeOutCode(double x, double y)
  14. {
  15. OutCode code;
  16.  
  17. code = INSIDE;
  18.  
  19. if (x < xmin)
  20. code |= LEFT;
  21. else if (x > xmax)
  22. code |= RIGHT;
  23. if (y < ymin)
  24. code |= BOTTOM;
  25. else if (y > ymax)
  26. code |= TOP;
  27.  
  28. return code;
  29. }
  30. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  31. ////////////////////////////////////////////ALGORYTM COHEN SUTHERLAND/////////////////////////////////////////////////////
  32. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. void CohenSutherland(double x0, double y0, double x1, double y1, int kolor, bool bscreen, BITMAP * bufor, BITMAP * buffer)
  34. {
  35. 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
  36. 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
  37. bool accept = false;
  38.  
  39. while (true)
  40. {
  41. if (!(outcode0 | outcode1))
  42. {
  43. accept = true;
  44. break;
  45. }
  46. else if (outcode0 & outcode1)
  47. {
  48. break;
  49. }
  50. else
  51. {
  52. double x, y;
  53. OutCode outcodeOut = outcode0? outcode0 : outcode1;
  54.  
  55. if (outcodeOut & TOP) // punkt jest ponad obcinajacym prostokatem // punkt jest ponad obcinajacym prostokatem
  56. {
  57. x = x0 + (x1 - x0) * (ymax - y0) / (y1 - y0);
  58. y = ymax;
  59. }
  60. else if (outcodeOut & BOTTOM) // punkt jest pod obcinajacym prostokatem // punkt jest pod obcinajacym prostokatem
  61. {
  62. x = x0 + (x1 - x0) * (ymin - y0) / (y1 - y0);
  63. y = ymin;
  64. }
  65. else if (outcodeOut & RIGHT) // punkt jest na prawo od obcinajacego // punkt jest na prawo od obcinajacego prostokata
  66. {
  67. y = y0 + (y1 - y0) * (xmax - x0) / (x1 - x0);
  68. x = xmax;
  69. }
  70. else if (outcodeOut & LEFT) // punkt jest na lewo od obcinajacego // punkt jest na lewo od obcinajacego prostokata
  71. {
  72. y = y0 + (y1 - y0) * (xmin - x0) / (x1 - x0);
  73. x = xmin;
  74. }
  75.  
  76. if (outcodeOut == outcode0)
  77. {
  78. x0 = x;
  79. y0 = y;
  80. outcode0 = ComputeOutCode(x0, y0);
  81. }
  82. else
  83. {
  84. x1 = x;
  85. y1 = y;
  86. outcode1 = ComputeOutCode(x1, y1);
  87. }
  88. }
  89. }
  90.  
  91. if (accept)
  92. {
  93. if(bscreen)
  94. {
  95. rect(bufor, xmin, ymin, xmax, ymax, makecol(0,255,0));
  96. }
  97. else
  98. {
  99. line(buffer, 2*(x0-xmin), 2*(y0-ymin), 2*(x1-xmin), 2*(y1-ymin), kolor);
  100. blit(buffer,bufor, 0, 0, 0, 0, 200, 200);
  101. }
  102. }
  103.  
  104. if (!accept)
  105. {
  106. if(bscreen)
  107. {
  108. rect(bufor, xmin, ymin, xmax, ymax, makecol(0,255,0));
  109. }
  110.  
  111. }}
  112. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  113. //////////////////////////////////////////////////////////REPREZENTACJA GRAFICZNA COHEN SUTHERLAND///////////////////////////
  114. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  115. int Cohen(void)
  116. {
  117. BITMAP *bufor;
  118. bufor = create_bitmap(800, 600);
  119.  
  120. BITMAP *buffer;
  121. buffer = create_bitmap(200, 200);
  122. clear_to_color(buffer, makecol(0, 0, 0));
  123.  
  124. xmin = 300; //wspolrzedne poczatkowe prostokata
  125. ymin = 300;
  126. xmax = 400;
  127. ymax = 400;
  128.  
  129.  
  130. while(!key[KEY_SPACE])
  131. {
  132. clear_to_color(bufor, makecol(0, 0, 0));
  133. clear_to_color(buffer, makecol(255, 255, 255));
  134.  
  135. double x = 400, y = 300; //wsporzedne srodka
  136. double r = 200; //promien
  137. const int ile = 20; //ilosc punktow
  138. double theta = 0; //kat poczatkowy
  139. double thinc = 2 * 3.14159 / ile; //przyrost kata
  140.  
  141. double X[ile], Y[ile]; //tablice wsporzednych
  142. for(int i = 0; i < ile; i++) //obliczanie wsporzednych
  143. {
  144. X[i] = x + r * cos(theta);
  145. Y[i] = y + r * sin(theta);
  146.  
  147. theta = theta + thinc;
  148. }
  149.  
  150. for(int j = 0; j < ile - 1; j++) //laczenie punktow
  151. {
  152. for(int i = j+1; i < ile; i++)
  153. {
  154. line(bufor, X[j], Y[j], X[i],Y[i], makecol(255, 255, 0));
  155. }
  156. }
  157.  
  158. if(key[KEY_UP]) //sterowanie prostokatem
  159. {
  160. ymax--;
  161. ymin--;
  162. }
  163. if(key[KEY_DOWN])
  164. {
  165. ymax++;
  166. ymin++;
  167. }
  168. if(key[KEY_LEFT])
  169. {
  170. xmax--;
  171. xmin--;
  172. }
  173. if(key[KEY_RIGHT])
  174. {
  175. xmax++;
  176. xmin++;
  177. }
  178.  
  179. for(int j = 0; j < ile - 1; j++) //rysowanie obcietych i powiekszonych linii
  180. {
  181. for(int i = j+1; i < ile; i++)
  182. {
  183. CohenSutherland(X[j], Y[j], X[i],Y[i], makecol(0, 0, 255), true, bufor, buffer);
  184. CohenSutherland(X[j], Y[j], X[i],Y[i], makecol(0, 0, 255), false, bufor, buffer);
  185. }
  186. }
  187.  
  188. blit(bufor, screen, 0, 0, 150, 0, 800, 600);
  189. }
  190.  
  191. blit(bufor, screen, 0, 0, 150, 0, 800, 600);
  192.  
  193.  
  194.  
  195. return D_O_K;
  196. }
  197. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  198. /////////////////////////////////ALGORYTM CYRUS BECK/////////////////////////////////////////////////////////////////////
  199. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  200. float max(float value1, float value2)
  201. {
  202. return ( (value1 > value2) ? value1 : value2);
  203. }
  204. float min(float value1, float value2)
  205. {
  206. return ( (value1 < value2) ? value1 : value2);
  207. }
  208.  
  209. int CyrusBeck(double x1, double y1, double x2, double y2, int kolor, bool bscreen, BITMAP * bufor, BITMAP * buffer)
  210. {
  211. int p[5],q[5];
  212. p[1] = -(x2-x1);
  213. p[2] = x2-x1;
  214. p[3] = -(y2-y1);
  215. p[4] = y2-y1;
  216. q[1] = x1-xmin;
  217. q[2] = xmax-x1;
  218. q[3] = y1-ymin;
  219. q[4] = ymax-y1;
  220.  
  221.  
  222. float u1=0, u2=1;
  223.  
  224. float r[5];
  225. for(int i=1; i<5; i++)
  226. {
  227. if(p[i] != 0)
  228. r[i] = q[i] * 1.0/p[i];
  229. }
  230.  
  231. for(int i=1; i<5; i++)
  232. {
  233. if(p[i] == 0)
  234. continue;
  235. if(p[i] < 0)
  236. {
  237. u1 = max(u1, r[i]);
  238. }
  239. else
  240. {
  241. u2 = min(u2, r[i]);
  242. }
  243. }
  244. rect(bufor, xmin, ymin, xmax, ymax, makecol(255,255,0));
  245.  
  246. if(u1 < u2) //wyliczamy wspolrzedne nowych punktow linii
  247. {
  248.  
  249.  
  250. if(bscreen) //jezeli rysujemy na ekranie
  251. {
  252. rect(bufor, xmin, ymin, xmax, ymax, kolor); //jezeli rysujemy na ekranie
  253. }
  254. else //jezeli rysujemy na obszarze powiekszenia
  255. {
  256. line(buffer, 2*(x1-xmin), 2*(y1-ymin), 2*(x2-xmin), 2*(y2-ymin), kolor); //jezeli rysujemy na obszarze powiekszenia
  257. blit(buffer, bufor, 0, 0, 0, 0, 200, 200);
  258. }
  259.  
  260. }
  261. return(0);
  262. }
  263. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  264. ///////////////////////////////////REPREZENTACJA GRAFICZNA CYRUS BECK///////////////////////////////////
  265. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  266. int Cyrus(void)
  267. {
  268. BITMAP *bufor;
  269. bufor = create_bitmap(800, 600);
  270.  
  271. BITMAP *buffer;
  272. buffer = create_bitmap(200, 200);
  273. clear_to_color(buffer, makecol(255, 255, 255));
  274.  
  275. xmin = 300; //wspolrzedne poczatkowe prostokata
  276. ymin = 300;
  277. xmax = 400;
  278. ymax = 400;
  279.  
  280.  
  281. while(!key[KEY_SPACE])
  282. {
  283. clear_to_color(bufor, makecol(0, 0, 0));
  284. clear_to_color(buffer, makecol(255, 255, 255));
  285.  
  286. double x = 400, y = 300; //wsporzedne srodka
  287. double r = 200; //promien
  288. const int ile = 20; //ilosc punktow
  289. double theta = 0; //kat poczatkowy
  290. double thinc = 2 * 3.14159 / ile; //przyrost kata
  291.  
  292. double X[ile], Y[ile]; //tablice wsporzednych
  293. for(int i = 0; i < ile; i++) //obliczanie wsporzednych
  294. {
  295. X[i] = x + r * cos(theta);
  296. Y[i] = y + r * sin(theta);
  297.  
  298. theta = theta + thinc;
  299. }
  300.  
  301. for(int j = 0; j < ile - 1; j++) //laczenie punktow
  302. {
  303. for(int i = j+1; i < ile; i++)
  304. {
  305. line(bufor, X[j], Y[j], X[i],Y[i], makecol(0, 255, 0));
  306. }
  307. }
  308.  
  309. if(key[KEY_UP]) //sterowanie prostokatem
  310. {
  311. ymax--;
  312. ymin--;
  313. }
  314. if(key[KEY_DOWN])
  315. {
  316. ymax++;
  317. ymin++;
  318. }
  319. if(key[KEY_LEFT])
  320. {
  321. xmax--;
  322. xmin--;
  323. }
  324. if(key[KEY_RIGHT])
  325. {
  326. xmax++;
  327. xmin++;
  328. }
  329.  
  330. for(int j = 0; j < ile - 1; j++) //rysowanie obcietych i powiekszonych linii
  331. {
  332. for(int i = j+1; i < ile; i++)
  333. {
  334. CyrusBeck(X[j], Y[j], X[i],Y[i], makecol(0, 0, 255), true, bufor, buffer);
  335. CyrusBeck(X[j], Y[j], X[i],Y[i], makecol(0, 0, 255), false, bufor, buffer);
  336. }
  337. }
  338.  
  339. blit(bufor, screen, 0, 0, 150, 0, 800, 600);
  340. }
  341.  
  342. blit(bufor, screen, 0, 0, 150, 0, 800, 600);
  343.  
  344.  
  345.  
  346. return D_O_K;
  347. }
  348.  
  349. MENU file_menu[] =
  350. {
  351. { "&Nieaktywne", NULL, NULL, D_DISABLED, NULL },
  352. { "", NULL, NULL, 0, NULL },
  353.  
  354. { NULL, NULL, NULL, 0, NULL }
  355. };
  356.  
  357. /*MENU child[] =
  358. {
  359. { "&Parametry", grafika1, NULL, 0, NULL },
  360. { "&Parametry", grafika2, NULL, 0, NULL },
  361. //{ "&Parametry", NULL, NULL, 0, NULL },
  362. { NULL, NULL, NULL, 0, NULL },
  363. };
  364. */
  365.  
  366.  
  367. MENU grafika_menu[] =
  368. {
  369. { "&CohenSutherland", Cohen, NULL, 0, NULL },
  370. { "&CyrusBeck", Cyrus, NULL, 0, NULL },
  371. { NULL, NULL, NULL, 0, NULL }
  372. };
  373.  
  374. MENU main_menu[] =
  375. {
  376. { "&Plik", NULL, file_menu, 0, NULL },
  377. { "&Grafika", NULL, grafika_menu, 0, NULL },
  378.  
  379. { NULL, NULL, NULL, 0, NULL }
  380. };
  381.  
  382. #define ctrl(x) (x - 'a' + 1)
  383.  
  384. DIALOG main_dialog[] =
  385. {
  386. /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) */
  387. { d_clear_proc, 0, 0, 640, 480, 0, 0, 0, 0, 0, 0, NULL },
  388.  
  389. //{d_edit_proc, 320, 240, 300, 20, 250, 0, 0, 0, 0, 0, "Some sample text" },
  390.  
  391.  
  392.  
  393.  
  394. { d_menu_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, main_menu },
  395. { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }
  396. };
  397.  
  398.  
  399. int main()
  400. {
  401. allegro_init();
  402. install_keyboard();
  403. install_mouse();
  404. show_mouse(screen);
  405. unscare_mouse();
  406.  
  407. install_timer();
  408. set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0);
  409.  
  410. show_mouse(screen);
  411. unscare_mouse();
  412. set_palette( default_palette );
  413.  
  414. gui_fg_color = makecol( 0, 0, 0 );
  415. gui_mg_color = makecol( 0, 0, 255 );
  416. gui_bg_color = makecol( 0, 0, 255 );
  417. set_dialog_color( main_dialog, gui_fg_color, gui_bg_color );
  418. /* run the dialog */
  419. main_dialog[ 0 ].bg = makecol( 255,255, 255 );
  420. //position_dialog( the_dialog, 2, 2 );
  421. do_dialog(main_dialog, -1);
  422.  
  423. return 0;
  424. }
  425. END_OF_MAIN()
Add Comment
Please, Sign In to add comment