dmitrysenkovich

Untitled

Sep 10th, 2014
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.88 KB | None | 0 0
  1. построитьГраф(консольныеАргументы)
  2. {
  3. if (получитьКоличествоКонсольныхАргументов(консольныеАргументы) < 3)
  4. исключение;
  5.  
  6. имяВходногоФайла = консольныеАргументы[0];
  7. имяВыходногоФайла = консольныеАргументы[1];
  8.  
  9. сценаТеррейна;
  10. if (!загрузитьСцену(имяВходногоФайла, сценаТеррейна))
  11. исключение;
  12.  
  13. if (!существуетЛиФайлСИменем(имяВыходногоФайла))
  14. исключение;
  15.  
  16. мешТеррейна = получитьМешПоИмени(сценаТеррейна, имяМеша);
  17. перевестиВсеВершиныТеррейнаВМировоеПространство(мешТеррейна);
  18. картаРебер;
  19. получитьРебраМеша(мешТеррейна, картаРебер);
  20.  
  21. приближениеВычисления = консольныеАргументы[2];
  22. считатьЛиУгол = true;
  23. наибольшийОстрыйУгол = -1;
  24. наименьшаяВысотаТреугольниковМеша = -1;
  25. количествоВершинМеша = получитьКоличествоВершинВМеше(мешТеррейна);
  26. навМеш;
  27. самаяНизкаяТочка(0, БЕСКОНЕЧНОСТЬ, 0);
  28. самаяВысокаяТочка(0, -БЕСКОНЕЧНОСТЬ, 0);
  29. for (i = 0; i < количествоВершинМеша; i++)
  30. {
  31. позицияВершины = получитьВершину(мешТеррейна, i);
  32. вершинаГрафа(позицияВершины, true);
  33. добавитьВершину(навМеш, вершинаГрафа);
  34.  
  35. for (it = началоКарты(картаРебер); it != конецКарты(картаРебер); it++)
  36. {
  37. позицияПервойВершины = получитьВершину(мешТеррейна, получитьИндексВершины(мешТеррейна, получитьИндексПервогоКонцаРебра(получитьРебро(it))));
  38. позицияВторойВершины = получитьВершину(мешТеррейна, получитьИндексВершины(мешТеррейна, получитьИндексВторогоКонцаРебра(получитьРебро(it))));
  39. массивТочекПлоскости;
  40. for (j = 0; j < 3; j++)
  41. {
  42. получитьАбсциссуТочки(массивТочекПлоскости[j]) = j;
  43. получитьОрдинатуТочки(массивТочекПлоскости[j]) = получитьОрдинатуТочки(позицияВершины);
  44. получитьАппликатуТочки(массивТочекПлоскости[j]) = ;
  45. }
  46. горизонтальнаяПлоскость(массивТочекПлоскости[0], массивТочекПлоскости[1], массивТочекПлоскости[2]);
  47. точкаПересеченияРебраСГоризонтальнойПлоскостью;
  48. if (получитьТочкуПересеченияПлоскостиСТочкой(горизонтальнаяПлоскость, позицияПервойВершины, позицияВторойВершины, точкаПересеченияРебраСГоризонтальнойПлоскостью))
  49. {
  50. дополнительнаяВершинаПервогоТипа(точкаПересеченияРебраСГоризонтальнойПлоскостью, false);
  51. добавитьВершину(навМеш, дополнительнаяВершинаПервогоТипа);
  52. }
  53.  
  54. if (считатьЛиУгол)
  55. if (!вертикаленЛиОтрезокИзТочек(позицияПервойВершины, позицияВторойВершины))
  56. {
  57. уголМеждуВертикальюИОтрезкомИзТочек = найтиУголМеждуВертикальюИОтрезкомИзТочек(позицияПервойВершины, позицияВторойВершины);
  58. if (уголМеждуВертикальюИОтрезкомИзТочек > наибольшийОстрыйУгол)
  59. наибольшийОстрыйУгол = уголМеждуВертикальюИОтрезкомИзТочек;
  60. }
  61.  
  62. if ((i = 0) и (++it) == конецКарты(картаРебер))
  63. считатьЛиУгол = false;
  64. it--;
  65. }
  66.  
  67. if (получитьОрдинатуТочки(получитьВершину(мешТеррейна, i)) < получитьОрдинатуТочки(самаяНизкаяТочка))
  68. самаяНизкаяТочка = получитьВершину(мешТеррейна, i);
  69. if (получитьОрдинатуТочки(получитьВершину(мешТеррейна, i)) > получитьОрдинатуТочки(самаяВысокаяТочка))
  70. самаяВысокаяТочка = получитьВершину(мешТеррейна, i);
  71.  
  72. }
  73.  
  74. массивТреугольниковМеша = получитьМассивТреугольниковМеша(мешТеррейна);
  75. количествоТреугольниковМеша = получитьКоличествоТреугольниковВМеше(мешТеррейна);
  76. наименьшаяВысота = БЕСКОНЕЧНОСТЬ;
  77. for (i = 0; i < количествоТреугольниковМеша; i++)
  78. {
  79. for (j = 0; j < 3; j++)
  80. {
  81. текущаяВысота = получитьВысотуТреугольника(массивТреугольниковМеша[i], j);
  82. if (текущаяВысота < наименьшаяВысота)
  83. наименьшаяВысота = текущаяВысота;
  84. }
  85. }
  86.  
  87. расстояниеМеждуСоседнимиГоризонтальнымиПлоскостями = приближениеВычисления*наименьшаяВысота*cos(наибольшийОстрыйУгол)/(4*количествоВершинМеша);
  88. массивТочекГоризонтальнойПлоскости[3];
  89. текущаяВысотаПлоскости = получитьОрдинатуТочки(самаяНизкаяТочка);
  90. while (текущаяВысотаПлоскости < получитьОрдинатуТочки(самаяВысокаяТочка))
  91. {
  92. for (i = 0; i < 3; i++)
  93. {
  94. получитьАбсциссуТочки(массивТочекГоризонтальнойПлоскости[i]) = i;
  95. получитьОрдинатуТочки(массивТочекГоризонтальнойПлоскости[i]) = текущаяВысотаПлоскости;
  96. получитьАппликатуТочки(массивТочекГоризонтальнойПлоскости[i]) = i;
  97. }
  98. текущаяГоризантальаяПлоскость(массивТочекГоризонтальнойПлоскости[0], массивТочекГоризонтальнойПлоскости[1], массивТочекГоризонтальнойПлоскости[2]);
  99. for (it = началоКарты(картаРебер); it != конецКарты(картаРебер); it++)
  100. {
  101. позицияПервойВершины = получитьВершину(мешТеррейна, получитьИндексВершины(мешТеррейна, получитьИндексПервогоКонцаРебра(получитьРебро(it))));
  102. позицияВторойВершины = получитьВершину(мешТеррейна, получитьИндексВершины(мешТеррейна, получитьИндексВторогоКонцаРебра(получитьРебро(it))));
  103. точкаПересеченияРебраСГоризонтальнойПлоскостью;
  104. if (получитьТочкуПересеченияПлоскостиСТочкой(текущаяГоризонтальнаяПлоскость, позицияПервойВершины, позицияВторойВершины, точкаПересеченияРебраСГоризонтальнойПлоскостью))
  105. {
  106. дополнительнаяВершинаВторогоТипа(точкаПересеченияРебраСГоризонтальнойПлоскостью, false);
  107. добавитьВершину(навМеш, дополнительнаяВершинаВторогоТипа);
  108. }
  109. }
  110. текущаяВысотаПлоскости += расстояниеМеждуСоседнимиГоризонтальнымиПлоскостями;
  111. }
  112.  
  113. количествоВершинГрафа = получитьКоличествоВершинВГрафе(навМеш);
  114. for ( i = 0; i < количествоВершинГрафа; i++)
  115. {
  116. for ( j = 0; j < количествоВершинГрафа; j++)
  117. {
  118. if (i = j)
  119. продолжаем;
  120. for ( k = 0; k < количествоТреугольниковМеша; k++)
  121. if (принадлежитЛиОтрезокИзТочекТреугольнику(получитьПозициюВершины(получитьВершиныГрафа(i)), получитьПозициюВершины(получитьВершиныГрафа(j)), массивТреугольниковМеша[k]))
  122. {
  123. добавитьСоседа(навМеш, i, j);
  124. добавитьСоседа(навМеш, j, i);
  125. добавитьРебро(навМеш, i, j);
  126. }
  127. }
  128. }
  129.  
  130. записатьГрафВФайл(имяВыходногоФайла, навМеш);
  131. }
Advertisement
Add Comment
Please, Sign In to add comment