Построение квазиразверток на основе энергетических функций, страница 4


Графическое представление результатов: в пространстве

В плоскости XY с наложением начальной сетки:



Тот же тест, но параметр c=100:


*****************************************************************

В качестве 2-го теста  была взята 1/8 часть сферы.

Ниже представлены виды начальной модели и развертки в пространстве и на плоскости.




Выводы.

Видно, что в случае первой модели местоположение узлов левого нижнего угла почти не изменилось, в отличие от предыдущего случая, что и ожидалось, так как при меньшем коэффициенте С – коэффициенте отталкивания и силы натяжения эти узлы будут меньше подталкиваться узлами правого верхнего угла, имеющими большее равновесное расстояние.

Также видно, что в целом деформация сетки носит значительно менее глубокий характер, что также объяснимо – энергия сдвига значительно увеличила свой вклад и узел предпочитает больше «терпеть» некоторые увеличения энергий, связанные с отталкиванием и натяжением, нежели нести серьезные увеличения энергии сдвига, в результате сдвигов в сетке.

Можно сделать вывод, что развертки адекватны физическим представлениям ситуации.


Приложение 1.

Листинг программы.

static int sos[maxsize][4], num_s[maxsize], type_s[maxsize];

ofstream file3;

struct point

{

float x;

float y;

float z;

};

float f(float x, float y, float z, int i, point *list_p);

void main()

{

float z, func;

point *list_p;

int m;

clrscr();

//Считывание координат из файла

char *source;

ifstream inFile;

inFile.open("COORDS.DAT");

source="COORDS.DAT";

if (!inFile)

{

cerr << "\n Error. File "<< source <<" can't open.";

}

char next;

int end;

int i=0;

inFile>>end;

for (int j=0; j<=(end-1); j++)

{

if (next==EOF) break;

next = inFile.peek();

inFile>>list_p[j].x;

next = inFile.peek();

inFile>>list_p[j].y;

next = inFile.peek();

inFile>>list_p[j].z;

}

inFile.close();

//Считывание количества соседей из файла

ifstream inFile_2;

inFile_2.open("NUM_S.DAT");

source="NUM_S.DAT";

if (!inFile_2)

{

cerr << "\n Error. File "<< source <<" can't open.";

}

i=0;

for (j=0; j<=(end-1); j++)

{

if (next==EOF) break;

inFile_2>>num_s[j];

next = inFile_2.peek();

}

inFile_2.close();

//Считывание номеров соседей из файла

ifstream inFile_1;

inFile_1.open("SOSEDI.DAT");

source="SOSEDI.DAT";

if (!inFile_1)

{

cerr << "\n Error. File "<< source <<" can't open.";

}

i=0;

while (i<=(end-1))

{

if (next==EOF) break;

for (j=1; j<=num_s[i]; j++)

{

if (next==EOF) break;

inFile_1>>sos[i][j];

next = inFile_1.peek();

}

i++;

}

// Считывание параметров

ifstream inFile_3;

inFile_3.open("PARAMS.DAT");

source="PARAMS.DAT";

if (!inFile_3)

{

cerr << "\n Error. File "<< source <<" can't open.";

}

next = inFile_3.peek();

if (next==EOF)

{

cout<<"\n File PARAMS.DAT isn't write1";

exit(0);

}

inFile_3>>c;

next = inFile_3.peek();

if (next==EOF)

{

cout<<"\n File PARAMS.DAT isn't write2";

exit(0);

}

inFile_3>>k1;

next = inFile_3.peek();

if (next==EOF)

{

cout<<"\n File PARAMS.DAT isn't write3";

exit(0);

}

inFile_3>>m;

inFile_3.close();

//Подготовка файла с результатами к наполнению

ofstream file2;

file2.open("RESULTS.DAT");

if (!file2)

{

cerr << "\n Error. File "<< "results.dat" <<" can't open.";

}

file3.open("BETW.DAT");

if (!file3)

{

cerr << "\n Error. File "<< "betw.dat" <<" can't open.";

}

ifstream inFile_4;