Advertisement
Guest User

Untitled

a guest
May 25th, 2016
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.18 KB | None | 0 0
  1. #define GLEW_STATIC
  2. #include <stdlib.h>
  3. #include <glut.h>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <windows.h>
  7.  
  8. struct COOORD
  9. {
  10. double x;
  11. double y;
  12. double z;
  13. };
  14. struct CORD
  15. {
  16. double X;
  17. double Y;
  18. double Z;
  19. };
  20.  
  21. struct RGB
  22. {
  23. GLfloat r;
  24. GLfloat g;
  25. GLfloat b;
  26. };
  27.  
  28. struct triangle
  29. {
  30. COOORD a;
  31. COOORD b;
  32. COOORD c;
  33. };
  34.  
  35. //int x, y;
  36. double Pi = 3.1415926535897932384626433832795;
  37. double RAD = 0.01745329251994329576923690768489;
  38. int m = 5;//медианы
  39. int n = 3;//паралели
  40. int h= 20;//высота
  41. int r = 200;//радиус
  42. COOORD E = { 50, 40, 10 };//точка камеры
  43. int d = 300;//resolution
  44. int cm = 100;//расстояние к экрану
  45. int rx = atan(E.x / E.y)* 180.0 / Pi;
  46. int ry = atan(E.z / E.y)* 180.0 / Pi;
  47. int rz = atan(E.x / E.z)* 180.0 / Pi;
  48. CORD tmp;
  49. CORD tmp2;
  50. COOORD buf;
  51. COOORD buf2;
  52.  
  53. float angle = 1.0;// угол поворота камеры
  54. float lx = 0.0f, lz = -1.0f;// XZ позиция камеры
  55. float x = r*1.0f, z = r*1.0f;
  56. float deltaAngle = 0.0f;
  57. float deltaMove = 0;
  58. int xOrigin = -1;
  59.  
  60. bool first = true;
  61. RGB colorbase[100];
  62. double depth_buffer[601][601];
  63. RGB color_buffer[601][601];
  64.  
  65. void setPixel(CORD a,RGB collor)
  66. {
  67. if (depth_buffer[(int)a.Y + d ][(int)a.X + d] > (int)a.Z)
  68. {
  69. depth_buffer[(int)a.Y + d ][(int)a.X + d ] = a.Z;
  70. color_buffer[(int)a.Y + d ][(int)a.X + d ].r = collor.r;
  71. color_buffer[(int)a.Y + d ][(int)a.X + d ].g = collor.g;
  72. color_buffer[(int)a.Y + d ][(int)a.X + d ].b = collor.b;
  73. }
  74. }
  75. void nsetPixel(CORD a, RGB collor)
  76. {
  77. glPointSize(1);
  78. glBegin(GL_POINTS);
  79. {
  80. glColor3f(1,0, 0);
  81. glVertex3i(a.X, a.Y, a.Z);
  82. }
  83. glEnd();
  84. }
  85.  
  86. char sort(COOORD a, COOORD b, COOORD c)
  87. {
  88. int dx, dy , dz;
  89.  
  90. if ((a.x > b.x&&b.x > c.x)||(c.x>b.x&&b.x>a.x))
  91. dx = abs(a.x - c.x);
  92. else
  93. {
  94. if ((a.x > c.x&&c.x > b.x)||(b.x>c.x&&c.x>a.x))
  95. dx = abs(a.x - b.x);
  96. else
  97. {
  98. if ((c.x>a.x &&a.x>b.x) || (b.x>a.x&&a.x>c.x))
  99. dx = abs(c.x - b.x);
  100. else
  101. {
  102. if (a.x == b.x || b.x == c.x)
  103. dx = abs(a.x - c.x);
  104. else
  105. {
  106. if (a.x == c.x || b.x == c.x)
  107. dx = abs(a.x - b.x);
  108. }
  109. }
  110. }
  111. }
  112.  
  113. if ((a.y > b.y&&b.y > c.y) || (c.y>b.y&&b.y>a.y))
  114. dy = abs(a.y - c.y);
  115. else
  116. {
  117. if ((a.y > c.y&&c.y > b.y) || (b.y>c.y&&c.y>a.y))
  118. dy = abs(a.y - b.y);
  119. else
  120. {
  121. if ((c.y>a.y &&a.y>b.y) || (b.y>a.y&&a.y>c.y))
  122. dy = abs(c.y - b.y);
  123. else
  124. {
  125. if (a.y == b.y || b.y == c.y)
  126. dy = abs(a.y - c.y);
  127. else
  128. {
  129. if (a.y == c.y || b.y == c.y)
  130. dy = abs(a.y - b.y);
  131. }
  132. }
  133. }
  134. }
  135. if ((a.z > b.z&&b.z> c.z) || (c.z>b.z&&b.z>a.z))
  136. dz = abs(a.z - c.z);
  137. else
  138. {
  139. if ((a.z > c.z&&c.z > b.z) || (b.z>c.z&&c.z>a.z))
  140. dz = abs(a.z - b.z);
  141. else
  142. {
  143. if ((c.z>a.z &&a.z>b.z) || (b.z>a.z&&a.z>c.z))
  144. dz = abs(c.z - b.z);
  145. else
  146. {
  147. if (a.z == b.z || b.z == c.z)
  148. dz = abs(a.z - c.z);
  149. else
  150. {
  151. if (a.z == c.z || b.z == c.z)
  152. dz = abs(a.z - b.z);
  153. }
  154. }
  155. }
  156. }
  157.  
  158. if (dx > dy&&dx > dz)
  159. return 'x';
  160. if (dy >= dx&&dy > dz)
  161. return 'y';
  162. if (dz > dy&&dz > dx)
  163. return 'z';
  164. return'0';
  165. }
  166.  
  167. void Brezenhem(CORD BGN, CORD END, RGB color, int e)
  168. {
  169. glBegin(GL_LINES);
  170. glColor3f(color.r, color.g, color.b);
  171. glVertex3f(BGN.X, BGN.Y, BGN.Z);
  172. glVertex3f(END.X, END.Y, END.Z);
  173. glEnd();
  174. }
  175. void Brezenhem(CORD BGN, CORD END, RGB color)
  176. {
  177. double t, d = 0;
  178. int j, k;
  179. int start, finish, v;
  180. if (BGN.Y == END.Y)
  181. {
  182. if (abs(END.X - BGN.X) >= abs(END.Z - BGN.Z))
  183. {
  184.  
  185. double dz = END.Z - BGN.Z;
  186. double dx = END.X - BGN.X;
  187. t = dz / dx;
  188.  
  189. if (BGN.X < END.X)
  190. {
  191. start = BGN.X;
  192. finish = END.X;
  193. v = BGN.Z;
  194. }
  195. else
  196. {
  197. start = END.X;
  198. finish = BGN.X;
  199. v = END.Z;
  200. }
  201. for (j = start; j != finish; j++)
  202. {
  203. tmp.X=j;
  204. tmp.Y=BGN.Y;
  205. tmp.Z=v;
  206. setPixel(tmp, color);
  207. d += t;
  208. if (d > 0.5)
  209. {
  210. v++;
  211. d--;
  212. }
  213. if (d < -0.5)
  214. {
  215. v--;
  216. d++;
  217. }
  218. }
  219. tmp.X=j;
  220. tmp.Y=BGN.Y;
  221. tmp.Z=v;
  222. setPixel(tmp, color);
  223. }
  224. else
  225. {
  226.  
  227. double dz = END.Z - BGN.Z;
  228. double dx = END.X - BGN.X;
  229. t = dx / dz;
  230.  
  231. if (BGN.Z < END.Z)
  232. {
  233. start = BGN.Z;
  234. finish = END.Z;
  235. v = BGN.X;
  236. }
  237. else
  238. {
  239. start = END.Z;
  240. finish = BGN.Z;
  241. v = END.X;
  242. }
  243.  
  244. for ( j = start; j != finish; j++)
  245. {
  246. tmp.X=v;
  247. tmp.Y=BGN.Y;
  248. tmp.Z=j;
  249. setPixel( tmp, color);
  250. d += t;
  251. if (d > 0.5)
  252. {
  253. v++;
  254. d--;
  255. }
  256. if (d < -0.5)
  257. {
  258. v--;
  259. d++;
  260. }
  261. }
  262. tmp.X=v;
  263. tmp.Y=BGN.Y;
  264. tmp.Z=j;
  265. setPixel(tmp, color);
  266. }
  267. }
  268.  
  269.  
  270. if (BGN.X == END.X)
  271. {
  272. if (abs(END.Y - BGN.Y) >= abs(END.Z - BGN.Z))
  273. {
  274.  
  275. double dz = END.Z - BGN.Z;
  276. double dy = END.Y - BGN.Y;
  277. t = dz / dy;
  278.  
  279. if (BGN.Y < END.Y)
  280. {
  281. start = BGN.Y;
  282. finish = END.Y;
  283. v = BGN.Z;
  284. }
  285. else
  286. {
  287. start = END.Y;
  288. finish = BGN.Y;
  289. v = END.Z;
  290. }
  291. for (j = start; j != finish; j ++)
  292. {tmp.X=BGN.X;
  293. tmp.Y=j;
  294. tmp.Z=v;
  295. setPixel(tmp, color);
  296. d += t;
  297. if (d > 0.5)
  298. {
  299. v++;
  300. d--;
  301. }
  302. if (d < -0.5)
  303. {
  304. v--;
  305. d++;
  306. }
  307. }
  308. tmp.X=BGN.X;
  309. tmp.Y=j;
  310. tmp.Z=v;
  311. setPixel(tmp, color);
  312. }
  313. else
  314. {
  315.  
  316. double dz = END.Z - BGN.Z;
  317. double dy = END.Y - BGN.Y;
  318. t = dy / dz;
  319.  
  320. if (BGN.Z < END.Z)
  321. {
  322. k = 1;
  323. }
  324. else
  325. {
  326. k = -1;
  327. }
  328.  
  329. for (j = BGN.Z; j != (int)END.Z; j += k)
  330. {
  331. tmp.X=BGN.X;
  332. tmp.Y=BGN.Y;
  333. tmp.Z=j;
  334. setPixel(tmp, color);
  335. d += t;
  336. if (d > 0.5)
  337. {
  338. BGN.Y++;
  339. d--;
  340. }
  341. if (d < -0.5)
  342. {
  343. BGN.Y--;
  344. d++;
  345. }
  346. }
  347. tmp.X=BGN.X;
  348. tmp.Y=BGN.Y;
  349. tmp.Z=j;
  350. setPixel(tmp, color);
  351. }
  352. }
  353. }
  354.  
  355. void color()
  356. {
  357. float tmp;
  358. for (int i = 0; i < m + 2 * m*(n - 1); i++)
  359. {
  360. tmp = (rand() % 100) / 100.0 -0.1;
  361. colorbase[i].r = tmp;
  362. tmp = (rand() % 100) / 100.0-0.1;
  363. colorbase[i].g = tmp;
  364. tmp = (rand() % 100) / 100.0-0.1;
  365. colorbase[i].b = tmp;
  366. }
  367. }
  368. void Draw(COOORD a, COOORD b, COOORD c, RGB color, int n)
  369. {
  370. glBegin(GL_POLYGON);
  371. glColor3f(color.r, color.g, color.b);
  372. glVertex3i(a.x, a.y, a.z);
  373. glVertex3i(b.x, b.y, b.z);
  374. glVertex3i(c.x, c.y, c.z);
  375. glEnd();
  376. glColor3f(0, 0, 0);
  377. glBegin(GL_POLYGON);
  378. glVertex3i(a.x, a.y, d - 1);
  379. glVertex3i(b.x, b.y, d - 1);
  380. glVertex3i(c.x, c.y, d - 1);
  381. glEnd();
  382. glBegin(GL_POLYGON);
  383. glVertex3i(a.x, a.y, d + 1);
  384. glVertex3i(b.x, b.y, d + 1);
  385. glVertex3i(c.x, c.y, d + 1);
  386. glEnd();
  387. }
  388. void glutBufferActivated()
  389. {
  390. //ініціалізація буфера глубини
  391. for (int i = 0; i < 2*d + 1; i++)
  392. for (int j = 0; j < 2*d + 1; j++)
  393. depth_buffer[i][j] = d;
  394.  
  395. //ініціалізація буфера кольору
  396. for (int i = 0; i < 2*d + 1; i++)
  397. for (int j = 0; j < 2*d + 1; j++)
  398. {
  399. color_buffer[i][j].r = 1.0;
  400. color_buffer[i][j].g = 1.0;
  401. color_buffer[i][j].b = 1.0;
  402. }
  403. }
  404.  
  405. void glutDrawBuffers()
  406. {
  407. glPointSize(1);
  408. glBegin(GL_POINTS);
  409. for (int j = 0; j <= 2*d; j++)//x-d/2
  410. for (int i = 0; i <= 2*d; i++)//y-d/2
  411. {
  412. glColor3f(color_buffer[i][j].r, color_buffer[i][j].g, color_buffer[i][j].b);
  413. glVertex3i(j - d , i - d , depth_buffer[i][j]);
  414. }
  415. glColor3f(0, 0, 0);
  416. glVertex3i(0, 0, 0);
  417. glEnd();
  418. }
  419.  
  420. void nDraw(COOORD a, COOORD b, COOORD c, RGB color)
  421. {
  422.  
  423. if (sort(a,b,c)=='z')
  424. {
  425. if (a.z < b.z)
  426. {
  427. COOORD t = a;
  428. a = b;
  429. b = t;
  430. }
  431. if (a.z < c.z)
  432. {
  433. COOORD t = a;
  434. a = c;
  435. c = t;
  436. }
  437. if (c.z > b.z)
  438. {
  439. COOORD t = c;
  440. c = b;
  441. b = t;
  442. }
  443. if (c.z > a.z)
  444. {
  445. COOORD t = c;
  446. c = a;
  447. a = t;
  448. }
  449. COOORD begin;
  450. COOORD end;
  451.  
  452. if (a.z == b.z)
  453. {
  454.  
  455. for (int z = a.z; z >= (int)c.z; z--)
  456. {
  457. if (z == (int)a.z)
  458. {
  459. begin.x = a.x;
  460. begin.y = a.y;
  461. end.x = b.x;
  462. end.y = b.y;
  463. }
  464. else
  465. {
  466. if (z > (int)c.z)
  467. {
  468. begin.x = a.x + (c.x - a.x)*(z - a.z) / (c.z - a.z);
  469. begin.y = a.y + (c.y - a.y)*(z - a.z) / (c.z - a.z);
  470. end.x = b.x + (c.x - b.x)*(z - b.z) / (c.z - b.z);
  471. end.y = b.y + (c.y - b.y)*(z - b.z) / (c.z - b.z);
  472. }
  473. else
  474. {
  475. if (z == (int)c.z)
  476. {
  477. begin.x = c.x;
  478. begin.y = c.y;
  479. end.x = c.x;
  480. end.y = c.y;
  481. }
  482. }
  483. }
  484. CORD linker = { begin.x, begin.y, z};
  485. CORD linkeer = { end.x, end.y, z};
  486. Brezenhem(linker, linkeer, color);
  487. }
  488. }
  489. else
  490. {
  491. if (b.z == c.z)
  492. {
  493. for (int z = a.z; z >= (int)b.z; z--)
  494. {
  495. if (z == (int)a.z)
  496. {
  497. begin.x = a.x;
  498. begin.y = a.y;
  499. end.x = a.x;
  500. end.y = a.y;
  501. }
  502. else
  503. {
  504. if (z > b.z)
  505. {
  506. begin.x = a.x + (b.x - a.x)*(z - a.z) / (b.z - a.z);
  507. begin.y = a.y + (b.y - a.y)*(z - a.z) / (b.z - a.z);
  508. end.x = a.x + (c.x - a.x)*(z - a.z) / (c.z - a.z);
  509. end.y = a.y + (c.y - a.y)*(z - a.z) / (c.z - a.z);
  510. }
  511. else
  512. {
  513. if (z == (int)b.z)
  514. {
  515. begin.x = b.x;
  516. begin.y = b.y;
  517. end.x = c.x;
  518. end.y = c.y;
  519. }
  520. }
  521. }
  522. CORD link = { begin.x, begin.y, z };
  523. CORD linke = { end.x, end.y, z };
  524. Brezenhem(link,linke, color);
  525. }
  526. }
  527. if (a.z != b.z && c.z != b.z)
  528. {
  529. for (int z = a.z; z >= (int)c.z; z--)
  530. {
  531. if (z == (int)a.z)
  532. {
  533. begin.x = a.x;
  534. begin.y = a.y;
  535. end.x = a.x;
  536. end.y = a.y;
  537. }
  538. else
  539. {
  540. if (z > b.z)
  541. {
  542. begin.x = a.x + (b.x - a.x)*(z - a.z) / (b.z - a.z);
  543. begin.y = a.y + (b.y - a.y)*(z - a.z) / (b.z - a.z);
  544. end.x = a.x + (c.x - a.x)*(z - a.z) / (c.z - a.z);
  545. end.y = a.y + (c.y - a.y)*(z - a.z) / (c.z - a.z);
  546. }
  547. else
  548. {
  549. if (z == (int)b.z)
  550. {
  551. begin.x = b.x;
  552. begin.y = b.y;
  553. end.x = a.x + (c.x - a.x)*(z - a.z) / (c.z - a.z);
  554. end.y = a.y + (c.y - a.y)*(z - a.z) / (c.z - a.z);
  555. }
  556. else
  557. {
  558.  
  559. if (z > c.z)
  560. {
  561. begin.x = b.x + (c.x - b.x)*(z - b.z) / (c.z - b.z);
  562. begin.y = b.y + (c.y - b.y)*(z - b.z) / (c.z - b.z);
  563. end.x = a.x + (c.x - a.x)*(z - a.z) / (c.z - a.z);
  564. end.y = a.y + (c.y - a.y)*(z - a.z) / (c.z - a.z);
  565.  
  566. }
  567. else
  568. {
  569. if (z == (int)c.z)
  570. {
  571. begin.x = c.x;
  572. begin.y = c.y;
  573. end.x = c.x;
  574. end.y = c.y;
  575. }
  576. }
  577. }
  578. }
  579. }
  580. CORD lin = { begin.x, begin.y, z };
  581. CORD linn ={ end.x, end.y, z };
  582. Brezenhem(lin,linn , color);
  583. }
  584. }
  585. }
  586. }
  587.  
  588.  
  589. if (sort(a, b, c) == 'y')
  590. {
  591. if (a.y < b.y)
  592. {
  593. COOORD t = a;
  594. a = b;
  595. b = t;
  596. }
  597. if (a.y < c.y)
  598. {
  599. COOORD t = a;
  600. a = c;
  601. c = t;
  602. }
  603. if (c.y > b.y)
  604. {
  605. COOORD t = c;
  606. c = b;
  607. b = t;
  608. }
  609. if (c.y > a.y)
  610. {
  611. COOORD t = c;
  612. c = a;
  613. a = t;
  614. }
  615. COOORD begin;
  616. COOORD end;
  617.  
  618. if (a.y == b.y)
  619. {
  620.  
  621. for (int y = a.y; y >= (int)c.y; y--)
  622. {
  623. if (y == (int)a.y)
  624. {
  625. begin.x = a.x;
  626. begin.z = a.z;
  627. end.x = b.x;
  628. end.z = b.z;
  629. }
  630. else
  631. {
  632. if (y > c.y)
  633. {
  634. begin.x = a.x + (c.x - a.x)*(y - a.y) / (c.y - a.y);
  635. begin.z = a.z + (c.z - a.z)*(y - a.y) / (c.y - a.y);
  636. end.x = b.x + (c.x - b.x)*(y - b.y) / (c.y - b.y);
  637. end.z = b.z + (c.z - b.z)*(y - b.y) / (c.y - b.y);
  638. }
  639. else
  640. {
  641. if (y == (int)c.y)
  642. {
  643. begin.x = c.x;
  644. begin.z = c.z;
  645. end.x = c.x;
  646. end.z = c.z;
  647. }
  648. }
  649. }
  650. tmp.X=begin.x;
  651. tmp.Y=y;
  652. tmp.Z=begin.z;
  653. tmp2.X=end.x;
  654. tmp2.Y=y;
  655. tmp2.Z=end.z;
  656. Brezenhem(tmp, tmp2, color);
  657. }
  658. }
  659. else
  660. {
  661. if (b.y == (int)c.y)
  662. {
  663. for (int y = a.y; y >= (int)b.y; y--)
  664. {
  665. if (y == (int)a.y)
  666. {
  667. begin.x = a.x;
  668. begin.z = a.z;
  669. end.x = a.x;
  670. end.z = a.z;
  671. }
  672. else
  673. {
  674. if (y > (int)b.y)
  675. {
  676. begin.x = a.x + (b.x - a.x)*(y - a.y) / (b.y - a.y);
  677. begin.z = a.z + (b.z - a.z)*(y - a.y) / (b.y - a.y);
  678. end.x = a.x + (c.x - a.x)*(y - a.y) / (c.y - a.y);
  679. end.z = a.z + (c.z - a.z)*(y - a.y) / (c.y - a.y);
  680. }
  681. else
  682. {
  683. if (y == (int)b.y)
  684. {
  685. begin.x = b.x;
  686. begin.z = b.z;
  687. end.x = c.x;
  688. end.z = c.z;
  689. }
  690. }
  691. }
  692. tmp.X=begin.x;
  693. tmp.Y=y;
  694. tmp.Z=begin.z;
  695. tmp2.X=end.x;
  696. tmp2.Y=y;
  697. tmp2.Z=end.z;
  698. Brezenhem(tmp, tmp2, color);
  699. }
  700. }
  701. if (a.y != b.y && c.y != b.y)
  702. {
  703. for (int y = a.y; y >= (int)c.y; y--)
  704. {
  705. if (y == (int)a.y)
  706. {
  707. begin.x = a.x;
  708. begin.z = a.z;
  709. end.x = a.x;
  710. end.z = a.z;
  711. }
  712. else
  713. {
  714. if (y > b.y)
  715. {
  716. begin.x = a.x + (b.x - a.x)*(y - a.y) / (b.y - a.y);
  717. begin.z = a.z + (b.z - a.z)*(y - a.y) / (b.y - a.y);
  718. end.x = a.x + (c.x - a.x)*(y - a.y) / (c.y - a.y);
  719. end.z = a.z + (c.z- a.z)*(y - a.y) / (c.y - a.y);
  720. }
  721. else
  722. {
  723. if (y == (int)b.y)
  724. {
  725. begin.x = b.x;
  726. begin.z = b.z;
  727. end.x = a.x + (c.x - a.x)*(y - a.y) / (c.y - a.y);
  728. end.z = a.z + (c.z - a.z)*(y - a.y) / (c.y - a.y);
  729. }
  730. else
  731. {
  732.  
  733. if (y > c.y)
  734. {
  735. begin.x = b.x + (c.x - b.x)*(y - b.y) / (c.y - b.y);
  736. begin.z = b.z + (c.z - b.z)*(y - b.y) / (c.y - b.y);
  737. end.x = a.x + (c.x - a.x)*(y - a.y) / (c.y - a.y);
  738. end.z = a.z + (c.z - a.z)*(y - a.y) / (c.y - a.y);
  739.  
  740. }
  741. else
  742. {
  743. if (y == (int)c.y)
  744. {
  745. begin.x = c.x;
  746. begin.z = c.z;
  747. end.x = c.x;
  748. end.z = c.z;
  749. }
  750. }
  751. }
  752. }
  753. }
  754. tmp.X=begin.x;
  755. tmp.Y=y;
  756. tmp.Z=begin.z;
  757. tmp2.X=end.x;
  758. tmp2.Y=y;
  759. tmp2.Z=end.z;
  760. Brezenhem(tmp, tmp2, color);
  761. }
  762. }
  763. }
  764. }
  765.  
  766.  
  767.  
  768.  
  769.  
  770. if (sort(a, b, c) == 'x')
  771. {
  772. if (a.x < b.x)
  773. {
  774. COOORD t = a;
  775. a = b;
  776. b = t;
  777. }
  778. if (a.x < c.x)
  779. {
  780. COOORD t = a;
  781. a = c;
  782. c = t;
  783. }
  784. if (c.x > b.x)
  785. {
  786. COOORD t = c;
  787. c = b;
  788. b = t;
  789. }
  790. if (c.x > a.x)
  791. {
  792. COOORD t = c;
  793. c = a;
  794. a = t;
  795. }
  796. COOORD begin;
  797. COOORD end;
  798.  
  799. if (a.x == b.x)
  800. {
  801.  
  802. for (int x = a.x; x >= (int)c.x; x--)
  803. {
  804. if (x == (int)a.x)
  805. {
  806. begin.y = a.y;
  807. begin.z = a.z;
  808. end.y = b.y;
  809. end.z = b.z;
  810. }
  811. else
  812. {
  813. if (x > c.x)
  814. {
  815. begin.y = a.y + (c.y - a.y)*(x - a.x) / (c.x - a.x);
  816. begin.z = a.z + (c.z - a.z)*(x - a.x) / (c.x - a.x);
  817. end.y = b.y + (c.y - b.y)*(x - b.x) / (c.x - b.x);
  818. end.z = b.z + (c.z - b.z)*(x - b.x) / (c.x - b.x);
  819. }
  820. else
  821. {
  822. if (x == (int)c.x)
  823. {
  824. begin.y = c.y;
  825. begin.z = c.z;
  826. end.y = c.y;
  827. end.z = c.z;
  828. }
  829. }
  830. }
  831. tmp.X=x;
  832. tmp.Y=begin.y;
  833. tmp.Z=begin.z;
  834. tmp2.X=x;
  835. tmp2.Y=end.y;
  836. tmp2.Z=end.z;
  837. Brezenhem(tmp, tmp2, color);
  838. }
  839. }
  840. else
  841. {
  842. if (b.x == c.x)
  843. {
  844. for (int x = a.x; x >= (int)b.x; x--)
  845. {
  846. if (x == (int)a.x)
  847. {
  848. begin.y = a.y;
  849. begin.z = a.z;
  850. end.y = a.y;
  851. end.z = a.z;
  852. }
  853. else
  854. {
  855. if (x > b.x)
  856. {
  857. begin.y = a.y + (b.y - a.y)*(x - a.x) / (b.x - a.x);
  858. begin.z = a.z + (b.z - a.z)*(x - a.x) / (b.x - a.x);
  859. end.x = a.x + (c.x - a.x)*(x - a.x) / (c.x - a.x);
  860. end.z = a.z + (c.z - a.z)*(x - a.x) / (c.x - a.x);
  861. }
  862. else
  863. {
  864. if (x == (int)b.x)
  865. {
  866. begin.y = b.y;
  867. begin.z = b.z;
  868. end.y = c.y;
  869. end.z = c.z;
  870. }
  871. }
  872. }
  873. tmp.X=x;
  874. tmp.Y=begin.y;
  875. tmp.Z=begin.z;
  876. tmp2.X=x;
  877. tmp2.Y=end.y;
  878. tmp2.Z=end.z;
  879. Brezenhem(tmp, tmp2, color);
  880.  
  881. }
  882. }
  883. if (a.x != b.x && c.x != b.x)
  884. {
  885. for (int x = a.x; x >= (int)c.x; x--)
  886. {
  887. if (x == (int)a.x)
  888. {
  889. begin.y = a.y;
  890. begin.z = a.z;
  891. end.y = a.y;
  892. end.z = a.z;
  893. }
  894. else
  895. {
  896. if (x > b.x)
  897. {
  898. begin.y = a.y + (b.y - a.y)*(x - a.x) / (b.x - a.x);
  899. begin.z = a.z + (b.z - a.z)*(x - a.x) / (b.x - a.x);
  900. end.y = a.y + (c.y - a.y)*(x - a.x) / (c.x - a.x);
  901. end.z = a.z + (c.z - a.z)*(x - a.x) / (c.x - a.x);
  902. }
  903. else
  904. {
  905. if (x == (int)b.x)
  906. {
  907. begin.y = b.y;
  908. begin.z = b.z;
  909. end.y = a.y + (c.y - a.y)*(x - a.x) / (c.x - a.x);
  910. end.z = a.z + (c.z - a.z)*(x - a.x) / (c.x - a.x);
  911. }
  912. else
  913. {
  914.  
  915. if (x > c.x)
  916. {
  917. begin.y = b.y + (c.y - b.y)*(x - b.x) / (c.x - b.x);
  918. begin.z = b.z + (c.z - b.z)*(x - b.x) / (c.x - b.x);
  919. end.y = a.y + (c.y - a.y)*(x - a.x) / (c.x - a.x);
  920. end.z = a.z + (c.z - a.z)*(x - a.x) / (c.x - a.x);
  921.  
  922. }
  923. else
  924. {
  925. if (x == c.x)
  926. {
  927. begin.y = c.y;
  928. begin.z = c.z;
  929. end.y = c.y;
  930. end.z = c.z;
  931. }
  932. }
  933. }
  934. }
  935. }
  936. /*tmp.X=x;
  937. tmp.Y=begin.y;
  938. tmp.Z = begin.z;
  939. tmp2.X=x;
  940. tmp2.Y=end.y;
  941. tmp2.Z=end.z;*/
  942. CORD li ={ x, begin.y, begin.z };
  943. CORD lii={ x, end.y, end.z };
  944. Brezenhem(li, lii, color);
  945. }
  946. }
  947. }
  948. }
  949. }
  950.  
  951. void display()
  952. {
  953.  
  954. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  955. glColor3f(1.0, 1.0, 1.0);
  956. //////////////////////////////////////////
  957.  
  958. triangle*object = new triangle[m + 2 * m*(n - 1)];
  959.  
  960. int *R = new int[n + 1];
  961. double a = 90 * RAD / n;
  962.  
  963.  
  964. for (int i = 0; i < n; i++)
  965. {
  966. R[i] = r*cos(i*a);
  967. }
  968. R[n] = 0;
  969. int *Z = new int[n + 1];
  970. for (int i = 0; i < n + 1; i++)
  971. {
  972. Z[i] = -r*sin(i*a);
  973. }
  974.  
  975. double *X = new double[m + 1];
  976. double *Y = new double[m + 1];
  977. a = 360 * RAD / m;
  978. for (int i = 0; i < m; i++)
  979. {
  980. X[i] = cos(i*a);
  981. Y[i] = sin(i*a);
  982. }
  983. X[m] = X[0];
  984. Y[m] = Y[0];
  985. /////////////////////////////////////////////////
  986. int k = 0;
  987. //for (int j = 0; j < n - 1; j++)
  988. //for (int i = 0; i < m; i++)
  989. //{
  990. // buf.x = X[i] * R[j];
  991. // buf.y = Y[i] * R[j];
  992. // buf.z = Z[j];
  993. // object[k].a = buf;/////////////////
  994. // buf.x = X[i + 1] * R[j];
  995. // buf.y = Y[i + 1] * R[j];
  996. // buf.z = Z[j];
  997. // object[k].b = buf;
  998. // buf.x = X[i] * R[j + 1];
  999. // buf.y = Y[i] * R[j + 1];
  1000. // buf.z = Z[j + 1];
  1001. // object[k].c = buf;
  1002. // k++;
  1003. // buf.x = X[i + 1] * R[j + 1];
  1004. // buf.y = Y[i + 1] * R[j + 1];
  1005. // buf.z = Z[j + 1];
  1006. // object[k].a = buf;
  1007. // buf.x = X[i + 1] * R[j];
  1008. // buf.y = Y[i + 1] * R[j];
  1009. // buf.z = Z[j];
  1010. // object[k].b = buf;
  1011. // buf.x = X[i] * R[j + 1];
  1012. // buf.y = Y[i] * R[j + 1];
  1013. // buf.z = Z[j + 1];
  1014. // object[k].c = buf;
  1015. // k++;
  1016. //}
  1017. for (int i = 0; i < m; i++)
  1018. {
  1019. buf.x = X[i] * R[n - 1];
  1020. buf.y = Y[i] * R[n - 1];
  1021. buf.z = Z[n]+100;
  1022. object[k].a = buf;
  1023. buf.x = X[i + 1] * R[n - 1];
  1024. buf.y = Y[i + 1] * R[n - 1];
  1025. buf.z = Z[n]+100;
  1026. object[k].b = buf;
  1027. buf.x = X[i] * R[n];
  1028. buf.y = Y[i] * R[n];
  1029. buf.z = Z[n]+100;
  1030. object[k].c = buf;
  1031. k++;
  1032.  
  1033. }
  1034. glutDrawBuffers();
  1035. ////////////////////////////////////////////////
  1036.  
  1037. glutBufferActivated();
  1038.  
  1039. ///////////////////////////////////////////////////
  1040. //
  1041.  
  1042. for (int i = 0; i < m + 2 * m*(n - 1); i++)
  1043. {
  1044.  
  1045. nDraw(object[i].a, object[i].b, object[i].c, colorbase[i]);
  1046. }
  1047. ///////////////////////////////////////////////////
  1048.  
  1049. //nDraw(object[11].a, object[11].b, object[11].c, colorbase[11]);
  1050. //nDraw(object[10].a, object[10].b, object[10].c, colorbase[10]);
  1051. //nDraw(object[9].a, object[9].b, object[9].c, colorbase[9]);
  1052. //nDraw(object[8].a, object[8].b, object[8].c, colorbase[8]);
  1053. //nDraw(object[7].a, object[7].b, object[7].c, colorbase[7]);
  1054. //nDraw(object[1].a, object[1].b, object[1].c, colorbase[1]);
  1055. /*glBegin(GL_LINES);
  1056. glColor3f(0, 0, 1);
  1057. glVertex3f(100, 0, -173);
  1058. glVertex3f(-50, -86, -173);
  1059.  
  1060. glColor3f(0, 1, 0);
  1061. glVertex3f(0, 0, -200);
  1062. glVertex3f(0, -57, -173);
  1063. glEnd();
  1064. Brezenhem({ 0, 0, -200 }, { 0, -57, -173 }, { 1, 0, 0 });*/
  1065.  
  1066. glutDrawBuffers();
  1067.  
  1068.  
  1069. glTranslatef(0, 0, deltaMove);
  1070. deltaMove = 0;
  1071. if (first)
  1072. {
  1073. first = false;
  1074. //glRotatef(-30, 1,1, 0);
  1075. glRotatef(180, 1, 0, 0);
  1076. glRotatef(90,0, 0,1);
  1077. }
  1078. glRotatef(0.3,1, 0, 0);
  1079. glutSwapBuffers();
  1080. }
  1081.  
  1082.  
  1083.  
  1084. void timer(int = 0)
  1085. {
  1086. display();
  1087. glutTimerFunc(10, timer, 0);
  1088. }
  1089.  
  1090.  
  1091. void pressKey(int key, int xx, int yy) {
  1092. switch (key) {
  1093. case GLUT_KEY_UP: deltaMove = 5.0f; break;
  1094. case GLUT_KEY_DOWN: deltaMove = -5.0f; break;
  1095. }
  1096. }
  1097.  
  1098.  
  1099.  
  1100. int main(int argc, char **argv)
  1101. {
  1102.  
  1103.  
  1104. glutInit(&argc, argv);
  1105. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  1106. glutInitWindowSize(500, 500);
  1107. glutInitWindowPosition(20, 20);
  1108. glutCreateWindow("Z_BUFFER");
  1109. glClearColor(0.0, 0.0, 0.0,1.0);
  1110. glMatrixMode(GL_PROJECTION);
  1111. glLoadIdentity();
  1112. glOrtho(-d, d, -d, d, -5 * d, 5 * d);
  1113. //srand(time(NULL));
  1114. color();
  1115.  
  1116. glutIgnoreKeyRepeat(1);
  1117. glutSpecialFunc(pressKey);
  1118.  
  1119. glEnable(GL_DEPTH_TEST);
  1120. glutDisplayFunc(display);
  1121. timer();
  1122. glutMainLoop();
  1123. return 0;
  1124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement