Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- построитьГраф(консольныеАргументы)
- {
- if (получитьКоличествоКонсольныхАргументов(консольныеАргументы) < 3)
- исключение;
- имяВходногоФайла = консольныеАргументы[0];
- имяВыходногоФайла = консольныеАргументы[1];
- сценаТеррейна;
- if (!загрузитьСцену(имяВходногоФайла, сценаТеррейна))
- исключение;
- if (!существуетЛиФайлСИменем(имяВыходногоФайла))
- исключение;
- мешТеррейна = получитьМешПоИмени(сценаТеррейна, имяМеша);
- перевестиВсеВершиныТеррейнаВМировоеПространство(мешТеррейна);
- картаРебер;
- получитьРебраМеша(мешТеррейна, картаРебер);
- приближениеВычисления = консольныеАргументы[2];
- считатьЛиУгол = true;
- наибольшийОстрыйУгол = -1;
- наименьшаяВысотаТреугольниковМеша = -1;
- количествоВершинМеша = получитьКоличествоВершинВМеше(мешТеррейна);
- навМеш;
- самаяНизкаяТочка(0, БЕСКОНЕЧНОСТЬ, 0);
- самаяВысокаяТочка(0, -БЕСКОНЕЧНОСТЬ, 0);
- for (i = 0; i < количествоВершинМеша; i++)
- {
- позицияВершины = получитьВершину(мешТеррейна, i);
- вершинаГрафа(позицияВершины, true);
- добавитьВершину(навМеш, вершинаГрафа);
- for (it = началоКарты(картаРебер); it != конецКарты(картаРебер); it++)
- {
- позицияПервойВершины = получитьВершину(мешТеррейна, получитьИндексВершины(мешТеррейна, получитьИндексПервогоКонцаРебра(получитьРебро(it))));
- позицияВторойВершины = получитьВершину(мешТеррейна, получитьИндексВершины(мешТеррейна, получитьИндексВторогоКонцаРебра(получитьРебро(it))));
- массивТочекПлоскости;
- for (j = 0; j < 3; j++)
- {
- получитьАбсциссуТочки(массивТочекПлоскости[j]) = j;
- получитьОрдинатуТочки(массивТочекПлоскости[j]) = получитьОрдинатуТочки(позицияВершины);
- получитьАппликатуТочки(массивТочекПлоскости[j]) = ;
- }
- горизонтальнаяПлоскость(массивТочекПлоскости[0], массивТочекПлоскости[1], массивТочекПлоскости[2]);
- точкаПересеченияРебраСГоризонтальнойПлоскостью;
- if (получитьТочкуПересеченияПлоскостиСТочкой(горизонтальнаяПлоскость, позицияПервойВершины, позицияВторойВершины, точкаПересеченияРебраСГоризонтальнойПлоскостью))
- {
- дополнительнаяВершинаПервогоТипа(точкаПересеченияРебраСГоризонтальнойПлоскостью, false);
- добавитьВершину(навМеш, дополнительнаяВершинаПервогоТипа);
- }
- if (считатьЛиУгол)
- if (!вертикаленЛиОтрезокИзТочек(позицияПервойВершины, позицияВторойВершины))
- {
- уголМеждуВертикальюИОтрезкомИзТочек = найтиУголМеждуВертикальюИОтрезкомИзТочек(позицияПервойВершины, позицияВторойВершины);
- if (уголМеждуВертикальюИОтрезкомИзТочек > наибольшийОстрыйУгол)
- наибольшийОстрыйУгол = уголМеждуВертикальюИОтрезкомИзТочек;
- }
- if ((i = 0) и (++it) == конецКарты(картаРебер))
- считатьЛиУгол = false;
- it--;
- }
- if (получитьОрдинатуТочки(получитьВершину(мешТеррейна, i)) < получитьОрдинатуТочки(самаяНизкаяТочка))
- самаяНизкаяТочка = получитьВершину(мешТеррейна, i);
- if (получитьОрдинатуТочки(получитьВершину(мешТеррейна, i)) > получитьОрдинатуТочки(самаяВысокаяТочка))
- самаяВысокаяТочка = получитьВершину(мешТеррейна, i);
- }
- массивТреугольниковМеша = получитьМассивТреугольниковМеша(мешТеррейна);
- количествоТреугольниковМеша = получитьКоличествоТреугольниковВМеше(мешТеррейна);
- наименьшаяВысота = БЕСКОНЕЧНОСТЬ;
- for (i = 0; i < количествоТреугольниковМеша; i++)
- {
- for (j = 0; j < 3; j++)
- {
- текущаяВысота = получитьВысотуТреугольника(массивТреугольниковМеша[i], j);
- if (текущаяВысота < наименьшаяВысота)
- наименьшаяВысота = текущаяВысота;
- }
- }
- расстояниеМеждуСоседнимиГоризонтальнымиПлоскостями = приближениеВычисления*наименьшаяВысота*cos(наибольшийОстрыйУгол)/(4*количествоВершинМеша);
- массивТочекГоризонтальнойПлоскости[3];
- текущаяВысотаПлоскости = получитьОрдинатуТочки(самаяНизкаяТочка);
- while (текущаяВысотаПлоскости < получитьОрдинатуТочки(самаяВысокаяТочка))
- {
- for (i = 0; i < 3; i++)
- {
- получитьАбсциссуТочки(массивТочекГоризонтальнойПлоскости[i]) = i;
- получитьОрдинатуТочки(массивТочекГоризонтальнойПлоскости[i]) = текущаяВысотаПлоскости;
- получитьАппликатуТочки(массивТочекГоризонтальнойПлоскости[i]) = i;
- }
- текущаяГоризантальаяПлоскость(массивТочекГоризонтальнойПлоскости[0], массивТочекГоризонтальнойПлоскости[1], массивТочекГоризонтальнойПлоскости[2]);
- for (it = началоКарты(картаРебер); it != конецКарты(картаРебер); it++)
- {
- позицияПервойВершины = получитьВершину(мешТеррейна, получитьИндексВершины(мешТеррейна, получитьИндексПервогоКонцаРебра(получитьРебро(it))));
- позицияВторойВершины = получитьВершину(мешТеррейна, получитьИндексВершины(мешТеррейна, получитьИндексВторогоКонцаРебра(получитьРебро(it))));
- точкаПересеченияРебраСГоризонтальнойПлоскостью;
- if (получитьТочкуПересеченияПлоскостиСТочкой(текущаяГоризонтальнаяПлоскость, позицияПервойВершины, позицияВторойВершины, точкаПересеченияРебраСГоризонтальнойПлоскостью))
- {
- дополнительнаяВершинаВторогоТипа(точкаПересеченияРебраСГоризонтальнойПлоскостью, false);
- добавитьВершину(навМеш, дополнительнаяВершинаВторогоТипа);
- }
- }
- текущаяВысотаПлоскости += расстояниеМеждуСоседнимиГоризонтальнымиПлоскостями;
- }
- количествоВершинГрафа = получитьКоличествоВершинВГрафе(навМеш);
- for ( i = 0; i < количествоВершинГрафа; i++)
- {
- for ( j = 0; j < количествоВершинГрафа; j++)
- {
- if (i = j)
- продолжаем;
- for ( k = 0; k < количествоТреугольниковМеша; k++)
- if (принадлежитЛиОтрезокИзТочекТреугольнику(получитьПозициюВершины(получитьВершиныГрафа(i)), получитьПозициюВершины(получитьВершиныГрафа(j)), массивТреугольниковМеша[k]))
- {
- добавитьСоседа(навМеш, i, j);
- добавитьСоседа(навМеш, j, i);
- добавитьРебро(навМеш, i, j);
- }
- }
- }
- записатьГрафВФайл(имяВыходногоФайла, навМеш);
- }
Advertisement
Add Comment
Please, Sign In to add comment