00001
00002
00003
00004 #ifndef BFILTERS_H_HAS_BEEN_INCLUDED
00005 #define BFILTERS_H_HAS_BEEN_INCLUDED
00006
00007 #include "bmesh.H"
00008 #include "mesh_global.H"
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 inline bool
00019 is_fold(CWpt& a, mlib::CWpt& p, mlib::CWpt& b, mlib::CWvec& n)
00020 {
00021
00022
00023
00024
00025
00026 VEXEL nv = mlib::VEXEL(p, n).perpend();
00027 return XOR((VEXEL(a, p-a) * nv) < 0, (mlib::VEXEL(b, b-p) * nv) < 0);
00028 }
00029
00030 class FoldVertFilter: public BvertFilter {
00031 public:
00032 FoldVertFilter(CSimplexFilter& f) : _edge_filter(f) {}
00033
00034
00035 virtual bool accept(CBsimplex* s) const;
00036
00037 protected:
00038 CSimplexFilter& _edge_filter;
00039 };
00040
00041
00042
00043
00044
00045
00046
00047 class VertDegreeFilter: public BvertFilter {
00048 public:
00049
00050 VertDegreeFilter(int n, CSimplexFilter& f = BedgeFilter()) :
00051 _n(n), _edge_filter(f) {}
00052
00053
00054 virtual bool accept(CBsimplex* s) const;
00055
00056 protected:
00057 int _n;
00058 CSimplexFilter& _edge_filter;
00059 };
00060
00061
00062
00063
00064
00065
00066
00067
00068 class CornerTypeVertFilter: public SimplexFilter {
00069 public:
00070 CornerTypeVertFilter(CSimplexFilter& f = BedgeFilter()) : _edge_filter(f) {}
00071
00072
00073 virtual bool accept(CBsimplex* s) const {
00074 if (!is_vert(s))
00075 return false;
00076 return ((Bvert*)s)->degree(_edge_filter) > 2;
00077 }
00078
00079 protected:
00080 CSimplexFilter& _edge_filter;
00081 };
00082
00083
00084
00085
00086
00087
00088 class VertFaceDegreeFilter: public SimplexFilter {
00089 public:
00090 VertFaceDegreeFilter(int n = 0, CSimplexFilter& f = BfaceFilter()) :
00091 _n(n), _face_filter(f) {}
00092
00093
00094 virtual bool accept(CBsimplex* s) const {
00095 if (!is_vert(s))
00096 return false;
00097 return (((Bvert*)s)->face_degree(_face_filter) == _n);
00098 }
00099
00100 protected:
00101 int _n;
00102 CSimplexFilter& _face_filter;
00103 };
00104
00105 #endif // BFILTERS_H_HAS_BEEN_INCLUDED
00106
00107