В интерактивном режиме вывести куб без удаления невидимых линий в параллельной проекции. Программирование на Си/С


Добавил:DMT
Дата создания:18 июня 2008, 23:32
Дата обновления:28 июня 2008, 22:48
Просмотров:7989 последний сегодня, 15:19
Комментариев: 0
В интерактивном режиме вывести куб без удаления невидимых линий в параллельной проекции. Программирование на Си/С, исходник
Код на C++
  1.  
  2. //---------------------------------------------------------------------------
  3. #define SIDE 120
  4.  
  5. #include <stdio.h>
  6. #include <vcl.h>
  7. #pragma hdrstop
  8.  
  9. #include "Main.h"
  10. //---------------------------------------------------------------------------
  11. #pragma package(smart_init)
  12. #pragma resource "*.dfm"
  13. TfrmMain *frmMain;
  14. bool NoReDraw = false;
  15. //----Програмирование на Си/С,
  16. struct TVector
  17. {
  18. float x;
  19. float y;
  20. float z;
  21. } u, u1, u2, r0;
  22. // умножение векторов исходник
  23. TVector VMulVectors(TVector v1, TVector v2)
  24. {
  25. TVector v;
  26. v.x = v1.y * v2.z - v1.z * v2.y;
  27. v.y = v1.z * v2.x - v1.x * v2.z;
  28. v.z = v1.x * v2.y - v1.y * v2.x;
  29. return v;
  30. }
  31. //-вывести куб без удаления невидимых линий
  32. // умножение векторов исходник
  33. float MulVectors(TVector v1, TVector v2, TVector v3)
  34. {
  35. return v1.x * v2.y * v3.z +
  36. v1.y * v2.z * v3.x +
  37. v2.x * v3.y * v1.z -
  38. v3.x * v2.y * v1.z -
  39. v2.x * v1.y * v3.z -
  40. v3.y * v2.z * v1.x;
  41. }
  42. //куб без удаления невидимых линий в параллельной проекции
  43. //---------------------------------------------------------------------------
  44. TVector SubVectors(TVector v1, TVector v2)
  45. {
  46. TVector v;
  47. v.x = v1.x - v2.x;
  48. v.y = v1.y - v2.y;
  49. v.z = v1.z - v2.z;
  50. return v;
  51. }
  52. //-куб без удаления невидимых линий
  53. //-получение точки
  54. TPoint GetPoint(int x, int y, int z)
  55. {
  56. TPoint pt;
  57. TVector r, r1;
  58. float s1, s2, s3, s4;
  59. r.x = x;
  60. r.y = y;
  61. r.z = z;
  62. s1 = MulVectors(u1, u2, u);
  63. r1 = SubVectors(r, r0);
  64. s3 = MulVectors(r1, u2, u);
  65. s4 = MulVectors(r1, u1, u);
  66. pt.x = s3 / s1;
  67. pt.y = - s4 / s1;
  68. return pt;
  69. }
  70. //---------------------------------------------------------------------------
  71. //куб без удаления невидимых линий в параллельной проекции
  72. TPoint ToScreen(TPoint pt)
  73. {
  74. pt.x = frmMain->pbMain->Width / 2 + pt.x;
  75. pt.y = frmMain->pbMain->Height / 2 - pt.y;
  76. return pt;
  77. }
  78. //---------------------------------------------------------------------------
  79. void UpdateSettings()
  80. {
  81. NoReDraw = true;
  82. frmMain->edtUx->Text = Format("%.3f", ARRAYOFCONST((u.x)));
  83. frmMain->edtUy->Text = Format("%.3f", ARRAYOFCONST((u.y)));
  84. frmMain->edtUz->Text = Format("%.3f", ARRAYOFCONST((u.z)));
  85. frmMain->edtU1x->Text = Format("%.3f", ARRAYOFCONST((u1.x)));
  86. frmMain->edtU1y->Text = Format("%.3f", ARRAYOFCONST((u1.y)));
  87. frmMain->edtU1z->Text = Format("%.3f", ARRAYOFCONST((u1.z)));
  88. frmMain->edtU2x->Text = Format("%.3f", ARRAYOFCONST((u2.x)));
  89. frmMain->edtU2y->Text = Format("%.3f", ARRAYOFCONST((u2.y)));
  90. frmMain->edtU2z->Text = Format("%.3f", ARRAYOFCONST((u2.z)));
  91. frmMain->edtR0x->Text = Format("%.3f", ARRAYOFCONST((r0.x)));
  92. frmMain->edtR0y->Text = Format("%.3f", ARRAYOFCONST((r0.y)));
  93. frmMain->edtR0z->Text = Format("%.3f", ARRAYOFCONST((r0.z)));
  94. NoReDraw = false;
  95. }
  96. //------------вывести куб без удаления невидимых линий
  97. void DrawBox()
  98. {
  99. TVector v;
  100. frmMain->pbMain->Canvas->Brush = frmMain->Brush;
  101. frmMain->pbMain->Canvas->Rectangle
  102. (
  103. 0,
  104. 0,
  105. frmMain->pbMain->Width,
  106. frmMain->pbMain->Height
  107. );
  108. try
  109. {
  110. u.x = frmMain->edtUx->Text.ToDouble();
  111. u.y = frmMain->edtUy->Text.ToDouble();
  112. u.z = frmMain->edtUz->Text.ToDouble();
  113. u1.x = frmMain->edtU1x->Text.ToDouble();
  114. u1.y = frmMain->edtU1y->Text.ToDouble();
  115. u1.z = frmMain->edtU1z->Text.ToDouble();
  116. u2.x = frmMain->edtU2x->Text.ToDouble();
  117. u2.y = frmMain->edtU2y->Text.ToDouble();
  118. u2.z = frmMain->edtU2z->Text.ToDouble();
  119. r0.x = frmMain->edtR0x->Text.ToDouble();
  120. r0.y = frmMain->edtR0y->Text.ToDouble();
  121. r0.z = frmMain->edtR0z->Text.ToDouble();
  122. }
  123. catch(...) {};
  124. v = VMulVectors(u1, u2);
  125. if (v.x == 0 && v.y == 0 && v.z == 0)
  126. {
  127. MessageBox(NULL, "Векторы u1 и u2 параллельны!", "Ошибка", MB_ICONERROR);
  128. return;
  129. }
  130. if (MulVectors(u1, u2, u) == 0) return;
  131. TPoint *pts = new TPoint[8];
  132.  
  133. pts[0] = ToScreen(GetPoint(0, 0, 0));
  134. pts[1] = ToScreen(GetPoint(SIDE, 0, 0));
  135. pts[2] = ToScreen(GetPoint(0, SIDE,0));
  136. pts[3] = ToScreen(GetPoint(SIDE,SIDE,0));
  137.  
  138. pts[4] = ToScreen(GetPoint(SIDE/2, SIDE/2, SIDE));
  139.  
  140.  
  141. frmMain->pbMain->Canvas->MoveTo(pts[0].x, pts[0].y);
  142. frmMain->pbMain->Canvas->LineTo(pts[1].x, pts[1].y);
  143.  
  144. frmMain->pbMain->Canvas->MoveTo(pts[0].x, pts[0].y);
  145. frmMain->pbMain->Canvas->LineTo(pts[2].x, pts[2].y);
  146.  
  147. frmMain->pbMain->Canvas->MoveTo(pts[2].x, pts[2].y);
  148. frmMain->pbMain->Canvas->LineTo(pts[3].x, pts[3].y);
  149.  
  150. frmMain->pbMain->Canvas->MoveTo(pts[1].x, pts[1].y);
  151. frmMain->pbMain->Canvas->LineTo(pts[3].x, pts[3].y);
  152.  
  153. frmMain->pbMain->Canvas->MoveTo(pts[0].x, pts[0].y);
  154. frmMain->pbMain->Canvas->LineTo(pts[4].x, pts[4].y);
  155.  
  156. frmMain->pbMain->Canvas->MoveTo(pts[1].x, pts[1].y);
  157. frmMain->pbMain->Canvas->LineTo(pts[4].x, pts[4].y);
  158.  
  159. frmMain->pbMain->Canvas->MoveTo(pts[2].x, pts[2].y);
  160. frmMain->pbMain->Canvas->LineTo(pts[4].x, pts[4].y);
  161.  
  162. frmMain->pbMain->Canvas->MoveTo(pts[3].x, pts[3].y);
  163. frmMain->pbMain->Canvas->LineTo(pts[4].x, pts[4].y);
  164.  
  165.  
  166. delete[] pts;
  167. }
  168. //---------------------------------------------------------------------------
  169. __fastcall TfrmMain::TfrmMain(TComponent* Owner)
  170. : TForm(Owner)
  171. {
  172. }
  173. //---------------------------------------------------------------------------
  174. void __fastcall TfrmMain::ValChange(TObject *Sender)
  175. {
  176. if (!NoReDraw) DrawBox();
  177. }
  178. //---------------------------------------------------------------------------
  179. void __fastcall TfrmMain::btnOpenClick(TObject *Sender)
  180. {
  181. frmMain->odMain->Execute();
  182. FILE *f;
  183. if ((f = fopen(frmMain->odMain->FileName.c_str(), "r")) == NULL) return;
  184. fscanf(f, "%f\n", &u.x);
  185. fscanf(f, "%f\n", &u.y);
  186. fscanf(f, "%f\n", &u.z);
  187. fscanf(f, "%f\n", &u1.x);
  188. fscanf(f, "%f\n", &u1.y);
  189. fscanf(f, "%f\n", &u1.z);
  190. fscanf(f, "%f\n", &u2.x);
  191. fscanf(f, "%f\n", &u2.y);
  192. fscanf(f, "%f\n", &u2.z);
  193. fscanf(f, "%f\n", &r0.x);
  194. fscanf(f, "%f\n", &r0.y);
  195. fscanf(f, "%f\n", &r0.z);
  196. fclose(f);
  197. UpdateSettings();
  198. DrawBox();
  199. }
  200. //---------------------------------------------------------------------------
  201. void __fastcall TfrmMain::btnSaveClick(TObject *Sender)
  202. {
  203. frmMain->sdMain->Execute();
  204. FILE *f;
  205. if ((f = fopen(frmMain->sdMain->FileName.c_str(), "w")) == NULL) return;
  206. fprintf(f, "%f\n", u.x);
  207. fprintf(f, "%f\n", u.y);
  208. fprintf(f, "%f\n", u.z);
  209. fprintf(f, "%f\n", u1.x);
  210. fprintf(f, "%f\n", u1.y);
  211. fprintf(f, "%f\n", u1.z);
  212. fprintf(f, "%f\n", u2.x);
  213. fprintf(f, "%f\n", u2.y);
  214. fprintf(f, "%f\n", u2.z);
  215. fprintf(f, "%f\n", r0.x);
  216. fprintf(f, "%f\n", r0.y);
  217. fprintf(f, "%f\n", r0.z);
  218. fclose(f);
  219. }
  220. //---------------------------------------------------------------------------
  221. void __fastcall TfrmMain::btnExitClick(TObject *Sender)
  222. {
  223. frmMain->Close();
  224. }
  225. //---------------------------------------------------------------------------
  226.  
При использовании обязательна ссылка на http://DMTSoft.ru

Вопросы и задачи к работе

  • Определение фрактала, размерности Хаусдорфа - Безиковича и топологической размерности.
  • Пример. Множество Кантора и его топологическая размерность.
  • Размерность Хаусдорфа - Безиковича кривой Коха.
  • Классификация фракталов.
  • Фракталы Ньютона.
  • Вычислить фрактальную размерность ковра Серпинского.
  • Вычислить фрактальную размерность кривой Серпинского.
  • Квадрат разбивается на p^2 одинаковых квадратов, из которых выбрасываются q квадратов, где p , q - положительные , целые числа. Этот процесс рекурсивно применяется к каждому из оставшихся квадратов. Найти фрактальную размерность полученного в пределе множества. В каком случае она равна 1.
  • Куб разбивается на 27 одинаковых кубов. Затем удаляется средний куб и процесс рекурсивно применяется к каждому из оставшихся кубов. Найти фрактальную размерность предельного множества
up