00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 # ifndef shape_polygonizer_hpp
00012 # define shape_polygonizer_hpp
00013
00014 # include <shape/list.hpp>
00015 # include <shape/mesh3d.hpp>
00016
00017 # define TMPL template<class C,class V, class Input, class Output>
00018 # define TMPL1 template<class V>
00019 # define SELF polygonizer<C,V,Input,Output>
00020
00021 namespace mmx { namespace shape {
00022
00023
00024 template<class C, class V=default_env, class Input = Seq< cell<C,V>* >, class Output = mesh3d<C,default_env> >
00025 struct polygonizer: public PROCESS_OF(V)
00026 {
00027
00028
00029
00030 typedef typename use<mesh3d_def,C,V>::Point Point;
00031 typedef typename use<mesh3d_def,C,V>::Edge Edge;
00032 typedef typename use<mesh3d_def,C,V>::Face Face;
00033
00034 polygonizer(void);
00035 ~polygonizer(void) ;
00036
00037 void set_input (Input* i) { m_input = i; }
00038 Input* get_input (void) const { return m_input; }
00039
00040 void set_output (Output* o) { m_output = o; }
00041 Output* get_output (void) const { return m_output; }
00042
00043 void run();
00044 void run(unsigned n, C m=0, C M=1);
00045
00046 void clear(void);
00047
00048 private:
00049 Input* m_input;
00050 Output* m_output;
00051 };
00052
00053 TMPL SELF::polygonizer(void) {
00054 m_output = new Output;
00055 }
00056
00057 TMPL SELF::~polygonizer(void) {
00058 delete m_output;
00059 }
00060
00061 TMPL void SELF::run() {
00062
00063 Point points[8];
00064 C values[8];
00065
00066 Input L = *this->get_input();
00067
00068 for(unsigned c=0; c< this->get_input()->size();c+=8){
00069
00070 for(unsigned j=0; j<8; j++) {
00071 points[j] = L[c+j]->center();
00072 values[j] = L[c+j]->center_value();
00073 }
00074
00075 marching_cube::polygonize(*this->get_output(),points, values);
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 }
00087
00088
00089
00090
00091
00092
00093 }
00094 TMPL void SELF::run(unsigned n, C m, C M) {
00095
00096 C s=(M-m)/n;
00097 Point points[8];
00098 C values[8];
00099
00100 Input L = *this->get_input();
00101
00102 for(unsigned c=0; c< this->get_input()->size();c+=8){
00103
00104 for(unsigned j=0; j<8; j++) {
00105 points[j] = L[c+j]->center();
00106 values[j] = L[c+j]->center_value()-m;
00107 }
00108
00109 for(unsigned i=0; i<n+1; i++) {
00110 marching_cube::polygonize(*this->get_output(),points, values);
00111 for(unsigned j=0; j<8; j++) {
00112 values[j] += s;
00113 }
00114 }
00115 }
00116
00117 }
00118
00119 TMPL void SELF::clear(void) {
00120 }
00121
00122
00123 } ;
00124 } ;
00125
00126 # undef TMPL
00127 # undef TMPL1
00128 # undef SELF
00129 # endif