Advertisement
allekco

lab 1 2

Dec 8th, 2019
442
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.02 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "GF.h"
  3. #include <iostream>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. #ifndef M_PI
  9. const double M_PI = 3.1415926535897932384626433832795;
  10. #endif
  11.  
  12. enum { LEFT, RIGHT, BEYOND, BEHIND, ORIGIN, DEST, BETWEEN, COLLINEAR, PARALLEL, CROSS, SKEW, SKEW_CROSS,
  13. SKEW_NO_CROSS, CROSS_LEFT, CROSS_RIGHT, INESSNTIAL, TOUCHING, COMPLEX, SIMPLE, CONVEX, NON_CONVEX,
  14. INSIDE, OUTSIDE, CLOCKWISE, COUNTERCLOCKWISE };
  15.  
  16.  
  17. // Ваша реализация необходимых вам функций
  18. void DrawLine( int x0, int y0, int x1, int y1, RGBPIXEL color )
  19. {
  20. int dx = abs(x1 - x0); //
  21. int dy = abs(y1 - y0);
  22. int signX = x1 > x0 ? 1 : -1; //if x1>x0 -> 1
  23. int signY = y1 > y0 ? 1 : -1;
  24. if (dx == 0 && dy == 0)
  25. {
  26. gfSetPixel(x0, y0, color); //ставит один пиксель
  27. }
  28. else
  29. {
  30. if (dx - dy >= 0) //прямоульгольник вытянут по x
  31. {
  32. int x = x0;
  33. int y = y0;
  34. int E = 2 * dy - dx; //ошибка
  35. while (x != x1 || y != y1) //пока не дойдем в кон точку
  36. {
  37. gfSetPixel(x, y, color);
  38. if (signY >= 0) //усл для того чтобы одинаково от x0 и обратно
  39. {
  40. if (E >= 0) //всегда измен x, иногда измен y
  41. {
  42. E -= 2 * dx;
  43. y += signY;
  44. }
  45. }
  46. else
  47. {
  48. if (E > 0)
  49. {
  50. E -= 2 * dx;
  51. y += signY;
  52. }
  53. }
  54. x += signX; //увеличиваем или умен на шаг в 1 пиксель
  55. E += 2 * dy;
  56.  
  57. }
  58. gfSetPixel(x, y, color);
  59. }
  60. else //прям вытянут по y
  61. {
  62. int x = x0;
  63. int y = y0;
  64. int E = 2 * dx - dy;
  65. while (x != x1 || y != y1)
  66. {
  67. gfSetPixel(x, y, color);
  68. if (signX >= 0)
  69. {
  70. if (E >= 0)
  71. {
  72. E -= 2 * dy;
  73. x += signX;
  74. }
  75. }
  76. else
  77. {
  78. if (E > 0)
  79. {
  80. E -= 2 * dy;
  81. x += signX;
  82. }
  83. }
  84. y += signY;
  85. E += 2 * dx;
  86. }
  87. gfSetPixel(x, y, color);
  88. }
  89. }
  90.  
  91. }
  92.  
  93. void DrawPolygon(vector<vector<int>>& P, RGBPIXEL color) // рисуем полигон. в динамический массиве 2 x n сначала x,потом y
  94. {
  95. if (P.size() == 2) //проверка что два столбика
  96. {
  97. if (P[0].size() == P[1].size()) //количество x должно совпадать с y
  98. {
  99. for (int i = 0; i < P[0].size() - 1; i++)
  100. {
  101. DrawLine(P[0][i], P[1][i], P[0][i + 1], P[1][i + 1], color);
  102. }
  103. DrawLine(P[0][P[0].size() - 1], P[1][P[0].size() - 1], P[0][0], P[1][0], color); //прорисовываем отдельно последнюю строчку
  104. }
  105. else
  106. {
  107. cout << "Неправильно задан вектор" << endl;
  108. }
  109. }
  110. else
  111. {
  112. cout << "Неправильно задан вектор" << endl;
  113. }
  114. }
  115.  
  116. int Classify(int x1, int y1, int x2, int y2, int x, int y) //где лежит точка относительно прямой
  117. {
  118. int ax = x2 - x1; //вектор a=(ax,ay) совпадает с прямой
  119. int bx = x - x1;
  120. int ay = y2 - y1;
  121. int by = y - y1;
  122. int s = ax * by - bx * ay;
  123. if (s > 0)
  124. return LEFT;
  125. if (s < 0)
  126. return RIGHT;
  127. if ((ax * bx < 0) || (ay * by < 0)) //на прямой продолжающей отрезок сзади
  128. return BEHIND;
  129. if ((ax * ax + ay * ay) < (bx * bx + by * by)) // спереди
  130. return BEYOND;
  131. if ((x == x1) && (y == y1)) //в начало попали
  132. return ORIGIN;
  133. if ((x == x2) && (y == y2))
  134. return DEST;
  135. return BETWEEN; // попали четко на отрезок
  136. }
  137.  
  138. int PolyTypeConv(vector<vector<int>>& P)
  139. {
  140. if (P[0].size() <= 2) //чтобы было 3 x,y
  141. {
  142. return -1; //не полигон
  143. }
  144. int type0 = Classify(P[0][0], P[1][0], P[0][1], P[1][1], P[0][2], P[1][2]); //запоминаем тип одной точку
  145. for (int j = 0; j < P[0].size() - 1; j++) //пробегаем по всем ребрам
  146. for (int i = j + 2; i < P[0].size() + j - 1; i++) //пробегаем по точкам, кроме ребра
  147. {
  148. int type = Classify(P[0][j], P[1][j], P[0][j + 1], P[1][j + 1], P[0][i % P[0].size()], P[1][i % P[0].size()]);
  149. if (type == DEST || type == ORIGIN || type == BEYOND || type == BEHIND)
  150. {
  151. return -1; //не полигон
  152. }
  153. if (type != type0) {
  154. //gfDrawText(200, 200, "Невыпуклый", RGBPIXEL(0, 128, 255));
  155. return NON_CONVEX; //невыпуклый полигон
  156. }
  157. }
  158. //gfDrawText(200, 200, "Выпуклый", RGBPIXEL(0, 128, 255));
  159. return CONVEX;
  160. }
  161.  
  162. int Intersect(int xa, int ya, int xb, int yb, int xc, int yc, int xd, int yd, double& t) //пересекаются 2 прямые ab и cd или нет
  163. {
  164. int nx = yd - yc; //направляющий вектор
  165. int ny = xc - xd;
  166. int denom = nx * (xb - xa) + ny * (yb - ya); //знаменатель
  167. if (denom == 0)
  168. {
  169. int type = Classify(xc, yc, xd, yd, xa, ya);
  170. if ((type == LEFT) || (type == RIGHT))
  171. return PARALLEL;
  172. else
  173. return COLLINEAR; //на одной прямой
  174. }
  175. int num = nx * (xa - xc) + ny * (ya - yc);
  176. t = -double(num) / double(denom); //именно для отрезков пересечение
  177. return CROSS;
  178. }
  179.  
  180. int PolyTypeSimp(vector<vector<int>>& P)
  181. {
  182. if (PolyTypeConv(P) == -1)
  183. {
  184. return -1; //не полигон
  185. }
  186. if (PolyTypeConv(P) == CONVEX) {
  187. return SIMPLE;
  188. }
  189.  
  190. for (int j = 0; j < P[0].size() - 1; j++)
  191. for (int i = j + 2; i < j + P[0].size() - 1; i++)
  192. {
  193. double t1 = -1;
  194. double t2 = -2;
  195. int type1 = Intersect(P[0][j], P[1][j], P[0][j + 1], P[1][j + 1], P[0][(i % P[0].size())], P[1][(i % P[0].size())], P[0][((i + 1) % P[0].size())], P[1][((i + 1) % P[0].size())], t1);
  196. int type2 = Intersect(P[0][(i % P[0].size())], P[1][(i % P[0].size())], P[0][((i + 1) % P[0].size())], P[1][((i + 1) % P[0].size())], P[0][j], P[1][j], P[0][j + 1], P[1][j + 1], t2);
  197. if (type1 == CROSS && type2 == CROSS)
  198. if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) { //если обе t находятся от 0 до 1
  199. return COMPLEX; //сложный
  200. }
  201. }
  202. return SIMPLE;
  203. }
  204.  
  205. int EdgeType(int x0, int y0, int x1, int y1, int x, int y) //каким образом прямая из точки x,y пересекает прямую
  206. {
  207. switch (Classify(x0, y0, x1, y1, x, y))
  208. {
  209. case LEFT:
  210. if (y > y0 && y <= y1)
  211. return CROSS_LEFT;
  212. else
  213. return INESSNTIAL; // не пересекает
  214. case RIGHT:
  215. if (y > y1 && y <= y0)
  216. return CROSS_RIGHT;
  217. else
  218. return INESSNTIAL;
  219. case BETWEEN:
  220. case ORIGIN:
  221. case DEST:
  222. return TOUCHING;
  223. default:
  224. return INESSNTIAL;
  225. }
  226. }
  227.  
  228. int PInPolyEO(int x, int y, vector<vector<int>>& P) //(лек) even-odd(считает число пересевчений, направл не интересует) закрашивает тольок ушки звезды
  229. {
  230. int prm = 0;
  231. for (int i = 0; i < P[0].size(); i++)
  232. {
  233. switch (EdgeType(P[0][i], P[1][i], P[0][(i + 1) % P[0].size()], P[1][(i + 1) % P[0].size()], x, y))
  234. {
  235. case TOUCHING:
  236. return INSIDE;
  237. case CROSS_LEFT:
  238. case CROSS_RIGHT:
  239. prm = 1 - prm;
  240. break;
  241. }
  242. }
  243. if (prm == 0)
  244. return OUTSIDE;
  245. else
  246. return INSIDE;
  247. }
  248.  
  249. int PInPolyNZW(int x, int y, vector<vector<int>>& P) //(лек) закрасит всю звезду (учитывает и направления тоже)
  250. {
  251. int prm = 0;
  252. for (int i = 0; i < P[0].size(); i++)
  253. {
  254. switch (EdgeType(P[0][i], P[1][i], P[0][(i + 1) % P[0].size()], P[1][(i + 1) % P[0].size()], x, y))
  255. {
  256. case TOUCHING:
  257. return INSIDE;
  258. case CROSS_LEFT:
  259. prm = prm + 1;
  260. break;
  261. case CROSS_RIGHT:
  262. prm = prm - 1;
  263. break;
  264. }
  265. }
  266. if (prm != 0)
  267. return INSIDE;
  268. else
  269. return OUTSIDE;
  270. }
  271.  
  272. int Max_El_1D(vector<int>& P) //максимальный элемент одномерного массива
  273. {
  274. int max = P[0];
  275. for (int i = 0; i < P.size(); i++)
  276. {
  277. if (P[i] > max)
  278. max = P[i];
  279. }
  280. return max;
  281. }
  282.  
  283. int Min_El_1D(vector<int>& P)
  284. {
  285. int min = P[0];
  286. for (int i = 0; i < P.size(); i++)
  287. {
  288. if (P[i] < min)
  289. min = P[i];
  290. }
  291. return min;
  292. }
  293.  
  294. void FillingEO(vector<vector<int>>& P, RGBPIXEL color)
  295. {
  296. int x_max = Max_El_1D(P[0]);
  297. int x_min = Min_El_1D(P[0]);
  298. int y_max = Max_El_1D(P[1]);
  299. int y_min = Min_El_1D(P[1]);
  300. for (int y = y_min; y <= y_max; y++) //увеличиваем по пикселю и закрашиваем если внутри
  301. for (int x = x_min; x <= x_max; x++)
  302. {
  303. if (PInPolyEO(x, y, P) == INSIDE)
  304. gfSetPixel(x, y, color);
  305. }
  306. }
  307.  
  308. void FillingNZW(vector<vector<int>>& P, RGBPIXEL color)
  309. {
  310. int x_max = Max_El_1D(P[0]);
  311. int x_min = Min_El_1D(P[0]);
  312. int y_max = Max_El_1D(P[1]);
  313. int y_min = Min_El_1D(P[1]);
  314. for (int y = y_min; y <= y_max; y++)
  315. for (int x = x_min; x <= x_max; x++)
  316. {
  317. if (PInPolyNZW(x, y, P) == INSIDE)
  318. gfSetPixel(x, y, color);
  319. }
  320. }
  321.  
  322.  
  323. //2 ЛР
  324.  
  325. vector<int> R3(double t, vector<vector<int>>& P) //(лек) параметрическое задание кривой безье 3 порядка
  326. {
  327. vector<int> R = { 0 , 0 }; //точка
  328. R[0] = int((1 - t) * (1 - t) * (1 - t) * P[0][0] + 3 * t * (1 - t) * (1 - t) * P[0][1] + 3 * t * t * (1 - t) * P[0][2] + t * t * t * P[0][3]);
  329. R[1] = int((1 - t) * (1 - t) * (1 - t) * P[1][0] + 3 * t * (1 - t) * (1 - t) * P[1][1] + 3 * t * t * (1 - t) * P[1][2] + t * t * t * P[1][3]);
  330. return R;
  331. }
  332.  
  333. int dist(int x, int y) //(лек)
  334. {
  335. return abs(x) + abs(y);
  336. }
  337.  
  338. void DrawBesie3(vector<vector<int>>& P, RGBPIXEL color) //(лек)
  339. {
  340. int D = Max(dist(P[0][0] - 2 * P[0][1] + P[0][2], P[1][0] - 2 * P[1][1] + P[1][2]), dist(P[0][1] - 2 * P[0][2] + P[0][3], P[1][1] - 2 * P[1][2] + P[1][3]));
  341. double N = 1 + sqrt(3 * D);
  342. double dt = 1 / N;
  343. double t = dt;
  344. vector<int> P1, P2;
  345. P1 = R3(0, P); //нач точка
  346. while (t <= 1)
  347. {
  348. P2 = R3(t, P);
  349. t += dt;
  350. DrawLine(P1[0], P1[1], P2[0], P2[1], color);
  351. P1 = P2;
  352. }
  353. P2 = R3(1, P);
  354. DrawLine(P1[0], P1[1], P2[0], P2[1], color);
  355. }
  356.  
  357. int PolyTypeConvOrient(vector<vector<int>>& P, int& t) //проверка на ориентацию
  358. {
  359. t = -1;
  360. if (P[0].size() <= 2)
  361. {
  362. gfDrawText(300, 300, "Not polygon", RGBPIXEL::Cyan());
  363. return -1;
  364. }
  365. int type0 = Classify(P[0][0], P[1][0], P[0][1], P[1][1], P[0][2], P[1][2]);
  366. for (int j = 0; j < P[0].size() - 1; j++)
  367. for (int i = j + 2; i < P[0].size() + j - 1; i++)
  368. {
  369. int type = Classify(P[0][j], P[1][j], P[0][j + 1], P[1][j + 1], P[0][i % P[0].size()], P[1][i % P[0].size()]);
  370. if (type == DEST || type == ORIGIN || type == BEYOND || type == BEHIND)
  371. {
  372. gfDrawText(300, 300, "Not polygon", RGBPIXEL::Cyan());
  373. return -1;
  374. }
  375. if (type != type0)
  376. return NON_CONVEX;
  377. }
  378. if (type0 == LEFT)
  379. t = CLOCKWISE; //по часовой(система левосторонняя)
  380. if (type0 == RIGHT)
  381. t = COUNTERCLOCKWISE;
  382. return CONVEX;
  383. }
  384.  
  385. void ClipLine(vector<vector<int>>& line, vector<vector<int>>& Poly, RGBPIXEL color) //(лек)
  386. {
  387. int n = Poly[0].size(); //количество вершин(точек)
  388. int trigger = -1; //отвечает за по\против часовой (ориентация)
  389. int type = PolyTypeConvOrient(Poly, trigger);
  390. if (type == NON_CONVEX)
  391. gfDrawText(500, 100, "Невыпуклый", RGBPIXEL::Red());
  392. else
  393. {
  394. if (trigger == CLOCKWISE) //переворачиваем, делаем копию buff и меняем
  395. {
  396. vector<vector<int>> buff = Poly;
  397. for (int j = 0; j < 2; j++)
  398. for (int i = 1; i < n; i++)
  399. {
  400. buff[j][i] = Poly[j][n - i];
  401. }
  402. Poly = buff;
  403. }
  404. double t0 = 0, t1 = 1, t;
  405. int sx = line[0][1] - line[0][0];
  406. int sy = line[1][1] - line[1][0];
  407. int nx, ny;
  408. double num, denom;
  409. for (int i = 0; i < n; i++)
  410. {
  411. nx = Poly[1][(i + 1) % n] - Poly[1][i];
  412. ny = Poly[0][i] - Poly[0][(i + 1) % n];
  413. denom = nx * sx + ny * sy;
  414. num = nx * (line[0][0] - Poly[0][i]) + ny * (line[1][0] - Poly[1][i]);
  415. if (abs(denom) > 0.01)
  416. {
  417. t = -num / denom;
  418. if (denom > 0)
  419. {
  420. if (t > t0)
  421. t0 = t;
  422.  
  423. }
  424. else
  425. {
  426. if (t < t1)
  427. t1 = t;
  428. }
  429. }
  430. }
  431. if (t0 <= t1) //&& t1>0)
  432. DrawLine(int(line[0][0] + t0 * sx), int(line[1][0] + t0 * sy), int(line[0][0] + t1 * sx), int(line[1][0] + t1 * sy), color);
  433. }
  434.  
  435. }
  436.  
  437.  
  438. // Вызывается один раз в самом начале при инициализации приложения
  439. bool gfInitScene()
  440. {
  441. // 1 лр
  442. gfSetWindowSize(1150, 600);
  443. DrawLine(100, 100, 160, 160, RGBPIXEL::Green());
  444. DrawLine(100, 100, 160, 40, RGBPIXEL::Red());
  445. DrawLine(100, 100, 160, 100, RGBPIXEL::Cyan());
  446. DrawLine(100, 100, 100, 40, RGBPIXEL::Yellow());
  447. DrawLine(100, 100, 40, 40, RGBPIXEL::Blue());
  448. DrawLine(100, 100, 40, 100, RGBPIXEL::White());
  449. DrawLine(100, 100, 40, 160, RGBPIXEL::Magenta());
  450. DrawLine(100, 100, 100, 160, RGBPIXEL::DkCyan());
  451.  
  452. vector<vector<int>> Poly = { {40, 160, 160, 40}, {240, 240, 300, 300} };
  453. DrawPolygon(Poly, RGBPIXEL::Cyan());
  454.  
  455. if (PolyTypeConv(Poly) == CONVEX) gfDrawText(60, 310, "CONVEX", RGBPIXEL::Blue());
  456. else gfDrawText(60, 310, "NON CONVEX", RGBPIXEL::Blue());
  457.  
  458. if (PolyTypeSimp(Poly) == SIMPLE) gfDrawText(60, 330, "SIMPLE", RGBPIXEL::Blue());
  459. else gfDrawText(60, 330, "COMPLEX", RGBPIXEL::Blue());
  460.  
  461.  
  462. vector<vector<int>> Poly0 = { {300, 360, 240, 360, 240}, {40, 160, 80, 80, 160} };
  463. DrawPolygon(Poly0, RGBPIXEL::Cyan());
  464.  
  465. if (PolyTypeConv(Poly0) == CONVEX) gfDrawText(260, 170, "CONVEX", RGBPIXEL::Blue());
  466. else gfDrawText(260, 170, "NON CONVEX", RGBPIXEL::Blue());
  467.  
  468. if (PolyTypeSimp(Poly0) == SIMPLE) gfDrawText(260, 200, "SIMPLE", RGBPIXEL::Blue());
  469. else gfDrawText(260, 200, "COMPLEX", RGBPIXEL::Blue());
  470.  
  471.  
  472. vector<vector<int>> PolyStar = { {300, 320, 360, 320, 300, 280, 240, 280}, {240, 280, 300, 320, 360, 320, 300, 280} };
  473. DrawPolygon(PolyStar, RGBPIXEL::Cyan());
  474.  
  475. if (PolyTypeConv(PolyStar) == CONVEX) gfDrawText(260, 380, "CONVEX", RGBPIXEL::Blue());
  476. else gfDrawText(260, 380, "NON CONVEX", RGBPIXEL::Blue());
  477.  
  478. if (PolyTypeSimp(PolyStar) == SIMPLE) gfDrawText(260, 400, "SIMPLE", RGBPIXEL::Blue());
  479. else gfDrawText(260, 400, "COMPLEX", RGBPIXEL::Blue());
  480.  
  481.  
  482. vector<vector<int>> Poly1 = { {500, 560, 440, 560, 440}, {40, 160, 80, 80, 160} };
  483. DrawPolygon(Poly1, RGBPIXEL::Cyan());
  484. gfDrawText(470, 10, "EVEN-ODD", RGBPIXEL::Blue());
  485. FillingEO(Poly1, RGBPIXEL::Yellow());
  486.  
  487. if (PolyTypeConv(Poly1) == CONVEX) gfDrawText(460, 170, "CONVEX", RGBPIXEL::Blue());
  488. else gfDrawText(460, 170, "NON CONVEX", RGBPIXEL::Blue());
  489.  
  490. if (PolyTypeSimp(Poly1) == SIMPLE) gfDrawText(460, 200, "SIMPLE", RGBPIXEL::Blue());
  491. else gfDrawText(460, 200, "COMPLEX", RGBPIXEL::Blue());
  492.  
  493.  
  494. vector<vector<int>> Poly2 = { {500 + 200, 560 + 200, 440 + 200, 560 + 200, 440 + 200}, {40, 160, 80, 80, 160} };
  495. DrawPolygon(Poly2, RGBPIXEL::Magenta());
  496. gfDrawText(630, 10, "NON-ZERO-WINDING", RGBPIXEL::Blue());
  497. FillingNZW(Poly2, RGBPIXEL::Yellow());
  498.  
  499. if (PolyTypeConv(Poly2) == CONVEX) gfDrawText(460+200, 170, "CONVEX", RGBPIXEL::Blue());
  500. else gfDrawText(460+200, 170, "NON CONVEX", RGBPIXEL::Blue());
  501.  
  502. if (PolyTypeSimp(Poly2) == SIMPLE) gfDrawText(460+200, 200, "SIMPLE", RGBPIXEL::Blue());
  503. else gfDrawText(460+200, 200, "COMPLEX", RGBPIXEL::Blue());
  504.  
  505.  
  506. //2 лр
  507.  
  508. vector<vector<int>> LineBesie1 = { {450,700,400,600},{400,200,200,400} };
  509. DrawBesie3(LineBesie1, RGBPIXEL::Red());
  510.  
  511. vector<vector<int>> LineBesie2 = { {650,700,700,750},{400,200,200,400} };
  512. DrawBesie3(LineBesie2, RGBPIXEL::Green());
  513.  
  514. vector<vector<int>> ConvexPoly = { {850,1000, 1050, 1050, 900},{60, 60, 150, 400, 400} };
  515. DrawPolygon(ConvexPoly, RGBPIXEL::Red());
  516.  
  517. vector<vector<int>> LineFirst = { {800, 1100},{450, 350}};
  518. DrawLine(LineFirst[0][0], LineFirst[1][0], LineFirst[0][1], LineFirst[1][1], RGBPIXEL::Blue());
  519. ClipLine(LineFirst, ConvexPoly, RGBPIXEL::Green());
  520.  
  521. vector<vector<int>> LineSecond = { {800, 950},{250, 300} };
  522. DrawLine(LineSecond[0][0], LineSecond[1][0], LineSecond[0][1], LineSecond[1][1], RGBPIXEL::Blue());
  523. ClipLine(LineSecond, ConvexPoly, RGBPIXEL::Green());
  524.  
  525. vector<vector<int>> LineThird = { {900, 1100},{150, 150} };
  526. DrawLine(LineThird[0][0], LineThird[1][0], LineThird[0][1], LineThird[1][1], RGBPIXEL::Blue());
  527. ClipLine(LineThird, ConvexPoly, RGBPIXEL::Green());
  528.  
  529.  
  530. //ClipLine(line, Poly, RGBPIXEL::Red());
  531. //gfSetPixel( 20, 20, RGBPIXEL(255, 255, 0) );
  532. //FillingEO(Poly, RGBPIXEL::Red());
  533. //FillingNZW(Poly2, RGBPIXEL::Red());
  534. //gfDrawRectangle( 100, 120, 170, 150, RGBPIXEL(255, 255, 0) );
  535. //gfDrawText( 200, 200, "Hello World", RGBPIXEL(0, 128, 255));
  536. //gfDisplayMessage("Message!");
  537.  
  538. /* int l = 5;
  539. vector<vector<int>> line1 = { {430, 590, 590, 430}, {300+l/2, 300+l/2, 300-l/2, 300-l/2} };
  540. DrawPolygon(line1, RGBPIXEL::Red());
  541. FillingEO(line1, RGBPIXEL::Red());
  542.  
  543. l = 5;
  544. vector<vector<int>> line2 = { {510, 590, 590, 510}, {300 + l / 2, 240 + l / 2, 240 - l / 2, 300 - l / 2} };
  545. DrawPolygon(line2, RGBPIXEL::Yellow());
  546. FillingEO(line2, RGBPIXEL::Yellow());
  547.  
  548. l = 5;
  549. vector<vector<int>> line3 = { {510+l/2, 510+l/2, 510-l/2, 510-l/2}, {300, 240, 240, 300} };
  550. DrawPolygon(line3, RGBPIXEL::Cyan());
  551. FillingEO(line3, RGBPIXEL::Cyan());
  552.  
  553. l = 5;
  554. vector<vector<int>> line4 = { {510, 430, 430, 510}, {300 + l / 2, 240 + l / 2, 240 - l / 2, 300 - l / 2} };
  555. DrawPolygon(line4, RGBPIXEL::Blue());
  556. FillingEO(line4, RGBPIXEL::Blue());
  557. */
  558.  
  559. return true;
  560. }
  561.  
  562. // Вызывается в цикле до момента выхода из приложения.
  563. // Следует использовать для создания анимационных эффектов
  564. void gfDrawScene()
  565. {
  566. //gfClearScreen(RGBPIXEL::Black());
  567.  
  568. //static int x = 0;
  569. //gfDrawRectangle(x, 100, x + 50, 130, RGBPIXEL::Blue());
  570. //x = (x + 1) % gfGetWindowWidth() ;
  571.  
  572. //int x = gfGetMouseX(),
  573. // y = gfGetMouseY();
  574. //gfDrawRectangle(x - 10, y - 10, x + 10, y + 10, RGBPIXEL::Green());
  575. }
  576.  
  577. // Вызывается один раз перед выходом из приложения.
  578. // Следует использовать для освобождения выделенных
  579. // ресурсов (памяти, файлов и т.п.)
  580. void gfCleanupScene()
  581. {
  582. }
  583.  
  584. // Вызывается когда пользователь нажимает левую кнопку мыши
  585. void gfOnLMouseClick( int x, int y )
  586. {
  587. x; y;
  588. gfDrawRectangle(x - 10, y - 10, x + 10, y + 10, RGBPIXEL::Green());
  589. }
  590.  
  591. // Вызывается когда пользователь нажимает правую кнопку мыши
  592. void gfOnRMouseClick( int x, int y )
  593. {
  594. x; y;
  595. }
  596.  
  597. // Вызывается когда пользователь нажимает клавишу на клавиатуре
  598. void gfOnKeyDown( UINT key )
  599. {
  600. key;
  601.  
  602. if( key == 'A' )
  603. gfDisplayMessage( "'A' key has been pressed" );
  604. }
  605.  
  606. // Вызывается когда пользователь отжимает клавишу на клавиатуре
  607. void gfOnKeyUp( UINT key )
  608. {
  609. key;
  610.  
  611. //if( key == 'B' )
  612. // gfDisplayMessage( "'B' key has been un-pressed" );
  613. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement