bsmesh.h

Go to the documentation of this file.
00001 
00002 /* ///////////////////////////////////////////////////////////////////////// */
00003 /* This file is a part of the BSTools package                                */
00004 /* written by Przemyslaw Kiciak                                              */
00005 /* ///////////////////////////////////////////////////////////////////////// */
00006 /* (C) Copyright by Przemyslaw Kiciak, 2010, 2012                            */
00007 /* this package is distributed under the terms of the                        */
00008 /* Lesser GNU Public License, see the file COPYING.LIB                       */
00009 /* ///////////////////////////////////////////////////////////////////////// */
00010 
00011 #ifndef BSMESH_H
00012 #define BSMESH_H
00013 
00014 #ifndef PKVARIA_H
00015 #include "pkvaria.h"
00016 #endif
00017 
00018 #ifndef PKGEOM_H
00019 #include "pkgeom.h"
00020 #endif
00021 
00022 #ifdef __cplusplus   
00023 extern "C" {
00024 #endif
00025 
00026 /* mesh representation data structure */
00027 typedef struct {
00028     char degree;
00029     int  firsthalfedge;
00030   } BSMfacet, BSMvertex;
00031 
00032 typedef struct {
00033     int v0, v1;
00034     int facetnum;
00035     int otherhalf;
00036   } BSMhalfedge;
00037 
00038 /* Sabin net list data structure */
00039 typedef struct {
00040     byte  el_type;               /* mesh special element type, */
00041                                  /* 0 - vertex, 1 - facet */
00042     byte  degree;                /* degree of the special vertex or facet */
00043     byte  snet_rad;              /* Sabin net radius */
00044     short snet_nvert;            /* number of Sabin net vertices */
00045     int   first_snet_vertex;     /* index of the first Sabin net vertex */
00046   } bsm_special_el;
00047 
00048 typedef struct {
00049     int            nspecials;  /* number of special mesh elements */
00050     int            nspvert;    /* number of vertices in the Sabin nets */
00051     int            nextravert; /* number of extra vertices */
00052     bsm_special_el *spel;      /* array of special elements */
00053     int            *spvert;    /* array of indices of the vertices */
00054                                /* in the Sabin nets */
00055   } bsm_special_elem_list;
00056 
00057 
00058 boolean bsm_CheckMeshIntegrity ( int nv, const BSMvertex *mv, const int *mvhei,
00059                                  int nhe, const BSMhalfedge *mhe,
00060                                  int nfac, const BSMfacet *mfac, const int *mfhei );
00061 
00062 void bsm_TagMesh ( int nv, BSMvertex *mv, int *mvhei,
00063                    int nhe, BSMhalfedge *mhe,
00064                    int nfac, BSMfacet *mfac, int *mfhei,
00065                    char *vtag, char *ftag,
00066                    int *vi, int *vb, int *ei, int *eb );
00067 
00068 boolean bsm_DoublingNum ( int inv, BSMvertex *imv, int *imvhei,
00069                           int inhe, BSMhalfedge *imhe,
00070                           int infac, BSMfacet *imfac, int *imfhei,
00071                           int *onv, int *onhe, int *onfac );
00072 boolean bsm_Doublingd ( int spdimen,
00073                         int inv, BSMvertex *imv, int *imvhei, double *iptc,
00074                         int inhe, BSMhalfedge *imhe,
00075                         int infac, BSMfacet *imfac, int *imfhei,
00076                         int *onv, BSMvertex *omv, int *omvhei, double *optc,
00077                         int *onhe, BSMhalfedge *omhe,
00078                         int *onfac, BSMfacet *omfac, int *omfhei );
00079 
00080 int bsm_DoublingMatSize ( int inv, BSMvertex *imv, int *imvhei,
00081                           int inhe, BSMhalfedge *imhe,
00082                           int infac, BSMfacet *imfac, int *imfhei );
00083 boolean bsm_DoublingMatd ( int inv, BSMvertex *imv, int *imvhei,
00084                            int inhe, BSMhalfedge *imhe,
00085                            int infac, BSMfacet *imfac, int *imfhei,
00086                            int *onv, BSMvertex *omv, int *omvhei,
00087                            int *onhe, BSMhalfedge *omhe,
00088                            int *onfac, BSMfacet *omfac, int *omfhei,
00089                            int *ndmat, index2 *dmi, double *dmc );
00090 
00091 boolean bsm_AveragingNum ( int inv, BSMvertex *imv, int *imvhei,
00092                            int inhe, BSMhalfedge *imhe,
00093                            int infac, BSMfacet *imfac, int *imfhei,
00094                            int *onv, int *onhe, int *onfac );
00095 boolean bsm_Averagingd ( int spdimen,
00096                          int inv, BSMvertex *imv, int *imvhei, double *iptc,
00097                          int inhe, BSMhalfedge *imhe,
00098                          int infac, BSMfacet *imfac, int *imfhei,
00099                          int *onv, BSMvertex *omv, int *omvhei, double *optc,
00100                          int *onhe, BSMhalfedge *omhe,
00101                          int *onfac, BSMfacet *omfac, int *omfhei );
00102 
00103 int bsm_AveragingMatSize ( int inv, BSMvertex *imv, int *imvhei,
00104                            int inhe, BSMhalfedge *imhe,
00105                            int infac, BSMfacet *imfac, int *imfhei );
00106 boolean bsm_AveragingMatd ( int inv, BSMvertex *imv, int *imvhei,
00107                             int inhe, BSMhalfedge *imhe,
00108                             int infac, BSMfacet *imfac, int *imfhei,
00109                             int *onv, BSMvertex *omv, int *omvhei,
00110                             int *onhe, BSMhalfedge *omhe,
00111                             int *onfac, BSMfacet *omfac, int *omfhei,
00112                             int *namat, index2 *ami, double *amc );
00113 
00114 boolean bsm_RefineBSMeshd ( int spdimen, int degree,
00115                     int inv, BSMvertex *imv, int *imvhei, double *iptc,
00116                     int inhe, BSMhalfedge *imhe,
00117                     int infac, BSMfacet *imfac, int *imfhei,
00118                     int *onv, BSMvertex **omv, int **omvhei, double **optc,
00119                     int *onhe, BSMhalfedge **omhe,
00120                     int *onfac, BSMfacet **omfac, int **omfhei );
00121 
00122 boolean bsm_RefinementMatd ( int degree,
00123                              int inv, BSMvertex *imv, int *imvhei,
00124                              int inhe, BSMhalfedge *imhe,
00125                              int infac, BSMfacet *imfac, int *imfhei,
00126                              int *onv, BSMvertex **omv, int **omvhei,
00127                              int *onhe, BSMhalfedge **omhe,
00128                              int *onfac, BSMfacet **omfac, int **omfhei,
00129                              int *nrmat, index2 **rmi, double **rmc );
00130 
00131 void bsm_MergeMeshesd ( int spdimen,
00132                         int nv1, BSMvertex *mv1, int *mvhei1, double *vpc1,
00133                         int nhe1, BSMhalfedge *mhe1,
00134                         int nfac1, BSMfacet *mfac1, int *mfhei1,
00135                         int nv2, BSMvertex *mv2, int *mvhei2, double *vpc2,
00136                         int nhe2, BSMhalfedge *mhe2,
00137                         int nfac2, BSMfacet *mfac2, int *mfhei2,
00138                         int *onv, BSMvertex *omv, int *omvhei, double *ovpc,
00139                         int *onhe, BSMhalfedge *omhe,
00140                         int *onfac, BSMfacet *omfac, int *omfhei );
00141 
00142 boolean bsm_RemoveFacetNum ( int inv, BSMvertex *imv, int *imvhei,
00143                              int inhe, BSMhalfedge *imhe,
00144                              int infac, BSMfacet *imfac, int *imfhei,
00145                              int nfr,
00146                              int *onv, int *onhe, int *onfac );
00147 boolean bsm_RemoveFacetd ( int spdimen,
00148                            int inv, BSMvertex *imv, int *imvhei, double *iptc,
00149                            int inhe, BSMhalfedge *imhe,
00150                            int infac, BSMfacet *imfac, int *imfhei,
00151                            int nfr,
00152                            int *onv, BSMvertex *omv, int *omvhei, double *optc,
00153                            int *onhe, BSMhalfedge *omhe,
00154                            int *onfac, BSMfacet *omfac, int *omfhei );
00155 
00156 void bsm_FacetEdgeDoublingNum ( int inv, BSMvertex *imv, int *imvhei,
00157                                 int inhe, BSMhalfedge *imhe,
00158                                 int infac, BSMfacet *imfac, int *imfhei,
00159                                 int fn,
00160                                 int *onv, int *onhe, int *onfac );
00161 boolean bsm_FacetEdgeDoublingd ( int spdimen,
00162                                  int inv, BSMvertex *imv, int *imvhei, double *iptc,
00163                                  int inhe, BSMhalfedge *imhe,
00164                                  int infac, BSMfacet *imfac, int *imfhei,
00165                                  int fn,
00166                                  int *onv, BSMvertex *omv, int *omvhei, double *optc,
00167                                  int *onhe, BSMhalfedge *omhe,
00168                                  int *onfac, BSMfacet *omfac, int *omfhei );
00169 
00170 void bsm_RemoveVertexNum ( int inv, BSMvertex *imv, int *imvhei,
00171                            int inhe, BSMhalfedge *imhe,
00172                            int infac, BSMfacet *imfac, int *imfhei,
00173                            int nvr,
00174                            int *onv, int *onhe, int *onfac );
00175 boolean bsm_RemoveVertexd ( int spdimen,
00176                             int inv, BSMvertex *imv, int *imvhei, double *iptc,
00177                             int inhe, BSMhalfedge *imhe,
00178                             int infac, BSMfacet *imfac, int *imfhei,
00179                             int nvr,
00180                             int *onv, BSMvertex *omv, int *omvhei, double *optc,
00181                             int *onhe, BSMhalfedge *omhe,
00182                             int *onfac, BSMfacet *omfac, int *omfhei );
00183 
00184 void bsm_ContractEdgeNum ( int inv, BSMvertex *imv, int *imvhei,
00185                            int inhe, BSMhalfedge *imhe,
00186                            int infac, BSMfacet *imfac, int *imfhei,
00187                            int nche,
00188                            int *onv, int *onhe, int *onfac );
00189 int bsm_ContractEdged ( int spdimen,
00190                         int inv, BSMvertex *imv, int *imvhei, double *iptc,
00191                         int inhe, BSMhalfedge *imhe,
00192                         int infac, BSMfacet *imfac, int *imfhei,
00193                         int nche,
00194                         int *onv, BSMvertex *omv, int *omvhei, double *optc,
00195                         int *onhe, BSMhalfedge *omhe,
00196                         int *onfac, BSMfacet *omfac, int *omfhei );
00197 
00198 /* the procedures with the headers below search regular (i.e. rectangular) */
00199 /* and special subnets of indicated sizes in the mesh */
00200 boolean bsm_FindRegularSubnets ( int nv, BSMvertex *mv, int *mvhei,
00201                                  int nhe, BSMhalfedge *mhe,
00202                                  int nfac, BSMfacet *mfac, int *mfhei,
00203                                  int d, void *usrptr,
00204                                  void (*output)( int d, int *vertnum, int *mtab,
00205                                                  void *usrptr ) );
00206 boolean bsm_FindSpecialVSubnets ( int nv, BSMvertex *mv, int *mvhei,
00207                                   int nhe, BSMhalfedge *mhe,
00208                                   int nfac, BSMfacet *mfac, int *mfhei,
00209                                   int d, void *usrptr,
00210                                   void (*output)( int d, int k, int *vertnum,
00211                                                   int *mtab, void *usrptr ) );
00212 boolean bsm_FindSpecialFSubnets ( int nv, BSMvertex *mv, int *mvhei,
00213                                   int nhe, BSMhalfedge *mhe,
00214                                   int nfac, BSMfacet *mfac, int *mfhei,
00215                                   int d, void *usrptr,
00216                                   void (*output)( int d, int k, int *vertnum,
00217                                                   int *mtab, void *usrptr ) );
00218 
00219 boolean bsm_CountSpecialVSubnets ( int nv, BSMvertex *mv, int *mvhei,
00220                                    int nhe, BSMhalfedge *mhe,
00221                                    int nfac, BSMfacet *mfac, int *mfhei,
00222                                    byte snet_rad,
00223                                    int *nspecials, int *nspvert );
00224 boolean bsm_FindSpecialVSubnetList ( int nv, BSMvertex *mv, int *mvhei,
00225                                      int nhe, BSMhalfedge *mhe,
00226                                      int nfac, BSMfacet *mfac, int *mfhei,
00227                                      byte snet_rad,
00228                                      boolean append,
00229                                      bsm_special_elem_list *list );
00230 
00231 boolean bsm_CountSpecialFSubnets ( int nv, BSMvertex *mv, int *mvhei,
00232                                    int nhe, BSMhalfedge *mhe,
00233                                    int nfac, BSMfacet *mfac, int *mfhei,
00234                                    byte snet_rad,
00235                                    int *nspecials, int *nspvert );
00236 boolean bsm_FindSpecialFSubnetLists ( int nv, BSMvertex *mv, int *mvhei,
00237                                       int nhe, BSMhalfedge *mhe,
00238                                       int nfac, BSMfacet *mfac, int *mfhei,
00239                                       boolean append,
00240                                       byte snet_rad,
00241                                       bsm_special_elem_list *list );
00242 
00243 /* the procedure with the header below finds vertices distant from */
00244 /* the mesh boundary by at most d edges */
00245 void bsm_TagBoundaryZoneVertices ( int nv, BSMvertex *mv, int *mvhei,
00246                                    int nhe, BSMhalfedge *mhe,
00247                                    char d, char *vtag );
00248 
00249 /* the procedures below assign each vertex a distance from a specified vertex */
00250 /* 1. measured with the number of edges */
00251 boolean bsm_FindVertexDistances1 ( int nv, BSMvertex *mv, int *mvhei,
00252                                    int nhe, BSMhalfedge *mhe,
00253                                    int nfac, BSMfacet *mfac, int *mfhei,
00254                                    int v, int *dist );
00255 
00256 /* 2. measured with the number of facets (assuming that facets with a common) */
00257 /*    vertex are neighbours */
00258 boolean bsm_FindVertexDistances2 ( int nv, BSMvertex *mv, int *mvhei,
00259                                    int nhe, BSMhalfedge *mhe,
00260                                    int nfac, BSMfacet *mfac, int *mfhei,
00261                                    int v, int *dist );
00262 
00263 /* procedures of changing the mesh topology */
00264 int bsm_HalfedgeLoopLength ( int nv, BSMvertex *mv, int *mvhei,
00265                              int nhe, BSMhalfedge *mhe,
00266                              int he );
00267 
00268 boolean bsm_GlueHalfedgeLoopsd ( int spdimen,
00269                                  int inv, BSMvertex *imv, int *imvhei, double *ivc,
00270                                  int inhe, BSMhalfedge *imhe,
00271                                  int infac, BSMfacet *imfac, int *imfhei,
00272                                  int he1, int he2,
00273                                  int *onv, BSMvertex *omv, int *omvhei, double *ovc,
00274                                  int *onhe, BSMhalfedge *omhe,
00275                                  int *onfac, BSMfacet *omfac, int *omfhei );
00276 
00277 #ifdef __cplusplus
00278 }
00279 #endif
00280 
00281 #endif /*BSMESH_H*/
00282