Main Page   Alphabetical List   Compound List   File List   Compound Members   File Members  

prm.c

Go to the documentation of this file.
00001 /*
00002 ** ----------------------------------------------------------------
00003 ** prm.c  -  Primitive data structure functions.
00004 **
00005 ** ----------------------------------------------------------------
00006 */
00007 
00038 /*
00039 ** ---------------------------------------------------------------
00040 ** Global variables and symbols:
00041 */
00042 #include <stdlib.h>
00043 #include <stdio.h>
00044 #include "prm.h"
00045 #include "quad.h"
00046 #include "circ.h"
00047 
00048 /*
00049 ** ---------------------------------------------------------------
00050 ** Local variables and symbols:
00051 */
00052 
00053 /*
00054 ** ---------------------------------------------------------------
00055 ** Primitive data structure:
00056 ** In this module, the primitives are stored in memory in a 
00057 ** circular doubly-linked list, with a pointer to the head of the
00058 ** list:
00059 **
00060 **       ---------- 
00061 **      | prm_head |
00062 **       ----------
00063 **           |
00064 **           |
00065 **           V
00066 **         -----     -----     -----     -----     -----
00067 **  /---->|     |-->|     |-->|     |-->|     |-->|     |------\
00068 **  |     | prm |   | prm |   | prm |   | prm |   | prm |      |
00069 **  |  /--|     |<--|     |<--|     |<--|     |<--|     |<--\  |
00070 **  |  |   -----     -----     -----     -----     -----    |  |
00071 **  |  |  (first)                                  (last)   |  |
00072 **  |  |                                                    |  |
00073 **  |  \----------------------------------------------------/  |
00074 **  |                                                          |
00075 **  \----------------------------------------------------------/
00076 */
00086 struct _prm {
00088   struct _prm   *next;
00090   struct _prm   *prev;
00092   int           type;
00094   void          *geom;
00096   int           sel;
00098   long int      color;
00100   double        height;
00101  };
00102 
00105 static Prm *prm_head = 0L;
00106 
00107 
00108 /*
00109 ** ---------------------------------------------------------------
00110 ** Private functions:
00111 */
00112 
00113 /*======================  prmCreateEmpty  ======================*/
00114 
00123 static Prm *prmCreateEmpty( void )
00124 {
00125  Prm *prm;
00126 
00127 /* Allocate memory for a new primitive.
00128  */
00129  prm = malloc( sizeof( Prm ) );
00130  if( prm == NULL )
00131   return( NULL );
00132 
00133 /* Set default values for new primitive.
00134  */
00135  prm->next = NULL;
00136  prm->prev = NULL;
00137  prm->type = PRM_UNDEF;
00138  prm->geom = NULL;
00139  prm->sel = 0;
00140  prm->color = 0L;
00141  prm->height = 0.0;
00142 
00143  return( prm );
00144 }
00145 
00146 /*======================  prmInsertFront  ======================*/
00147 
00164 static void prmInsertFront( Prm *prm )
00165 {
00166 /*** COMPLETE HERE: 01 ***/
00167 }
00168 
00169 /*======================  prmInsertBack  =======================*/
00170 
00188 static void prmInsertBack( Prm *prm )
00189 {
00190 /*** COMPLETE HERE: 02 ***/
00191 }
00192 
00193 /*=====================  prmRemoveFromList  ====================*/
00194 
00209 static void prmRemoveFromList( Prm *prm )
00210 {
00211 /*** COMPLETE HERE: 03 ***/
00212 }
00213 
00214 /*===================  prmGetFirstSelected  ====================*/
00215 
00224 static Prm *prmGetFirstSelected( void )
00225 {
00226 /*** COMPLETE HERE: 04 ***/
00227 
00228  return( NULL );
00229 }
00230 
00231 /*
00232 ** ---------------------------------------------------------------
00233 ** Public functions:
00234 */
00235 
00236 /*======================  prmCreateFront  ======================*/
00237 
00238 Prm *prmCreateFront( PrmType type )
00239 {
00240  Prm *prm;
00241  prm = prmCreateEmpty( );
00242  if( prm == NULL )
00243   return( NULL );
00244 
00245  switch( type )
00246  {
00247   case PRM_QUAD:
00248    prm->type = PRM_QUAD;
00249    prm->geom = quadCreate( );
00250    break;
00251   case PRM_CIRC:
00252    prm->type = PRM_CIRC;
00253    prm->geom = circCreate( );
00254    break;
00255   default:
00256    free( prm );
00257    return( NULL );
00258  }
00259  prmInsertFront( prm );
00260 
00261  return( prm );
00262 }
00263 
00264 /*=======================  prmCreateBack  ======================*/
00265 
00266 Prm *prmCreateBack( PrmType type )
00267 {
00268  Prm *prm;
00269  prm = prmCreateEmpty( );
00270  if( prm == NULL )
00271   return( NULL );
00272 
00273  switch( type )
00274  {
00275   case PRM_QUAD:
00276    prm->type = PRM_QUAD;
00277    prm->geom = quadCreate( );
00278    break;
00279   case PRM_CIRC:
00280    prm->type = PRM_CIRC;
00281    prm->geom = circCreate( );
00282    break;
00283   default:
00284    free( prm );
00285    return( NULL );
00286  }
00287  prmInsertBack( prm );
00288 
00289  return( prm );
00290 }
00291 
00292 /*=========================  prmDelete  ========================*/
00293 
00294 void prmDelete( Prm *prm )
00295 {
00296  prmRemoveFromList( prm );
00297  if( prm->geom )
00298  {
00299   switch( prm->type )
00300   {
00301    case PRM_QUAD:
00302     quadDelete( (Quad *)prm->geom );
00303     break;
00304    case PRM_CIRC:
00305     circDelete( (Circ *)prm->geom );
00306     break;
00307    default:
00308     break;
00309   }
00310  }
00311  free( prm );
00312 }
00313 
00314 /*=====================  prmDeleteSelected  ====================*/
00315 
00316 void prmDeleteSelected( void )
00317 {
00318  Prm *prm;
00319  while( (prm = prmGetFirstSelected( )) != NULL )
00320  {
00321   prmDelete( prm );
00322  }
00323 }
00324 
00325 /*=======================  prmDeleteList  ======================*/
00326 
00327 void prmDeleteList( void )
00328 {
00329 /*** COMPLETE HERE: 05 ***/
00330 }
00331 
00332 /*==========================  prmFirst  ========================*/
00333 
00334 Prm *prmFirst( void )
00335 {
00336 /*** COMPLETE HERE: 06 ***/
00337 }
00338 
00339 /*==========================  prmLast  =========================*/
00340 
00341 Prm *prmLast( void )
00342 {
00343 /*** COMPLETE HERE: 07 ***/
00344 }
00345 
00346 /*==========================  prmNext  =========================*/
00347 
00348 Prm *prmNext( Prm *prm )
00349 {
00350 /*** COMPLETE HERE: 08 ***/
00351 }
00352 
00353 /*========================  prmPrevious  =======================*/
00354 
00355 Prm *prmPrevious( Prm *prm )
00356 {
00357 /*** COMPLETE HERE: 09 ***/
00358 }
00359 
00360 /*=======================  prmMoveFront  =======================*/
00361 
00362 void prmMoveFront( Prm *prm )
00363 {
00364 /* Handle case in which given primitive is already at the 
00365  * beginning of list. This also considers the case of a
00366  * single primitive list.
00367  */
00368  if( prm == prm_head )
00369   return;
00370 
00371 /* When we get here, there are at least two primitives in
00372  * the list and the primitive to move is not the first one.
00373  * Therefore, it is just necessary to remove from its 
00374  * current position in the list and inserts it at the beginning
00375  * of list.
00376  */
00377  prmRemoveFromList( prm );
00378  prmInsertFront( prm );
00379 }
00380 
00381 /*========================  prmMoveBack  =======================*/
00382 
00383 void prmMoveBack( Prm *prm )
00384 {
00385 /* Handle case in which given primitive is already at the 
00386  * end of list. This also considers the case of a
00387  * single primitive list.
00388  */
00389  if( prm == prm_head->prev )
00390   return;
00391 
00392 /* When we get here, there are at least two primitives in
00393  * the list and the primitive to move is not the last one.
00394  * Therefore, it is just necessary to remove from its 
00395  * current position in the list and inserts it at the end
00396  * of list.
00397  */
00398  prmRemoveFromList( prm );
00399  prmInsertBack( prm );
00400 }
00401 
00402 /*========================  prmGetType  ========================*/
00403 
00404 int prmGetType( Prm *prm )
00405 {
00406  return( (int)prm->type );
00407 }
00408 
00409 /*==========================  prmRead  =========================*/
00410 
00411 void prmRead( Prm *prm, FILE *fd )
00412 {
00413  switch( prm->type )
00414  {
00415   case PRM_QUAD:
00416    quadRead( (Quad *)prm->geom, fd );
00417    break;
00418   case PRM_CIRC:
00419    circRead( (Circ *)prm->geom, fd );
00420    break;
00421   default:
00422    break;
00423  }
00424 }
00425 
00426 /*=========================  prmWrite  =========================*/
00427 
00428 void prmWrite( Prm *prm, FILE *fd )
00429 {
00430  switch( prm->type )
00431  {
00432   case PRM_QUAD:
00433    quadWrite( (Quad *)prm->geom, fd );
00434    break;
00435   case PRM_CIRC:
00436    circWrite( (Circ *)prm->geom, fd );
00437    break;
00438   default:
00439    break;
00440  }
00441 }
00442 
00443 /*========================  prmGetNPts  ========================*/
00444 
00445 int prmGetNPts( Prm *prm )
00446 {
00447  int npts;
00448 
00449  switch( prm->type )
00450  {
00451   case PRM_QUAD:
00452    npts = quadGetNPts( (Quad *)prm->geom );
00453    break;
00454   case PRM_CIRC:
00455    npts = circGetNPts( (Circ *)prm->geom );
00456    break;
00457   default:
00458    npts = 0;
00459    break;
00460  }
00461  return( npts );
00462 }
00463 
00464 /*=======================  prmSetCoords  =======================*/
00465 
00466 void prmSetCoords( Prm *prm, int id, double x, double y )
00467 {
00468  switch( prm->type )
00469  {
00470   case PRM_QUAD:
00471    quadSetCoords( (Quad *)prm->geom, id, x, y );
00472    break;
00473   case PRM_CIRC:
00474    circSetCoords( (Circ *)prm->geom, id, x, y );
00475    break;
00476   default:
00477    break;
00478  }
00479 }
00480 
00481 /*=======================  prmGetCoords  =======================*/
00482 
00483 void prmGetCoords( Prm *prm, int id, double *x, double *y )
00484 {
00485  switch( prm->type )
00486  {
00487   case PRM_QUAD:
00488    quadGetCoords( (Quad *)prm->geom, id, x, y );
00489    break;
00490   case PRM_CIRC:
00491    circGetCoords( (Circ *)prm->geom, id, x, y );
00492    break;
00493   default:
00494    break;
00495  }
00496 }
00497 
00498 /*=======================  prmSet1stPt  ========================*/
00499 
00500 void prmSet1stPt( Prm *prm, double x, double y )
00501 {
00502  switch( prm->type )
00503  {
00504   case PRM_QUAD:
00505    quadSet1stPt( (Quad *)prm->geom, x, y );
00506    break;
00507   case PRM_CIRC:
00508    circSet1stPt( (Circ *)prm->geom, x, y );
00509    break;
00510   default:
00511    break;
00512  }
00513 }
00514  
00515 /*=======================  prmSet2ndPt  ========================*/
00516 
00517 void prmSet2ndPt( Prm *prm, double x, double y )
00518 {
00519  switch( prm->type )
00520  {
00521   case PRM_QUAD:
00522    quadSet2ndPt( (Quad *)prm->geom, x, y );
00523    break;
00524   case PRM_CIRC:
00525    circSet2ndPt( (Circ *)prm->geom, x, y );
00526    break;
00527   default:
00528    break;
00529  }
00530 }
00531 
00532 /*=======================  prmSelectAll  =======================*/
00533 
00534 void prmSelectAll( )
00535 {
00536 /*** COMPLETE HERE: 10 ***/
00537 }
00538 
00539 /*=========================  prmSelect  ========================*/
00540 
00541 void prmSelect( Prm *prm )
00542 {
00543 /*** COMPLETE HERE: 11 ***/
00544 }
00545 
00546 /*========================  prmUnselect  =======================*/
00547 
00548 void prmUnselect( Prm *prm )
00549 {
00550 /*** COMPLETE HERE: 12 ***/
00551 }
00552 
00553 /*======================  prmUnselectAll  ======================*/
00554 
00555 void prmUnselectAll( )
00556 {
00557 /*** COMPLETE HERE: 13 ***/
00558 }
00559 
00560 /*=====================  prmCheckSelected  =====================*/
00561 
00562 int prmCheckSelected( Prm *prm )
00563 {
00564 /*** COMPLETE HERE: 14 ***/
00565  return( 0 );
00566 }
00567 
00568 /*========================  prmSetColor  =======================*/
00569 
00570 void prmSetColor( Prm *prm, long int color )
00571 {
00572  prm->color = color;
00573 }
00574 
00575 /*========================  prmGetColor  =======================*/
00576 
00577 long int prmGetColor( Prm *prm )
00578 {
00579  return( prm->color );
00580 }
00581 
00582 /*========================  prmSetHeight  ======================*/
00583 
00584 void prmSetHeight( Prm *prm, double height )
00585 {
00586  prm->height = height;
00587 }
00588 
00589 /*========================  prmGetHeight  ======================*/
00590 
00591 double prmGetHeight( Prm *prm )
00592 {
00593  return( prm->height );
00594 }
00595 
00596 /*=======================  prmPickArea  ========================*/
00597 
00598 int prmPickArea( Prm *prm, double x, double y )
00599 {
00600  int status;
00601 
00602  switch( prm->type )
00603  {
00604   case PRM_QUAD:
00605    status = quadPickArea( (Quad *)prm->geom, x, y );
00606    break;
00607   case PRM_CIRC:
00608    status = circPickArea( (Circ *)prm->geom, x, y );
00609    break;
00610   default:
00611    status = 0;
00612    break;
00613  }
00614  return( status );
00615 }
00616 
00617 /*======================  prmPickVertex  =======================*/
00618 
00619 int prmPickVertex( Prm *prm, double x, double y, double tol,
00620                    int *id )
00621 {
00622  int status;
00623 
00624  switch( prm->type )
00625  {
00626   case PRM_QUAD:
00627    status = quadPickVertex( (Quad *)prm->geom, x, y, tol, id );
00628    break;
00629   case PRM_CIRC:
00630    status = circPickVertex( (Circ *)prm->geom, x, y, tol, id );
00631    break;
00632   default:
00633    status = 0;
00634    break;
00635  }
00636  return( status );
00637 }
00638 
00639 /*=======================  prmPickSide  ========================*/
00640 
00641 int prmPickSide( Prm *prm, double x, double y, double tol,
00642                  int *id )
00643 {
00644  int status;
00645 
00646  switch( prm->type )
00647  {
00648   case PRM_QUAD:
00649    status = quadPickSide( (Quad *)prm->geom, x, y, tol, id );
00650    break;
00651   case PRM_CIRC:
00652    status = circPickSide( (Circ *)prm->geom, x, y, tol, id );
00653    break;
00654   default:
00655    status = 0;
00656    break;
00657  }
00658  return( status );
00659 }
00660 
00661 /*=======================  prmTranslate  =======================*/
00662 
00663 void prmTranslate( Prm *prm, double dx, double dy )
00664 {
00665  switch( prm->type )
00666  {
00667   case PRM_QUAD:
00668    quadTranslate( (Quad *)prm->geom, dx, dy );
00669    break;
00670   case PRM_CIRC:
00671    circTranslate( (Circ *)prm->geom, dx, dy );
00672    break;
00673   default:
00674    break;
00675  }
00676 }
00677 
00678 /*====================  prmTranslateVertex  ====================*/
00679 
00680 void prmTranslateVertex( Prm *prm, int id, double dx, double dy )
00681 {
00682  switch( prm->type )
00683  {
00684   case PRM_QUAD:
00685    quadTranslateVertex( (Quad *)prm->geom, id, dx, dy );
00686    break;
00687   case PRM_CIRC:
00688    circTranslateVertex( (Circ *)prm->geom, id, dx, dy );
00689    break;
00690   default:
00691    break;
00692  }
00693 }
00694 
00695 /*=====================  prmTranslateSide  =====================*/
00696 
00697 void prmTranslateSide( Prm *prm, int id, double dx, double dy )
00698 {
00699  switch( prm->type )
00700  {
00701   case PRM_QUAD:
00702    quadTranslateSide( (Quad *)prm->geom, id, dx, dy );
00703    break;
00704   case PRM_CIRC:
00705    circTranslateSide( (Circ *)prm->geom, id, dx, dy );
00706    break;
00707   default:
00708    break;
00709  }
00710 }
00711 
00712 /*=========================  prmGetBox  ========================*/
00713 
00714 void prmGetBox( Prm *prm, double *xmin, double *xmax, 
00715                           double *ymin, double *ymax )
00716 {
00717  switch( prm->type )
00718  {
00719   case PRM_QUAD:
00720    quadGetBox( (Quad *)prm->geom, xmin, xmax, ymin, ymax );
00721    break;
00722   case PRM_CIRC:
00723    circGetBox( (Circ *)prm->geom, xmin, xmax, ymin, ymax );
00724    break;
00725   default:
00726    break;
00727  }
00728 }
00729 
00730 /*======================  prmGetGlobalBox  =====================*/
00731 
00732 int prmGetGlobalBox( double *xmin, double *xmax, 
00733                      double *ymin, double *ymax )
00734 {
00735 /*** COMPLETE HERE: 15 ***/
00736 
00737  return( 1 );
00738 }
00739 
00740 /*====================  prmDisplayBoundary  ====================*/
00741 
00742 void prmDisplayBoundary( Prm *prm )
00743 {
00744  switch( prm->type )
00745  {
00746   case PRM_QUAD:
00747    quadDisplayBoundary( (Quad *)prm->geom );
00748    break;
00749   case PRM_CIRC:
00750    circDisplayBoundary( (Circ *)prm->geom );
00751    break;
00752   default:
00753    break;
00754  }
00755 }
00756 
00757 /*====================  prmDisplayInterior  ====================*/
00758 
00759 void prmDisplayInterior( Prm *prm )
00760 {
00761  switch( prm->type )
00762  {
00763   case PRM_QUAD:
00764    quadDisplayInterior( (Quad *)prm->geom );
00765    break;
00766   case PRM_CIRC:
00767    circDisplayInterior( (Circ *)prm->geom );
00768    break;
00769   default:
00770    break;
00771  }
00772 }
00773 
00774 /*=====================  prmDisplaySolid  ======================*/
00775 
00776 void prmDisplaySolid( Prm *prm )
00777 {
00778  switch( prm->type )
00779  {
00780   case PRM_QUAD:
00781    quadDisplaySolid( (Quad *)prm->geom, prmGetHeight( prm ) );
00782    break;
00783   case PRM_CIRC:
00784    circDisplaySolid( (Circ *)prm->geom, prmGetHeight( prm ) );
00785    break;
00786   default:
00787    break;
00788  }
00789 }
00790 
00791 /*======================  prmHighltSolid  ======================*/
00792 
00793 void prmHighltSolid( Prm *prm )
00794 {
00795  switch( prm->type )
00796  {
00797   case PRM_QUAD:
00798    quadHighltSolid( (Quad *)prm->geom, prmGetHeight( prm ) );
00799    break;
00800   case PRM_CIRC:
00801    circHighltSolid( (Circ *)prm->geom, prmGetHeight( prm ) );
00802    break;
00803   default:
00804    break;
00805  }
00806 }
00807 
00808 /*====================  prmDisplayZbuffer  =====================*/
00809 
00810 void prmDisplayZbuffer( Prm *prm )
00811 {
00812  switch( prm->type )
00813  {
00814   case PRM_QUAD:
00815    quadDisplayZbuffer( (Quad *)prm->geom, prmGetHeight( prm ), 
00816                                           prmGetColor( prm ) );
00817    break;
00818   case PRM_CIRC:
00819    circDisplayZbuffer( (Circ *)prm->geom, prmGetHeight( prm ),
00820                                           prmGetColor( prm ) );
00821    break;
00822   default:
00823    break;
00824  }
00825 }
00826 
00828 ===========  prmHighltSolid  ======================*/
00829 
00830 void prmHighltSolid( Prm *prm )
00831 {
00832  switch( prm->type )
00833  {
00834   case PRM_QUAD:
00835    quadHighltSolid( (Quad *)prm->geom, prmGetHeight( prm ) );
00836    break;
00837   case PRM_CIRC:
00838    circHighltSolid( (Circ *)prm->geom, prmGetHeight( prm ) );
00839    break;
00840   default:
00841    break;
00842  }
00843 }
00844 
00845 /*====================  prmDisplayZbuffer  =====================*/
00846 
00847 void prmDisplayZbuffer( Prm *prm )
00848 {
00849  switch( prm->type )
00850  {
00851   case PRM_QUAD:
00852    quadDisplayZbuffer( (Quad *)prm->geom, prmGetHeight( prm ), 
00853                                           prmGetColor( prm ) );
00854    break;
00855   case PRM_CIRC:
00856    circDisplayZbuffer( (Circ *)prm->geom, prmGetHeight( prm ),
00857                                           prmGetColor( prm ) );
00858    break;
00859   default:
00860    break;
00861  }
00862 }
00863 

Generated on Tue Nov 8 10:57:59 2005 for Trab3 by doxygen1.2.18