Go to the documentation of this file.00001
00002
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
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
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
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
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
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
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
00106 bool KeyFrameList::add_jar_to_specFrame(int frameID, int vertID, icMatrix2x2 &jarcobian){
00107
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
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
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
00210
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
00240 bool KeyFrameList::reset_specFrame(int frameID)
00241 {
00242
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
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
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 }