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

inFile_4.open("TYPE_S.DAT");

source="TYPE_S.DAT";

if (!inFile_4)

{

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

}

i=0;

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

{

if (next==EOF) break;

inFile_4>>type_s[j];

next = inFile_4.peek();

}

inFile_4.close();

//Расчет равновесного расстояния

float w1, w2, w3, ws;

i=0;

while (i<=(end-1))

{

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

{

w1=pow((list_p[i].x-list_p[sos[i][j]-1].x), 2);

w2=pow((list_p[i].y-list_p[sos[i][j]-1].y), 2);

w3=pow((list_p[i].z-list_p[sos[i][j]-1].z), 2);

ws=sqrt(w1+w2+w3);

w[i][j]=ws;

}

i++;

}

i=0;

float xf, yf, zf, xp, yp, zp, xm, ym, zm, min, min_l, max_en, max_w, min_p, ff;

int g, k, i_max, j_max, flag_s=0, i_n[maxsize], num_n=0, b, f_e=0, f_e3=0;

int f_e4;

//Обход всех точек с подсчетом энергии и выбором  точки с максимальной энергией.

cout<<"\nProcessing";

while (!flag_s)

{

g=0;

f_e3=0;

cout<<".";

// Выбираем начальную точку максимума

// Учет ситуации, когда длина массива с номерами узлов, неулучшающих свою

//   энергию = 0

if (num_n==0)

{

g=0;

f_e3=1;

}

// Иначе

while (!f_e3)

{

f_e4=0;

for (b=1; b<=num_n; b++)

{

if (g==i_n[b])

{

f_e4=1;

}

}

if (!f_e4)

{

f_e3=1;

}

else

{

f_e4=0;

g++;

}

}

max_en=f(list_p[g].x, list_p[g].y, 0, g, list_p);

file3<<"\n *********** new max_en="<<max_en<<"    i="<<g;

// Выбор узла с максимальной энергией

i_max=g;

g=0;

for (b=1; b<=num_n; b++)

{

file3<<"\ni_n["<<b<<"]="<<i_n[b];

}

while (g<=(end-1))

{

file3<<"\ng="<<g<<"....f="<<f(list_p[g].x, list_p[g].y, 0, g, list_p);

file3<<"  x="<<list_p[g].x<<"  y="<<list_p[g].y<<"  z="<<0;

g++;

}

//--------------------------------g=0;

while (g<=(end-1))

{

ff=f(list_p[g].x, list_p[g].y, 0, g, list_p);

if (max_en<ff)

{

for (b=1; b<=num_n; b++)

{

if (g==i_n[b])

{

f_e=1;

}

}

if (!f_e)

{

max_en=ff;

i_max=g;

}

f_e=0;

}

g++;

}

file3<<"\n -----------------max_en="<<max_en<<"         i="<<i_max;

//Поиск амплитуды изменения по x и y.

i=i_max;

max_w=w[i][1];

g=2;

while (g<=num_s[i])

{

if (max_w<w[i][g])

{

max_w=w[i][g];

}

g++;

}

//Минимизация

int fg=0;

randomize();

min=max_en;

xf=list_p[i].x;

yf=list_p[i].y;

xm=xf;

ym=yf;

k=0;

while(k<m)

{

if ((rand()*0.000030518509475997)<=0.5)

{

xp=xf+(float)(rand()*0.000030518509475997*max_w);

}

else

{

xp=xf-(float)(rand()*0.000030518509475997*max_w);

}

if ((rand()*0.000030518509475997)<=0.5)

{

yp=yf+(float)(rand()*0.000030518509475997*max_w);

}

else

{

yp=yf-(float)(rand()*0.000030518509475997*max_w);

}

min_p=f(xp, yp, 0, i, list_p);

if (min_p<min)

{

min=min_p;

xm=xp;

ym=yp;

}

k++;

}

min_l=min;

while(!fg)

{

k=0;

while(k<m)

{

if ((rand()*0.000030518509475997)<=0.5)

{

xp=xf+(float)(rand()*0.000030518509475997*max_w);

}

else

{

xp=xf-(float)(rand()*0.000030518509475997*max_w);

}

if ((rand()*0.000030518509475997)<=0.5)

{

yp=yf+(float)(rand()*0.000030518509475997*max_w);

}

else

{

yp=yf-(float)(rand()*0.000030518509475997*max_w);

}

min_p=f(xp, yp, 0, i, list_p);

if (min_p<min)

{

min=min_p;

xm=xp;

ym=yp;

}

k++;

}

if (min_l>min)

{

min_l=min;

}

else

{

fg=1;

}

}

if ((max_en*0.999)<=min)

{

num_n++;

i_n[num_n]=i_max;

}

else

{

num_n=0;

list_p[i_max].x=xm;

list_p[i_max].y=ym;

}

if (num_n==end)

{

g=0;

while (g<=(end-1))

{

file2<<"\n"<<g<<")  "<<list_p[g].x<<"     "<<list_p[g].y<<"     "<<0;