40 #include "glimports.h"
43 #include "gridvertex.h"
44 #include "gridtrimvertex.h"
53 const float Mesher::ZERO = 0.0;
64 Mesher::~Mesher(
void )
66 if( vdata )
delete[] vdata;
70 Mesher::init(
unsigned int npts )
73 if( stacksize < npts ) {
75 if( vdata )
delete[] vdata;
83 assert( itop+1 != (
int)stacksize );
95 backend.bgntmesh(
"addedge" );
151 nextlower( gtlower );
153 assert( gtupper->t && gtlower->t );
155 if( gtupper->t->param[0] < gtlower->t->param[0] ) {
159 finishLower(gtlower);
162 }
else if( gtupper->t->param[0] > gtlower->t->param[0] ) {
166 finishUpper(gtupper);
170 if( lastedge == 0 ) {
174 finishLower(gtlower);
181 finishUpper(gtupper);
188 if( gtupper->t->param[0] < gtlower->t->param[0] ) {
192 finishLower(gtlower);
195 }
else if( gtupper->t->param[0] > gtlower->t->param[0] ) {
199 finishUpper(gtupper);
203 if( lastedge == 0 ) {
207 finishLower(gtlower);
214 finishUpper(gtupper);
223 Mesher::isCcw(
int ilast )
225 REAL area = det3( vdata[ilast]->t, vdata[itop-1]->t, vdata[itop-2]->t );
226 return (area < ZERO) ? 0 : 1;
230 Mesher::isCw(
int ilast )
232 REAL area = det3( vdata[ilast]->t, vdata[itop-1]->t, vdata[itop-2]->t );
233 return (area > -ZERO) ? 0 : 1;
237 Mesher::equal(
int x,
int y )
239 return( last[0] == vdata[x] && last[1] == vdata[y] );
243 Mesher::copy(
int x,
int y )
245 last[0] = vdata[x]; last[1] = vdata[y];
249 Mesher::move(
int x,
int y )
255 Mesher::output(
int x )
257 backend.tmeshvert( vdata[x] );
276 register int ilast = itop;
278 if( lastedge == 0 ) {
279 if( equal( 0, 1 ) ) {
282 for(
register int i = 2; i < ilast; i++ ) {
286 copy( ilast, ilast-1 );
287 }
else if( equal( ilast-2, ilast-1) ) {
290 for(
register int i = ilast-3; i >= 0; i-- ) {
296 closeMesh(); openMesh();
299 for(
register int i = 1; i < ilast; i++ ) {
303 copy( ilast, ilast-1 );
309 for(
register int i = 2; i < ilast; i++ ) {
313 copy( ilast-1, ilast );
314 }
else if( equal( ilast-1, ilast-2) ) {
317 for(
register int i = ilast-3; i >= 0; i-- ) {
323 closeMesh(); openMesh();
326 for(
register int i = 1; i < ilast; i++ ) {
330 copy( ilast-1, ilast );
340 register int ilast = itop;
342 if( lastedge == 0 ) {
343 if( equal( 0, 1 ) ) {
346 for(
register int i = 2; i < ilast; i++ ) {
350 copy( ilast, ilast-1 );
351 }
else if( equal( ilast-2, ilast-1) ) {
354 for(
register int i = ilast-3; i >= 0; i-- ) {
360 closeMesh(); openMesh();
363 for(
register int i = 1; i < ilast; i++ ) {
367 copy( ilast, ilast-1 );
375 if( ! isCcw( ilast ) )
return;
378 }
while( (itop > 1) && isCcw( ilast ) );
380 if( equal( ilast-1, ilast-2 ) ) {
383 for(
register int i=ilast-3; i>=itop-1; i-- ) {
387 copy( ilast, itop-1 );
388 }
else if( equal( itop, itop-1 ) ) {
391 for(
register int i = itop+1; i < ilast; i++ ) {
395 copy( ilast-1, ilast );
397 closeMesh(); openMesh();
400 for(
register int i=ilast-2; i>=itop-1; i-- ) {
404 copy( ilast, itop-1 );
414 register int ilast = itop;
416 if( lastedge == 1 ) {
420 for(
register int i = 2; i < ilast; i++ ) {
424 copy( ilast-1, ilast );
425 }
else if( equal( ilast-1, ilast-2) ) {
428 for(
register int i = ilast-3; i >= 0; i-- ) {
434 closeMesh(); openMesh();
437 for(
register int i = 1; i < ilast; i++ ) {
441 copy( ilast-1, ilast );
450 if( ! isCw( ilast ) )
return;
453 }
while( (itop > 1) && isCw( ilast ) );
455 if( equal( ilast-2, ilast-1) ) {
458 for(
register int i=ilast-3; i>=itop-1; i--) {
462 copy( itop-1, ilast );
463 }
else if( equal( itop-1, itop) ) {
466 for(
register int i=itop+1; i<ilast; i++ ) {
470 copy( ilast, ilast-1 );
472 closeMesh(); openMesh();
475 for(
register int i=ilast-2; i>=itop-1; i-- ) {
479 copy( itop-1, ilast );