Дипломная работа студента 545 группы - страница 7


for (i = 0; i < (*vertex_num); i++)

{

indat >> (*pol)[i].x;

indat >> (*pol)[i].y;

}


/* Read number of holes. */

indat >> ch;

indat >> (*hol_num);


/* Allocate memory for array of holes and hol_ver_num Дипломная работа студента 545 группы - страница 7. */

(*hol_vert_num) = (int *)malloc((*hol_num) * sizeof(int));

(*holes) = (vertex **)malloc((*hol_num) * sizeof(vertex *));

for (i = 0; i < (*hol_num); i++)

{

indat >> (*hol_vert_num)[i];

/* Allocate memory for each hole Дипломная работа студента 545 группы - страница 7. */

(*holes)[i] = (vertex *)malloc((*hol_vert_num)[i] *

sizeof(vertex *));

for (j = 0; j < (*hol_vert_num)[i]; j++)

{

/* Read verticies if i hole. */

indat >> (*holes)[i][j].x;

indat >> (*holes)[i][j Дипломная работа студента 545 группы - страница 7].y;

}

/* Skip separating symbol. */

if (i != ((*hol_num) - 1))

indat >> ch;

}

indat.close();

return;

}


/* Print out verticies of some polygon

*

* pol Pointer to the array of verteces

* vertex_num Number of vertices in polygon

*/

void print Дипломная работа студента 545 группы - страница 7_pol(vertex *pol, int vertex_num)

{

int i;


std::cout << "\nPolygon have " << vertex_num

<< " verticies\n";

for (i = 0; i < vertex_num; i++)

std::cout << (i + 1) << ") (" << pol[i].x <<", " << pol[i].y

<< ")\n Дипломная работа студента 545 группы - страница 7";

return;

}


/* Determine distance between two points

*

* a Point

* b Point

*

* return distance from a to b

*/

float dist_p(vertex a, vertex b)

{

return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));

}


/* Determine distance from Дипломная работа студента 545 группы - страница 7 a point to an edge

*

* a End of the edge

* b End of the edge

* pnt Point

* t Pointer to the coefficient of the point that lies on the edge

* [a, b] and distace from which to the Дипломная работа студента 545 группы - страница 7 pnt is equal to the returning

* value (OUT)

*

* return distance from pnt to the edge [a, b]

*/

float dist_edge(vertex a, vertex b, vertex pnt, float *t)

,


/* Determine distance from a Дипломная работа студента 545 группы - страница 7 point to a polygon

*

* pol Pointer to the array of verteces

* vertex_num Number of vertices in polygon

* pnt Point

*

* return distance from the point to the polygon

*/

float dist_pol(vertex *pol, int vertex_num, vertex Дипломная работа студента 545 группы - страница 7 pnt)

{

int i;

float d;


for (i = 0; i < vertex_num; i++)

if (i)

{

if (d > dist_edge(pol[i], pol[((i + 1) % vertex_num)], pnt,

NULL))

d = dist_edge(pol[i], pol[((i + 1) % vertex Дипломная работа студента 545 группы - страница 7_num)],

pnt, NULL);

}

else

d = dist_edge(pol[i], pol[((i + 1) % vertex_num)], pnt,

NULL);


return d;

}


/* Determine distance from point to polygon with holes

*

* pol Pointer to the array of Дипломная работа студента 545 группы - страница 7 verteces

* vertex_num Number of vertices in polygon

* holes Pointer to the array of holes

* hol_num Number of holes

* hol_vert_num Pointer the the array of verteces numbers

* pnt Point

*

* return distance from the point to the Дипломная работа студента 545 группы - страница 7 polygon with holes

*/

float comb_dist_pol(vertex *pol, int vertex_num, vertex **holes,

int hol_num, int *hol_vert_num, vertex pnt)

{

int i;

float d = dist_pol(pol, vertex_num, pnt);


for (i Дипломная работа студента 545 группы - страница 7 = 0; i < hol_num; i++)

if( d > dist_pol(holes[i], hol_vert_num[i], pnt))

d = dist_pol(holes[i], hol_vert_num[i], pnt);


return d;

}


/* Determine next Дипломная работа студента 545 группы - страница 7 nearest point on the bound of a polygon to a point

*

* pol Pointer to the array of verteces

* vertex_num Number of vertices in polygon

* from Pointer to the place from which the search should starts

* (IN Дипломная работа студента 545 группы - страница 7/OUT)

* fp Fragmentation points (OUT)

* dist Distance from the polygon to the pnt

* pnt Point

*

* return true if next nearest point have been founded

*/

bool next_near(vertex *pol, int vertex_num, int *from, fragm Дипломная работа студента 545 группы - страница 7_p *fp,

float dist, vertex pnt)

{

int i;

float t = 0;

for (i = *from; i < vertex_num; i++)

if (eq(dist, dist_edge(pol[i], pol[((i + 1) % vertex_num)], pnt,

&t)))

{

if (t == 1)

continue;


*from Дипломная работа студента 545 группы - страница 7 = (i + 1);

(*fp).num = i;

(*fp).t = t;

return true;

}


return false;

}


/* Print fragmentation point

*

* pol Pointer to the array of verteces

* vertex_num Number of vertices in polygon

* fp Array of the fragmentation points

* fp_num Дипломная работа студента 545 группы - страница 7 Number of the fragmentation points

*/

void print_fragm_p(vertex *pol, int vertex_num, fragm_p *fp, int fp_num)

{

int i;

vertex a;


std::cout << "Fragmantations points are: \n Дипломная работа студента 545 группы - страница 7";


for (i = 0; i < fp_num; i++)

{

a.x = pol[fp[i].num].x + fp[i].t *

(pol[(fp[i].num + 1) % vertex_num].x - pol[fp[i].num].x);

a.y = pol Дипломная работа студента 545 группы - страница 7[fp[i].num].y + fp[i].t *

(pol[(fp[i].num + 1) % vertex_num].y - pol[fp[i].num].y);

std::cout << (i + 1) << ") (" << a.x << ", " << a.y

<< ") colour = " << fp[i].col << "\n";

}

return;

}


/* Check that the first Дипломная работа студента 545 группы - страница 7 fragmentation point lies on the bound before the

* second if we walk by the bound of the polygon in clockwise order

*

* a Fragmentation point

* b Fragmentation point

*

*return true if the first fragmentation Дипломная работа студента 545 группы - страница 7 point lies on the bound before the

* second if we walk by the bound of the polygon in clockwise order

*/

bool sml_fp(fragm_p a, fragm_p b)

{

if (a.num Дипломная работа студента 545 группы - страница 7 < b.num)

return true;


if (b.num < a.num)

return false;


if (a.t < b.t)

return true;


return false;

}


/* Sorting of fragmentation points

*

* fp Pointer to the array of the fragmentation point Дипломная работа студента 545 группы - страница 7 (IN/OUT)

* fp_num Number of the fragmentation points

*/

void sort_fp(fragm_p **fp, int fp_num)

{

fragm_p tmp_fp;

int i;

int j;


for (i = fp_num; i > 0; i--)

for (j Дипломная работа студента 545 группы - страница 7 = 0; j < (i - 1); j++)

if (sml_fp((*fp)[(j + 1)], (*fp)[j]))

{

tmp_fp.col = (*fp)[(j + 1)].col;

tmp_fp.num = (*fp)[(j + 1)].num;

tmp_fp.t = (*fp)[(j + 1)].t;


(*fp)[(j + 1)].col = (*fp)[j Дипломная работа студента 545 группы - страница 7].col;

(*fp)[(j + 1)].num = (*fp)[j].num;

(*fp)[(j + 1)].t = (*fp)[j].t;


(*fp)[j].col = tmp_fp.col;

(*fp)[j].num = tmp_fp.num;

(*fp)[j].t = tmp_fp.t Дипломная работа студента 545 группы - страница 7;

}


return;

}


/* Distance from one point to another along the bound

*

* pol Pointer to the array of verteces

* vertex_num Number of vertices in polygon

* from Fragmentation point

* to Fragmentation point

*

* return distance from one point to another Дипломная работа студента 545 группы - страница 7 along the bound

*/

float dist_bnd(vertex *pol, int vert_num, fragm_p from, fragm_p to)

{

int i;

float d;


if (from.num == to.num)

{

/* If points are equal return 0 */

if Дипломная работа студента 545 группы - страница 7 (eq(from.t, to.t))

return 0;


/* Case when points lies on one edge */

if (to.t > from.t)

return (to.t - from.t) *

dist_p(pol[from.num], pol[((from.num + 1) % vert_num)]);

}


/* Calculate distance Дипломная работа студента 545 группы - страница 7 of the 'rest' of the edge after from */

d = (1 - from.t) * dist_p(pol[from.num],

pol[((from.num + 1) % vert_num)]);

i = from.num + 1;

while (true)

{

if ((i % vert_num) == to.num Дипломная работа студента 545 группы - страница 7)

return d + to.t * dist_p(pol[i % vert_num],

pol[(i + 1)% vert_num]);

/* Add length of each edge which lies between egdes containing

From and to */

d += dist_p(pol[i Дипломная работа студента 545 группы - страница 7 % vert_num], pol[(i + 1)% vert_num]);

i++;

}

}


/* Set colours for fragmentation points

*

* fp Pointer to the array of the fragmentation points (IN/OUT)

* fp_num Number of the fragmentation points

* sc Scale of notation for Дипломная работа студента 545 группы - страница 7 this colours

*/

void set_col(fragm_p **fp, int fp_num, int sc)

{

int c;

int c1;

int i = 1;


if (fp_num == 0)

return;


c = (*fp)[0].col;

for (i = 1; i < (fp_num Дипломная работа студента 545 группы - страница 7 + 1); i++)

{

c1 = (*fp)[(i % fp_num)].col;

(*fp)[(i % fp_num)].col += sc * c;

c = c1;

}


return;

}


/* Calculate the colour for fragment of the bound

*

* a Source fragmentation point of the fragment

* b Target Дипломная работа студента 545 группы - страница 7 fragmentation point of the fragment

* cm_fp Array of combined fragmentation points

* fp_num Number of combined fragmentation points

* pol Pointer to the array of verteces

* vertex_num Number of vertices in polygon

*

* return colour of Дипломная работа студента 545 группы - страница 7 this fragment

*/

int fragm_col(fragm_p a, fragm_p b, fragm_p *cm_fp, int fp_num,

vertex *pol, int vert_num)

{

int i;

int bgn = -1;

int end = -1;

float d;

int nmb;


/* Chect Дипломная работа студента 545 группы - страница 7 the order of the source and target points */

if (sml_fp(a, b))

{

/* Determine the first and the last combined fragmentation points

from the combined fragmentation points which lies between a

and b

*/

for (i Дипломная работа студента 545 группы - страница 7 = 0; i < fp_num; i++)

{

if ((bgn == -1) && sml_fp(a, cm_fp[i]) && sml_fp(cm_fp[i], b))

bgn = i;

if (sml_fp(b, cm_fp[i]))

{

end = i;

break;

}

}

/* Return Дипломная работа студента 545 группы - страница 7 colour in case that noone combined fragmentation point

lies between a and b*/

if ((bgn == -1))

{

if (end == -1)

return cm_fp[0].col;

else

return cm_fp[end].col;

}

else

{

/* Calculate the prevalent colour on the fragment */

if Дипломная работа студента 545 группы - страница 7 (end == -1)

end = fp_num;

d = dist_bnd(pol, vert_num, a, cm_fp[bgn]);

nmb = bgn;

for (i = (bgn + 1); i < end; i++)

if (d < dist_bnd(pol, vert_num, cm_fp[i - 1], cm Дипломная работа студента 545 группы - страница 7_fp[i]))

{

d = dist_bnd(pol, vert_num, cm_fp[i - 1], cm_fp[i]);

nmb = i;

}

if (d < dist_bnd(pol, vert_num, cm_fp[(end - 1)], b))

return cm_fp Дипломная работа студента 545 группы - страница 7[(end % fp_num)].col;

return cm_fp[nmb].col;

}

}

else

{

/* Determine the first and the last combined fragmentation points

from the combined fragmentation points which lies between a

and b

*/

for (i = 0; i < fp_num; i Дипломная работа студента 545 группы - страница 7++)

{

if ((end == -1) && sml_fp(b, cm_fp[i]))

end = i;

if (sml_fp(a, cm_fp[i]))

{

bgn = i;

break;

}

}


/* Calculate the prevalent colour on the fragment */

if (bgn == -1)

{

if (end == -1)

{

d Дипломная работа студента 545 группы - страница 7 = dist_bnd(pol, vert_num, a, cm_fp[0]) +

dist_bnd(pol, vert_num, cm_fp[(fp_num - 1)], b);

nmb = 0;

for (i = 1; i < fp_num; i++)

if (d < dist_bnd(pol, vert_num, cm_fp Дипломная работа студента 545 группы - страница 7[i - 1], cm_fp[i]))

{

d = dist_bnd(pol, vert_num, cm_fp[i - 1], cm_fp[i]);

nmb = i;

}

return cm_fp[nmb].col;

}

else

{

d = dist_bnd(pol, vert_num, a, cm_fp[0]);

nmb Дипломная работа студента 545 группы - страница 7 = 0;

for (i = 1; i < end; i++)

if (d < dist_bnd(pol, vert_num, cm_fp[i - 1], cm_fp[i]))

{

d = dist_bnd(pol, vert_num, cm_fp[i - 1], cm_fp[i]);

nmb Дипломная работа студента 545 группы - страница 7 = i;

}

if (d < dist_bnd(pol, vert_num, cm_fp[(end - 1)], b))

return cm_fp[end].col;

return cm_fp[nmb].col;

}

}

else

{

if (bgn == end)

{

d = dist_bnd(pol, vert Дипломная работа студента 545 группы - страница 7_num, a, cm_fp[bgn]) +

dist_bnd(pol, vert_num,

cm_fp[(bgn + fp_num - 1) % fp_num], b);

nmb = bgn;

for (i = bgn; i < (bgn + fp_num - 1); i++)

if (d < dist_bnd(pol, vert_num Дипломная работа студента 545 группы - страница 7, cm_fp[i % fp_num],

cm_fp[(i + 1)% fp_num]))

{

d = dist_bnd(pol, vert_num, cm_fp[i % fp_num],

cm_fp[(i + 1)% fp_num]);

nmb = (i + 1)% fp Дипломная работа студента 545 группы - страница 7_num;

}

return cm_fp[nmb].col;

}

else

{

d = dist_bnd(pol, vert_num, a, cm_fp[bgn]);

nmb = bgn;

for (i = bgn; i < (end + fp_num - 1); i++)

if (d < dist_bnd(pol, vert_num, cm_fp Дипломная работа студента 545 группы - страница 7[i % fp_num],

cm_fp[(i + 1)% fp_num]))

{

d = dist_bnd(pol, vert_num, cm_fp[i % fp_num],

cm_fp[(i + 1)% fp_num]);

nmb = (i + 1)% fp_num;

}

if (d < dist_bnd Дипломная работа студента 545 группы - страница 7(pol, vert_num,

cm_fp[(end + fp_num - 1) % fp_num], b))

return cm_fp[end].col;

return cm_fp[nmb].col;

}

}

}

}


/* Determine colour of polygon without fragmentation points

* pol Pointer to the Дипломная работа студента 545 группы - страница 7 array of verteces

* vertex_num Number of vertices in polygon

* fp Array of combined fragmentation points

* fp_num Number of combined fragmentation points

*

* return the colour of the polygon

*/

int pol_col(vertex *pol, int vert Дипломная работа студента 545 группы - страница 7_num, fragm_p *fp, int fp_num)

{

fragm_p tmp_fp1;

fragm_p tmp_fp2;


tmp_fp1.num = 0;

tmp_fp1.t = 0;

tmp_fp2.num = (vert_num - 1);

tmp_fp2.t = 1 - (EPS);


return fragm_col(tmp Дипломная работа студента 545 группы - страница 7_fp1, tmp_fp2, fp, fp_num, pol, vert_num);

}


/* Save calculated information to the file

*

* pol Pointer to the array of verteces

* vertex_num Number of vertices in polygon

* holes Pointer to the Дипломная работа студента 545 группы - страница 7 array of holes

* hol_num Number of holes

* hol_vert_num Pointer the the array of verteces numbers

* fp_pol Array of polygon fragmentation points

* fp_pol_num Number of polygon fragmentation points

* fp_hol Array of holes fragmentation Дипломная работа студента 545 группы - страница 7 points

* fp_hol_num Array of the numbers of holes fragmentation points

* fp_pol Array of combined polygon fragmentation points

* fp_pol_num Number of combined polygon fragmentation points

* fp_hol Array of Дипломная работа студента 545 группы - страница 7 combined holes fragmentation points

* fp_hol_num Array of the numbers of combined holes fragmentation points

*/

void save_pol(vertex *pol, int vert_num,

vertex **holes, int hol_num, int *hol_vert_num,

fragm_p *fp_pol Дипломная работа студента 545 группы - страница 7, int fp_pol_num,

fragm_p **fp_hol, int *fp_hol_num,

fragm_p *cm_fp_pol, int cm_fp_pol_num,

fragm_p **cm_fp_hol, int *cm Дипломная работа студента 545 группы - страница 7_fp_hol_num)

