00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _vtkNURSubdivisionFilter_h_
00021 #define _vtkNURSubdivisionFilter_h_
00022
00023 #include "vtkApproximatingSubdivisionFilter.h"
00024 #include "vtkEdgeTable.h"
00025 #include "vtkLookupTable.h"
00026
00027 class vtkPolyData;
00028 class vtkIntArray;
00029 class vtkPoints;
00030 class vtkIdList;
00031
00032 class CWeightTable;
00033
00034 class vtkNURSubdivisionFilter : public vtkApproximatingSubdivisionFilter
00035 {
00036 public:
00037 static vtkNURSubdivisionFilter *New();
00038
00039 vtkTypeRevisionMacro(vtkNURSubdivisionFilter,vtkApproximatingSubdivisionFilter);
00040
00041 void SetEdgeData(vtkEdgeTable *edges);
00042
00043 protected:
00044 vtkNURSubdivisionFilter () { nKnownEdgepoints=0;
00045 KnownEdgepoints=NULL;
00046 WeightTable = NULL;
00047 };
00048
00049 ~vtkNURSubdivisionFilter () {};
00054 void Execute();
00055 void GenerateSubdivisionPoints (vtkPolyData *inputDS, vtkIntArray *edgeData,
00056 vtkPoints *outputPts,
00057 vtkPointData *outputPD);
00061 void GenerateFacePoints();
00062
00066 void GenerateEdgePoints();
00067
00071 void GenerateVertexPoints();
00072
00076 float GetNewFEWeigth(vtkIdType FaceId, vtkIdType p1, vtkIdType p2);
00077
00081 float GetNewEEWeigth(vtkIdType EdgeIdForm, vtkIdType EdgeIdTo);
00082
00083 private:
00087 float dijk(vtkIdType pi, vtkIdType pj, short k);
00088
00092 float alpha(vtkIdType pi, vtkIdType pj);
00093
00094
00098 vtkIdType LookupEdge(vtkIdType pi, vtkIdType pj);
00099
00103 void EnterEdge(vtkIdType pi, vtkIdType pj, vtkIdType Id);
00104
00108 vtkIdType *KnownEdgepoints;
00109
00113 vtkIdType nKnownEdgepoints;
00114
00115 vtkNURSubdivisionFilter(const vtkNURSubdivisionFilter&);
00116 void operator=(const vtkNURSubdivisionFilter&);
00117
00118 CWeightTable *WeightTable,
00119 *TmpWeightTable;
00120
00121 vtkCellArray *InputFaces_;
00122 vtkPoints *NewFacePoints_;
00123 vtkPoints *NewEdgePoints_;
00124
00125 vtkPolyData *input_;
00126 vtkPoints *outputPts_;
00127 vtkCellArray *outputPolys_;
00128 };
00129
00130
00131
00132 class CWeightTable
00133 {
00134 public:
00135
00140 CWeightTable(vtkIdType NumberOfEdges)
00141 {
00142
00143 Data = (float *) malloc(sizeof(float)*NumberOfEdges);
00144 EdgeIds = (vtkIdType *) malloc(2*sizeof(vtkIdType)*NumberOfEdges);
00145 counter = 0;
00146 }
00147
00152 ~CWeightTable() {
00153
00154 free(Data);
00155 free(EdgeIds);
00156 }
00157
00162 float Lookup(vtkIdType pi, vtkIdType pj)
00163 {
00164 int i=0;
00165 vtkIdType *K = EdgeIds;
00166
00167 while (i<counter)
00168 {
00169 if ( ((K[0] == pi) && (K[1] == pj)) ||
00170 ((K[1] == pi) && (K[0] == pj)) )
00171 {
00172
00173 return Data[i];
00174 }
00175 K += 2;
00176 i++;
00177 }
00178
00179 return 1;
00180 }
00181
00185 void Insert(vtkIdType pi, vtkIdType pj, float weight)
00186 {
00187 int i=0;
00188 vtkIdType *K = EdgeIds;
00189
00190 while (i<counter)
00191 {
00192
00193 K += 2;
00194 if ( ((K[0] == pi) && (K[1] == pj)) ||
00195 ((K[1] == pi) && (K[0] == pj)) )
00196 {
00197 return;
00198 }
00199 i++;
00200 }
00201
00202 K[0] = pi;
00203 K[1] = pj;
00204 Data[counter]=weight;
00205 counter++;
00206 }
00207
00211 void printself() {
00212 for (int i=0; i < counter; i++)
00213 printf("E[%i]-[%i, %i]: %f\n", i, EdgeIds[2*i], EdgeIds[2*i+1], Data[i]);
00214 }
00215
00216 private:
00217 vtkIdType counter;
00218 float *Data;
00219 vtkIdType *EdgeIds;
00220 };
00221 #endif