KeyFrameList.cpp
Go to the documentation of this file.
00001 /***
00002  Implementation of keyframe class for keyframe data storage and time-varying tensor field computing
00003  ***/
00004 #include "tensor_field_nav_core/KeyFrameList.h"
00005 KeyFrameList::KeyFrameList(int initsize)
00006 {
00007         if(initsize == 0)
00008         {
00009                 keyframes = NULL;
00010                 nkeyframes = curMaxNum = 0;
00011                 return;
00012         }
00013 
00014         keyframes=(OneKeyFrame**)malloc(sizeof(OneKeyFrame*)*initsize);
00015         int i;
00016         for(i=0; i<initsize; i++)
00017                 keyframes[i] = NULL;
00018         nkeyframes = 0;
00019         curMaxNum = initsize;
00020 }
00021 
00022 /*    Destructor    */
00023 KeyFrameList::~KeyFrameList()
00024 {
00025         if(keyframes == NULL)
00026                 return;
00027 
00028         int i;
00029         for(i=0; i<curMaxNum; i++)
00030         {
00031                 if(keyframes[i] == NULL)
00032                         continue;
00033 
00034                 release_oneSlice(keyframes[i]);
00035         }
00036 
00037         free(keyframes);
00038 }
00039 
00040 /*   release the space of the given pointer to the frame data   */
00041 void KeyFrameList::release_oneSlice(OneKeyFrame *onekeyframe)
00042 {
00043         free(onekeyframe->jacobian_vals);
00044         onekeyframe->nverts = onekeyframe->keyFrameID = 0;
00045         onekeyframe = NULL;
00046         nkeyframes--;
00047 }
00048 
00049 /*   add one new slice (allocate memory)   */
00050 void KeyFrameList::add_oneSlice(int nverts, int spec_sliceID)
00051 {
00052         if(isFull())
00053         {
00054                 if(!extend())
00055                         exit(-1);
00056         }
00057 
00058         keyframes[nkeyframes]=(OneKeyFrame*)malloc(sizeof(OneKeyFrame));
00059         keyframes[nkeyframes]->jacobian_vals =(icMatrix2x2*)malloc(sizeof(icMatrix2x2)*nverts);
00060 
00061         if(keyframes[nkeyframes]->jacobian_vals == NULL) exit(-1);
00062     keyframes[nkeyframes]->vec_vals = (icVector2*)malloc(sizeof(icVector2)*nverts);
00063 
00064     if(keyframes[nkeyframes]->vec_vals == NULL) exit(-1);
00065         keyframes[nkeyframes]->nverts = nverts;
00066         keyframes[nkeyframes]->keyFrameID = spec_sliceID;
00067 
00068         /*  re-order the key frames  */
00069         int i, pos = -1;
00070         OneKeyFrame *curFrame = keyframes[nkeyframes];
00071 
00072         for(i=0; i<nkeyframes; i++)
00073         {
00074                 if(curFrame->keyFrameID<keyframes[i]->keyFrameID)
00075                 {
00076                         pos = i;
00077                         break;
00078                 }
00079         }
00080 
00081         if(pos >= 0 && pos < nkeyframes)
00082         {
00083                 /*  move backward  */
00084                 for(i=nkeyframes-1; i>=pos; i--)
00085                 {
00086                         keyframes[i+1]=keyframes[i];
00087                 }
00088 
00089                 keyframes[pos]=curFrame;
00090         }
00091 
00092         nkeyframes ++;
00093 }
00094 
00095 /*  add the vector value at a vertex to current frame  */
00096 void KeyFrameList::add_vec_to_curFrame(int vertID, icMatrix2x2 &jarcobian)
00097 {
00098         if(keyframes == NULL) return;
00099 
00100         if(vertID>=keyframes[nkeyframes]->nverts) return;
00101 
00102         keyframes[nkeyframes]->jacobian_vals[vertID]=jarcobian;
00103 }
00104 
00105 /*  add the vector value at a vertex to the specified frame  */
00106 bool KeyFrameList::add_jar_to_specFrame(int frameID, int vertID, icMatrix2x2 &jarcobian){
00107         /*   search for the frame   */
00108         int i, pos = -1;
00109 
00110         for(i=0; i<nkeyframes; i++)
00111         {
00112                 if(keyframes[i]->keyFrameID == frameID)
00113                 {
00114                         pos = i;
00115                         break;
00116                 }
00117         }
00118 
00119         if(pos < 0) return false;
00120 
00121         if(vertID>=keyframes[pos]->nverts) return false;
00122         keyframes[pos]->jacobian_vals[vertID]=jarcobian;
00123 
00124         return true;
00125 }
00126 
00127 bool KeyFrameList::add_jar_to_specFrame(OneKeyFrame *theframe, int vertID,icMatrix2x2 &jarcobian)
00128 {
00129 
00130         if(theframe == NULL) return false;
00131 
00132         if(vertID>=theframe->nverts) return false;
00133 
00134         theframe->jacobian_vals[vertID]=jarcobian;
00135         return true;
00136 }
00137 
00138 bool KeyFrameList::add_vec_to_specFrame(int frameID, int vertID, double vx, double vy)
00139 {
00140     /*   search for the frame   */
00141     int i, pos = -1;
00142 
00143     for(i=0; i<nkeyframes; i++)
00144     {
00145         if(keyframes[i]->keyFrameID == frameID)
00146         {
00147             pos = i;
00148             break;
00149         }
00150     }
00151 
00152     if(pos < 0) return false;
00153 
00154     if(vertID>=keyframes[pos]->nverts) return false;
00155 
00156     keyframes[pos]->vec_vals[vertID].entry[0]=vx;
00157     keyframes[pos]->vec_vals[vertID].entry[1]=vy;
00158     return true;
00159 }
00160 
00161 
00162 bool KeyFrameList::add_vec_to_specFrame(OneKeyFrame *theframe, int vertID, double vx, double vy)
00163 {
00164 
00165     if(theframe == NULL) return false;
00166 
00167     if(vertID>=theframe->nverts) return false;
00168 
00169     theframe->vec_vals[vertID].entry[0]=vx;
00170     theframe->vec_vals[vertID].entry[1]=vy;
00171     return true;
00172 }
00173 
00174 
00175 OneKeyFrame* KeyFrameList::get_frame_pointer(int frameID)
00176 {
00177         int i, pos = -1;
00178 
00179         for(i=0; i<nkeyframes; i++)
00180         {
00181                 if(keyframes[i]->keyFrameID == frameID)
00182                 {
00183                         pos = i;
00184                         break;
00185                 }
00186         }
00187 
00188         if(pos < 0) return NULL;
00189 
00190         return keyframes[pos];
00191 }
00192 
00193 /*   save the current design vector field at the specified frame   */
00194 void KeyFrameList::save_cur_field(int frameID, QuadMesh *obj)
00195 {
00196         add_oneSlice(obj->nverts, frameID);
00197 
00198         OneKeyFrame *theframe = get_frame_pointer(frameID);
00199 
00200         int i;
00201 
00202         for(i=0; i<obj->nverts; i++)
00203         {
00204                 add_jar_to_specFrame(theframe,i, obj->quad_verts[i]->Jacobian);
00205         add_vec_to_specFrame(theframe, i, obj->quad_verts[i]->major.entry[0], obj->quad_verts[i]->major.entry[1]);
00206         }
00207 }
00208 
00209 /*  save the current field to a specified frame in the list 
00210 (assume it has been initialized)  */
00211 void KeyFrameList::add_curField_to_frame (int pos, QuadMesh *obj, int frameID)
00212 {
00213         if (pos < 0 || pos >= nkeyframes) return;
00214 
00215         OneKeyFrame *frame = keyframes[pos];
00216 
00217         for (int i=0; i<obj->nverts; i++)
00218         {
00219                 add_jar_to_specFrame (frame, i, obj->quad_verts[i]->Jacobian);
00220         }
00221 
00222         frame->keyFrameID = frameID;
00223 }
00224 
00225 void KeyFrameList::copy_frame_to_specFrame(OneKeyFrame *source, int frameID)
00226 {
00227         OneKeyFrame *theframe = get_frame_pointer(frameID);
00228 
00229         if (theframe == NULL) return;
00230 
00231         int i;
00232 
00233         for (i=0; i<theframe->nverts; i++)
00234         {
00235                 add_jar_to_specFrame(theframe, i, source->jacobian_vals[i]);
00236         }
00237 }
00238 
00239 /*   reset the specified frame given the frame ID   */
00240 bool KeyFrameList::reset_specFrame(int frameID)
00241 {
00242         /*   search for the frame   */
00243         int i, pos = -1;
00244 
00245         for(i=0; i<nkeyframes; i++)
00246         {
00247                 if(keyframes[i]->keyFrameID == frameID)
00248                 {
00249                         pos = i;
00250                         break;
00251                 }
00252         }
00253 
00254         if(pos < 0) return false;
00255 
00256         for(i=0; i<keyframes[pos]->nverts; i++)
00257                 keyframes[pos]->jacobian_vals[i]=0.0;
00258 
00259         return true;
00260 }
00261 
00262 /*   reset the specified frame given the pointer of the frame data   */
00263 void KeyFrameList::reset_one_frame(OneKeyFrame *onekeyframe)
00264 {
00265         int i;
00266 
00267         for(i=0; i<onekeyframe->nverts; i++)
00268                 onekeyframe->jacobian_vals[i]=0.0;
00269 }
00270 
00271 bool KeyFrameList::isFull()
00272 {
00273         if(nkeyframes >= curMaxNum) return true;
00274         return false;
00275 }
00276 
00277 /*   extend the list   */
00278 bool KeyFrameList::extend(int step)
00279 {
00280         OneKeyFrame **temp = keyframes;
00281 
00282         keyframes = (OneKeyFrame**)malloc(sizeof(OneKeyFrame*)*(curMaxNum+step));
00283 
00284         if(keyframes == NULL)
00285                 return false;
00286 
00287         int i;
00288         for(i=0; i<curMaxNum; i++)
00289                 keyframes[i]=temp[i];
00290 
00291         for(i=curMaxNum; i<curMaxNum+step; i++)
00292                 keyframes[i]=NULL;
00293 
00294         curMaxNum += step;
00295         return true;
00296 }


tensor_field_nav_core
Author(s): Lintao Zheng, Kai Xu
autogenerated on Thu Jun 6 2019 19:50:56