{

int i;

int j;

int k;

int bgn;

int end;

int col;

std::ofstream outdat("data/out.dt");

assert(outdat);


/* Save coordinates of the first point */

outdat << vert_num Дипломная работа студента 545 группы - страница 7 << "\n";

outdat << pol[0].x << " " << pol[0].y << "\n";

if (fp_pol_num < 2)

{

/* If there are no fragmentation points or only one return one

colour for each edge

*/

col = pol_col(pol, vert_num, cm_fp_pol, cm_fp Дипломная работа студента 545 группы - страница 7_pol_num);

for (i = 1; i < vert_num; i++)

{

outdat << pol[i].x << " " << pol[i].y << "\n";

outdat << 0 << " " << col << "\n";

}

/* Insert special symbol "ZZZ" */

outdat << "ZZZ\n";

outdat << 0 << " " << col << "\n Дипломная работа студента 545 группы - страница 7";

}

else

{

for (i = 1; i < vert_num; i++)

{

bgn = -1;

end = -1;

outdat << pol[i].x << " " << pol[i].y << "\n";

/* For each edge determine the first and the last fragmentation point it contains */

for (j = 0; j < fp_pol Дипломная работа студента 545 группы - страница 7_num; j++)

{

if ((bgn == -1) && (fp_pol[j].num == (i - 1)))

bgn = j;

if (fp_pol[j].num > (i - 1))

{

end = j;

break;

}

}

if (bgn == -1)

{

/* In case that no fragmentation point lies on the edge the Дипломная работа студента 545 группы - страница 7 colour of the edge will be the colour of the next after the edge fragmentation point */

if (end == -1)

end = 0;

outdat << 0 << " " << fp_pol[end].col << "\n";

}

else

{

/* This case is for situation when there Дипломная работа студента 545 группы - страница 7 are some

(at least one) fragmentation points on the edge

*/

if (end == -1)

end = fp_pol_num;

outdat << (end - bgn) << " ";

for (j = bgn; j < end; j++)

outdat << fp_pol[j].col << " " << fp_pol Дипломная работа студента 545 группы - страница 7[j].t << " ";

outdat << fp_pol[end % fp_pol_num].col << "\n";

}

}

/* Insert special symbol "ZZZ" */

outdat << "ZZZ\n";

/* Do the same operations for the last edge of the polygon */

bgn = -1;

end Дипломная работа студента 545 группы - страница 7 = -1;

for (j = 0; j < fp_pol_num; j++)

if (fp_pol[j].num == (vert_num - 1))

{

bgn = j;

break;

}


if (bgn == -1)

outdat << 0 << " " << fp_pol[0].col << "\n";

else

{

outdat << (fp_pol_num - bgn) << " ";

for (j = bgn; j < fp_pol Дипломная работа студента 545 группы - страница 7_num; j++)

outdat << fp_pol[j].col << " " << fp_pol[j].t << " ";

outdat << fp_pol[0].col << "\n";

}

}


/* Do all previous for the each hole */

for (k = 0; k < hol_num; k Дипломная работа студента 545 группы - страница 7++)

{

outdat << "*\n";

if (k == 0)

outdat << hol_num << "\n";


outdat << hol_vert_num[k] << "\n";

outdat << holes[k][0].x << " " << holes[k][0].y << "\n";

if (fp_hol_num[k] < 2)

{

/* If there are no fragmentation points or Дипломная работа студента 545 группы - страница 7 only one return one colour for each edge */

col = pol_col(holes[k], hol_vert_num[k], cm_fp_hol[k],

cm_fp_hol_num[k]);

for (i = 1; i < hol_vert_num Дипломная работа студента 545 группы - страница 7[k]; i++)

{

outdat << holes[k][i].x << " " << holes[k][i].y << "\n";

outdat << 0 << " " << col << "\n";

}

/* Insert special symbol "ZZZ" */

outdat << "ZZZ\n";

outdat << 0 << " " << col << "\n";

}

else

{

for (i = 1; i < hol_vert_num[k Дипломная работа студента 545 группы - страница 7]; i++)

{

bgn = -1;

end = -1;

outdat << holes[k][i].x << " " << holes[k][i].y <<

"\n";

/* For each edge determine the first and the last

fragmentation point it contains */

for (j = 0; j < fp_hol Дипломная работа студента 545 группы - страница 7_num[k]; j++)

{

if ((bgn == -1) && (fp_hol[k][j].num == (i - 1)))

bgn = j;

if (fp_hol[k][j].num > (i - 1))

{

end = j;

break;

}

}

if (bgn == -1)

{

/* In case that no fragmentation point lies Дипломная работа студента 545 группы - страница 7 on the edge the colour of the edge will be the colour of the next after the edge fragmentation point */

if (end == -1)

end = 0;

outdat << 0 << " " << fp_hol[k][end].col << "\n";

}

else

{

/* This case is Дипломная работа студента 545 группы - страница 7 for situation when there are some (at least one) fragmentation points on the edge */

if (end == -1)

end = fp_hol_num[k];

outdat << (end - bgn) << " ";

for (j = bgn; j < end; j++)

outdat << fp_hol Дипломная работа студента 545 группы - страница 7[k][j].col << " "

<< fp_hol[k][j].t << " ";

outdat << fp_hol[k][end % fp_hol_num[k]].col << "\n";

}

}

/* Insert special symbol "ZZZ" */

outdat << "ZZZ\n";


/* Do the same operations Дипломная работа студента 545 группы - страница 7 for the last edge of the hole */

bgn = -1;

end = -1;

for (j = 0; j < fp_hol_num[k]; j++)

if (fp_hol[k][j].num == (hol_vert_num[k] - 1))

{

bgn = j;

break;

}


if (bgn Дипломная работа студента 545 группы - страница 7 == -1)

outdat << 0 << " " << fp_hol[k][0].col << "\n";

else

{

outdat << (fp_hol_num[k] - bgn) << " ";

for (j = bgn; j < fp_hol_num[k]; j++)

outdat << fp_hol[k][j].col << " "

<< fp_hol[k][j].t << " ";

outdat << fp_hol Дипломная работа студента 545 группы - страница 7[k][0].col << "\n";

}

}

}


outdat.close();

return;

}



diplomatiya-stranica-13.html
diplomatiya-stranica-35.html
diplomi-2011.html