00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
#include <assert.h>
00016
#include <volume_io/internal_volume_io.h>
00017
#include <bicpl/objects.h>
00018
#include <bicpl/geom.h>
00019
00020
#ifndef lint
00021
static char rcsid[] =
"$Header: /software/source//libraries/bicpl/Objects/quadmesh.c,v 1.20 2002/04/29 18:31:06 stever Exp $";
00022
#endif
00023
00024
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00084 public void initialize_quadmesh(
00085
quadmesh_struct *quadmesh,
00086 Colour col,
00087 Surfprop *spr,
00088
int m,
00089
int n )
00090 {
00091 ALLOC( quadmesh->
colours, 1 );
00092
00093 quadmesh->
colour_flag =
ONE_COLOUR;
00094
00095 quadmesh->
colours[0] = col;
00096
00097
if( spr != (Surfprop *) 0 )
00098 quadmesh->
surfprop = *spr;
00099
else
00100
get_default_surfprop( &quadmesh->
surfprop );
00101
00102 quadmesh->
m = m;
00103 quadmesh->
n = n;
00104 quadmesh->
m_closed =
FALSE;
00105 quadmesh->
n_closed =
FALSE;
00106
if( quadmesh->
m > 0 && quadmesh->
n > 0 )
00107 {
00108 ALLOC( quadmesh->
points, m * n );
00109 ALLOC( quadmesh->
normals, m * n );
00110 }
00111
00112 quadmesh->
bintree = (
bintree_struct_ptr) NULL;
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00130 public void delete_quadmesh(
00131
quadmesh_struct *quadmesh )
00132 {
00133
free_colours( quadmesh->
colour_flag, quadmesh->
colours,
00134 quadmesh->
m * quadmesh->
n,
00135 (quadmesh->
m-1) * (quadmesh->
n-1) );
00136
00137
if( quadmesh->
m > 0 && quadmesh->
n > 0 )
00138 {
00139 FREE( quadmesh->
points );
00140
00141
if( quadmesh->
normals != (Vector *) NULL )
00142 FREE( quadmesh->
normals );
00143 }
00144
00145
delete_bintree_if_any( &quadmesh->
bintree );
00146 }
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00176 public void set_quadmesh_point(
00177
quadmesh_struct *quadmesh,
00178
int i,
00179
int j,
00180 Point *point,
00181 Vector *normal )
00182 {
00183
int ind;
00184
00185 assert( 0 <= i && i < quadmesh->m );
00186 assert( 0 <= j && j < quadmesh->n );
00187
00188 ind = IJ( i, j, quadmesh->
n );
00189
00190 quadmesh->
points[ind] = *point;
00191
if( normal != NULL && quadmesh->
normals != NULL )
00192 quadmesh->
normals[ind] = *normal;
00193 }
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00220 public BOOLEAN
get_quadmesh_point(
00221
const quadmesh_struct *quadmesh,
00222
int i,
00223
int j,
00224 Point *point )
00225 {
00226
if( i < 0 || i >= quadmesh->
m ||
00227 j < 0 || j >= quadmesh->
n )
00228
return(
FALSE );
00229
00230 *point = quadmesh->
points[IJ(i,j,quadmesh->
n)];
00231
00232
return(
TRUE );
00233 }
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00262 public void get_quadmesh_n_objects(
00263
const quadmesh_struct *quadmesh,
00264
int *mp,
00265
int *np )
00266 {
00267
if( quadmesh->
m_closed )
00268 *mp = quadmesh->
m;
00269
else
00270 *mp = quadmesh->
m - 1;
00271
00272
if( quadmesh->
n_closed )
00273 *np = quadmesh->
n;
00274
else
00275 *np = quadmesh->
n - 1;
00276 }
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00299 public void compute_quadmesh_normals(
00300
quadmesh_struct *quadmesh )
00301 {
00302
int i, j, m, n, n_neighs;
00303 Point neighbours[4];
00304 progress_struct progress;
00305
00306 m = quadmesh->
m;
00307 n = quadmesh->
n;
00308
00309
if( quadmesh->
normals == (Vector *) NULL )
00310 ALLOC( quadmesh->
normals, m * n );
00311
00312 for_less( i, 0, m * n )
00313 fill_Vector( quadmesh->
normals[i], 0.0, 0.0, 0.0 );
00314
00315 initialize_progress_report( &progress,
FALSE, m,
"Computing Normals" );
00316
00317 for_less( i, 0, m )
00318 {
00319 for_less( j, 0, n )
00320 {
00321 n_neighs = 0;
00322
if(
get_quadmesh_point( quadmesh, i, j-1, &neighbours[n_neighs]) )
00323 ++n_neighs;
00324
if(
get_quadmesh_point( quadmesh, i+1, j , &neighbours[n_neighs]) )
00325 ++n_neighs;
00326
if(
get_quadmesh_point( quadmesh, i, j+1, &neighbours[n_neighs]) )
00327 ++n_neighs;
00328
if(
get_quadmesh_point( quadmesh, i-1, j , &neighbours[n_neighs]) )
00329 ++n_neighs;
00330
00331
if( n_neighs < 2 )
00332 {
00333 handle_internal_error(
"compute_quadmesh_normals" );
00334 }
00335
else if( n_neighs == 2 )
00336 {
00337 neighbours[n_neighs] = quadmesh->
points[IJ(i,j,n)];
00338 ++n_neighs;
00339 }
00340
00341
find_polygon_normal( n_neighs, neighbours,
00342 &quadmesh->
normals[IJ(i,j,n)] );
00343 NORMALIZE_VECTOR( quadmesh->
normals[IJ(i,j,n)],
00344 quadmesh->
normals[IJ(i,j,n)] );
00345 }
00346
00347 update_progress_report( &progress, i + 1 );
00348 }
00349
00350 terminate_progress_report( &progress );
00351 }
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00384 public void get_quadmesh_patch_indices(
00385
const quadmesh_struct *quadmesh,
00386
int i,
00387
int j,
00388
int indices[] )
00389 {
00390 indices[0] = IJ( i, j, quadmesh->
n );
00391 indices[1] = IJ( (i+1) % quadmesh->
m, j, quadmesh->
n );
00392 indices[2] = IJ( (i+1) % quadmesh->
m, (j+1) % quadmesh->
n, quadmesh->
n );
00393 indices[3] = IJ( i, (j+1) % quadmesh->
n, quadmesh->
n );
00394 }
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00422 public void get_quadmesh_patch(
00423
const quadmesh_struct *quadmesh,
00424
int i,
00425
int j,
00426 Point points[] )
00427 {
00428
int p, indices[4];
00429
00430
get_quadmesh_patch_indices( quadmesh, i, j, indices );
00431
00432 for_less( p, 0, 4 )
00433 points[p] = quadmesh->
points[indices[p]];
00434 }
00435
00436
00442 public void reverse_quadmesh_vertices(
00443
quadmesh_struct *quadmesh )
00444 {
00445
int i, j, i1, i2;
00446 Point tmp_point;
00447 Vector tmp_normal;
00448
00449 for_less( i, 0, quadmesh->
m )
00450 {
00451 for_less( j, 0, quadmesh->
n / 2 )
00452 {
00453 i1 = IJ( i, j, quadmesh->
n );
00454 i2 = IJ( i, quadmesh->
n - 1 - j, quadmesh->
n );
00455
00456 tmp_point = quadmesh->
points[i1];
00457 quadmesh->
points[i1] = quadmesh->
points[i2];
00458 quadmesh->
points[i2] = tmp_point;
00459
00460
if( quadmesh->
normals != NULL )
00461 {
00462 tmp_normal = quadmesh->
normals[i1];
00463 quadmesh->
normals[i1] = quadmesh->
normals[i2];
00464 quadmesh->
normals[i2] = tmp_normal;
00465 }
00466 }
00467 }
00468 }
00469
00470