- Timestamp:
- 02/19/07 09:16:59 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Geom/shared/GTGeometry/src/libs/vmi/src/mesh.cpp
r2090 r2127 53 53 /////////////////////////////////////////////////////////////////////////////// 54 54 55 int VMI::findEdge(Edge *e, GLuint num, GLuint _u, GLuint _v) {56 GLuint i, u, v;55 int VMI::findEdge(Edge *e, int num, int _u, int _v) { 56 int i, u, v; 57 57 int found = -1; 58 58 … … 85 85 newList[*n].u = u; 86 86 newList[*n].v = v; 87 88 // This edge has no triangle adjancency89 newList[*n].numTriangles = 0;90 newList[*n].triangles = NULL;91 87 92 88 // Enable the new edge … … 102 98 } 103 99 100 double VMI::computeEdgeLength(Vertex *vertices, int u, int v) { 101 float ux, uy, uz, vx, vy ,vz, rx, ry, rz; 102 103 ux = vertices[u].x; 104 uy = vertices[u].y; 105 uz = vertices[u].z; 106 107 vx = vertices[v].x; 108 vy = vertices[v].y; 109 vz = vertices[v].z; 110 111 rx = ux - vx; 112 ry = uy - vy; 113 rz = uz - vz; 114 115 return sqrt((rx * rx) + (ry * ry) + (rz * rz)); 116 } 117 118 double VMI::computeTriangleVolume(Vertex *vertices, Triangle *t) { 119 int i; 120 double m[3][3], vol; 121 122 // Compute triangle Volume 123 i = t->indices[0]; 124 m[0][0] = mesh->vertices[i].x; 125 m[0][1] = mesh->vertices[i].y; 126 m[0][2] = mesh->vertices[i].z; 127 128 i = t->indices[1]; 129 m[1][0] = mesh->vertices[i].x; 130 m[1][1] = mesh->vertices[i].y; 131 m[1][2] = mesh->vertices[i].z; 132 133 i = t->indices[2]; 134 m[2][0] = mesh->vertices[i].x; 135 m[2][1] = mesh->vertices[i].y; 136 m[2][2] = mesh->vertices[i].z; 137 138 vol = computeMatDet(m); 139 140 //printf("Triangle Volume: %f\n", vol) 141 return vol; 142 } 143 104 144 GLdouble VMI::computeTriangleArea(Vertex *vertices, Triangle *t) { 105 GLuint i;145 int i; 106 146 GLdouble v0[3], v1[3], v2[3], a; 107 147 … … 129 169 130 170 void VMI::computeTriangleNormal(Vertex *vertices, Triangle *t) { 131 GLuint i;171 int i; 132 172 GLfloat x0, y0, z0, 133 173 x1, y1, z1, … … 175 215 Mesh *VMI::initMesh(GLMmodel* pmodel) { 176 216 177 GLuint i, j, curGroup, v1, v2, v3, n, m, t;217 int i, j, curGroup, v1, v2, v3, n, m, t; 178 218 int e; 179 219 Mesh *mesh; … … 202 242 203 243 printf("Adding vertices..."); 204 for (i=1; i<= pmodel->numvertices; i++) { // Vertices start at 1244 for (i=1; i<=(int)pmodel->numvertices; i++) { // Vertices start at 1 205 245 mesh->vertices[i - 1].x = pmodel->vertices[3 * i + 0]; 206 246 mesh->vertices[i - 1].y = pmodel->vertices[3 * i + 1]; … … 208 248 mesh->vertices[i - 1].numTriangles = 0; 209 249 mesh->vertices[i - 1].triangles = NULL; 250 mesh->vertices[i - 1].numEdges = 0; 251 mesh->vertices[i - 1].edges = NULL; 210 252 mesh->vertices[i - 1].enable = GL_TRUE; 211 253 } … … 221 263 while(group) { 222 264 223 for (i=0; i< group->numtriangles; i++) {265 for (i=0; i<(int)group->numtriangles; i++) { 224 266 225 267 t = group->triangles[i]; … … 244 286 // Reallocate memory for the new adjacent triangle 245 287 mesh->vertices[v1].triangles = 246 ( GLuint *)realloc(mesh->vertices[v1].triangles, (mesh->vertices[v1].numTriangles + 1) * sizeof(GLuint));288 (int *)realloc(mesh->vertices[v1].triangles, (mesh->vertices[v1].numTriangles + 1) * sizeof(int)); 247 289 addItem((int *)mesh->vertices[v1].triangles, (int *)&mesh->vertices[v1].numTriangles, t); 248 290 } … … 254 296 for (i=0; i<pmodel->numtriangles; i++) { 255 297 mesh->triangles[i].id = i; 256 mesh->triangles[i].indices[0] = pmodel->triangles[i].vindices[0] - 1;257 mesh->triangles[i].indices[1] = pmodel->triangles[i].vindices[1] - 1;258 mesh->triangles[i].indices[2] = pmodel->triangles[i].vindices[2] - 1;298 mesh->triangles[i].indices[0] = (int)pmodel->triangles[i].vindices[0] - 1; 299 mesh->triangles[i].indices[1] = (int)pmodel->triangles[i].vindices[1] - 1; 300 mesh->triangles[i].indices[2] = (int)pmodel->triangles[i].vindices[2] - 1; 259 301 mesh->triangles[i].area = computeTriangleArea(mesh->vertices, &mesh->triangles[i]); 260 302 //printf("\n%d a: %f",i , mesh->triangles[i].area); … … 271 313 // Reallocate memory for the new adjacent triangle 272 314 mesh->vertices[v1].triangles = 273 ( GLuint *)realloc(mesh->vertices[v1].triangles, (mesh->vertices[v1].numTriangles + 1) * sizeof(GLuint));315 (int *)realloc(mesh->vertices[v1].triangles, (mesh->vertices[v1].numTriangles + 1) * sizeof(int)); 274 316 addItem((int *)mesh->vertices[v1].triangles, (int *)&mesh->vertices[v1].numTriangles, i); 275 317 } … … 304 346 mesh->edges[n].u = v1; 305 347 mesh->edges[n].v = v2; 306 mesh->edges[n].triangles = NULL;307 mesh->edges[n].numTriangles = 0;308 348 mesh->edges[n].enable = GL_TRUE; 309 349 m = n; 310 350 n++; 311 351 } else m = e; 312 // Reallocate memory for the new adjacent triangle313 mesh->edges[m].triangles =314 (GLuint *)realloc(mesh->edges[m].triangles, (mesh->edges[m].numTriangles + 1) * sizeof(GLuint));315 // Adding triangle i adjacent to edge m316 addItem((int *)mesh->edges[m].triangles, (int *)&mesh->edges[m].numTriangles, i);317 //printf("n:%d i:%d\n", m, i);318 319 // Adding edge m adjacent to triangle i320 addItem((int *)mesh->triangles[i].edges, (int *)&t, m);321 352 322 353 ///////////////////////////////////////////////////////////////////////////////// … … 325 356 mesh->edges[n].u = v2; 326 357 mesh->edges[n].v = v3; 327 mesh->edges[n].triangles = NULL;328 mesh->edges[n].numTriangles = 0;329 358 mesh->edges[n].enable = GL_TRUE; 330 359 m = n; 331 360 n++; 332 361 } else m = e; 333 // Reallocate memory for the new adjacent triangle334 mesh->edges[m].triangles =335 (GLuint *)realloc(mesh->edges[m].triangles, (mesh->edges[m].numTriangles + 1) * sizeof(GLuint));336 // Adding triangle i adjacent to edge m337 addItem((int *)mesh->edges[m].triangles, (int *)&mesh->edges[m].numTriangles, i);338 //printf("n:%d i:%d\n", m, i);339 340 // Adding edge m adjacent to triangle i341 addItem((int *)mesh->triangles[i].edges, (int *)&t, m);342 362 343 363 ///////////////////////////////////////////////////////////////////////////////// … … 346 366 mesh->edges[n].u = v3; 347 367 mesh->edges[n].v = v1; 348 mesh->edges[n].triangles = NULL;349 mesh->edges[n].numTriangles = 0;350 368 mesh->edges[n].enable = GL_TRUE; 351 369 m = n; 352 370 n++; 353 371 } else m = e; 354 // Reallocate memory for the new adjacent triangle355 mesh->edges[m].triangles =356 (GLuint *)realloc(mesh->edges[m].triangles, (mesh->edges[m].numTriangles + 1) * sizeof(GLuint));357 // Adding triangle i adjacent to edge m358 addItem((int *)mesh->edges[m].triangles, (int *)&mesh->edges[m].numTriangles, i);359 //printf("n:%d i:%d\n", m, i);360 361 // Adding edge m adjacent to triangle i362 addItem((int *)mesh->triangles[i].edges, (int *)&t, m);363 372 } 364 373 printf("Ok\n"); 365 374 mesh->numEdges = n; 366 375 376 for (i=0; i<mesh->numEdges; i++) { 377 v1 = mesh->edges[i].u; 378 v2 = mesh->edges[i].v; 379 380 mesh->vertices[v1].edges = 381 (int *)realloc(mesh->vertices[v1].edges, (mesh->vertices[v1].numEdges + 1) * sizeof(int)); 382 // Adding edge i adjacent to vertex v1 383 addItem(mesh->vertices[v1].edges, &mesh->vertices[v1].numEdges, i); 384 385 mesh->vertices[v2].edges = 386 (int *)realloc(mesh->vertices[v2].edges, (mesh->vertices[v2].numEdges + 1) * sizeof(int)); 387 // Adding edge i adjacent to vertex v2 388 addItem(mesh->vertices[v2].edges, &mesh->vertices[v2].numEdges, i); 389 } 390 367 391 return mesh; 368 392 } 369 393 370 394 void VMI::printMesh(Mesh *mesh) { 371 GLuint i, j;395 int i, j; 372 396 373 397 printf("Vertices (%d)\n", mesh->numVertices); … … 385 409 } 386 410 printf("]\n"); 411 412 printf(" e(%d)[", mesh->vertices[i].numEdges); 413 if (mesh->vertices[i].edges != NULL) { 414 printf("%d", mesh->vertices[i].edges[0]); 415 for (j=1; j<mesh->vertices[i].numEdges; j++) { 416 printf(",%d", mesh->vertices[i].edges[j]); 417 } 418 } 419 printf("]\n"); 387 420 } 388 421 … … 391 424 for (i=0; i<mesh->numEdges; i++) { 392 425 printf("e%d (%d,%d) %d\n", i, mesh->edges[i].u, mesh->edges[i].v, mesh->edges[i].enable); 393 printf(" t(%d)[", mesh->edges[i].numTriangles);394 if (mesh->edges[i].triangles != NULL) {395 printf("%d", mesh->edges[i].triangles[0]);396 for (j=1; j<mesh->edges[i].numTriangles; j++) {397 printf(",%d", mesh->edges[i].triangles[j]);398 }399 }400 printf("]\n");401 426 } 402 427 … … 406 431 printf("t%d (%d,%d,%d) %d\n", i, mesh->triangles[i].indices[0], mesh->triangles[i].indices[1], 407 432 mesh->triangles[i].indices[2], mesh->triangles[i].enable); 408 printf(" e(3)[");409 printf("%d", mesh->triangles[i].edges[0]);410 for (j=1; j<3; j++) {411 printf(",%d", mesh->triangles[i].edges[j]);412 }413 printf("]\n");414 433 415 434 printf(" n(3)["); … … 425 444 426 445 void VMI::deleteMesh(Mesh *mesh) { 427 GLuint i;446 int i; 428 447 429 448 if (NULL != mesh) { … … 432 451 free(mesh->vertices[i].triangles); 433 452 453 if (mesh->vertices[i].edges != NULL) 454 free(mesh->vertices[i].edges); 455 434 456 } 435 457 if (mesh->vertices != NULL) free(mesh->vertices); 436 458 mesh->numVertices = 0; 437 459 438 for (i=0; i<mesh->numEdges; i++) {439 if (mesh->edges[i].triangles != NULL)440 free(mesh->edges[i].triangles);441 }442 460 if (mesh->edges != NULL) free(mesh->edges); 443 461 mesh->numEdges = 0; … … 525 543 } 526 544 527 int *VMI::edgesAdjToVertex(Mesh *mesh, int v, int *n) {528 int *edges = NULL;529 int i, t, e;530 #ifndef USE_EDGE_ADJACENCY531 int n0, n1, n2;532 #else533 int j;534 #endif535 int num = 0;536 537 if (mesh->vertices[v].numTriangles > 0)538 edges = (int*)malloc(sizeof(int) * mesh->vertices[v].numTriangles * 2);539 540 for (i=0; i<(int)mesh->vertices[v].numTriangles; i++) {541 542 t = mesh->vertices[v].triangles[i];543 544 #ifdef USE_EDGE_ADJACENCY545 for (j=0; j<3; j++) {546 e = mesh->triangles[t].edges[j];547 548 if ((int)mesh->edges[e].u == v || (int)mesh->edges[e].v == v)549 550 addItem(edges, &num, e);551 }552 #else553 n0 = mesh->triangles[t].indices[0];554 n1 = mesh->triangles[t].indices[1];555 n2 = mesh->triangles[t].indices[2];556 557 if (((n0 == v) || (n1 == v)) &&558 ((e = findEdge(mesh->edges, mesh->numEdges, n0, n1)) != -1)) addItem(edges, &num, e);559 560 if (((n1 == v) || (n2 == v)) &&561 ((e = findEdge(mesh->edges, mesh->numEdges, n1, n2)) != -1)) addItem(edges, &num, e);562 563 if (((n0 == v) || (n2 == v)) &&564 ((e = findEdge(mesh->edges, mesh->numEdges, n0, n2)) != -1)) addItem(edges, &num, e);565 566 #endif567 }568 *n = num;569 570 return edges;571 }572 573 545 int *VMI::edgesAdjToVertices(Mesh *mesh, int *vertices, int numVertices, int *n) { 574 546 int *edges = NULL; … … 578 550 if (numVertices > 0) { 579 551 // Add the first 580 list = edgesAdjToVertex(mesh, vertices[0], &numEdges); 552 list = mesh->vertices[vertices[0]].edges; 553 numEdges = mesh->vertices[vertices[0]].numEdges; 581 554 582 555 // Allocate memory … … 585 558 memcpy(edges, list, sizeof(int) * numEdges); 586 559 587 free(list);588 589 560 num = numEdges; 590 561 … … 592 563 for (i=1; i<numVertices; i++) { 593 564 594 list = edgesAdjToVertex(mesh, vertices[i], &numEdges); 565 list = mesh->vertices[vertices[i]].edges; 566 numEdges = mesh->vertices[vertices[i]].numEdges; 595 567 596 568 // Reallocate memory 597 569 if (numEdges > 0) { 598 570 599 571 edges = (int *)realloc(edges, (num + numEdges + 1) * sizeof(int)); … … 601 573 for (j=0; j<numEdges; j++) 602 574 addItem(edges, &num, list[j]); 603 } 604 free(list); 575 } 605 576 } 606 577 } … … 610 581 } 611 582 612 GLboolean VMI::findVertex( GLfloat *vertices, GLuint num, GLfloat x, GLfloat y, GLfloat z, int *pos) {613 GLuint i;614 GLfloat _x, _y, _z;583 GLboolean VMI::findVertex(float *vertices, int num, float x, float y, float z, int *pos) { 584 int i; 585 float _x, _y, _z; 615 586 GLboolean found = GL_FALSE; 616 587 … … 648 619 newList[*n].numTriangles = 0; 649 620 newList[*n].triangles = NULL; 621 622 newList[*n].numEdges= 0; 623 newList[*n].edges = NULL; 650 624 651 625 // Enable the new vertex … … 663 637 664 638 665 void VMI::updateModel(GLMmodel* pmodel, Mesh *mesh, GLuint numVertices, GLuint numTriangles) {666 GLuint i , v1, v2 ,v3, numV = 1, numT = 0;639 void VMI::updateModel(GLMmodel* pmodel, Mesh *mesh, int numVertices, int numTriangles) { 640 int i , v1, v2 ,v3, numV = 1, numT = 0; 667 641 int pos; 668 GLfloat x, y, z;642 float x, y, z; 669 643 670 644 if (pmodel->vertices != NULL) free(pmodel->vertices); … … 726 700 727 701 void VMI::saveModel(char *filename, GLMmodel* pmodel, Mesh *mesh) { 728 GLuint i, j, g, numT = 0;702 int i, j, g, numT = 0; 729 703 GLMgroup *group; 730 704
Note: See TracChangeset
for help on using the changeset viewer.