Trajectory.cpp
Go to the documentation of this file.
00001 /***
00002  Basic structure for streamline
00003  ***/
00004 #include "tensor_field_nav_core/Trajectory.h"
00005 Trajectory::Trajectory(int index, int curMaxNum = 200){
00006         this->index = index;
00007 
00008         if(curMaxNum==0)
00009         {
00010                 linesegs=NULL;
00011                 curMaxNumLinesegs=0;
00012                 return;
00013         }
00014 
00015         linesegs = (LineSeg *)malloc(sizeof(LineSeg)*curMaxNum);
00016 
00017         if(linesegs == NULL)
00018         {
00019                 exit(-1);
00020         }
00021 
00022         int i;
00023         for(i=0;i<curMaxNum;i++)
00024         {
00025                 linesegs[i].gend[0]=linesegs[i].end[0]=linesegs[i].gstart[0]=linesegs[i].start[0]=
00026                         linesegs[i].gend[1]=linesegs[i].end[1]=linesegs[i].gstart[1]=linesegs[i].start[1]=0.;
00027                 linesegs[i].length=0;
00028                 linesegs[i].Triangle_ID=0;
00029         }
00030     linked_degpt_id=-1;
00031         curMaxNumLinesegs = curMaxNum;
00032         nlinesegs = 0;
00033     infoGain=0.0;
00034     is_reach_degpt=false;
00035     is_reach_unknown=false;
00036 }
00037 
00038 Trajectory::~Trajectory()
00039 {
00040         if(curMaxNumLinesegs > 0)
00041         {
00042                 free(linesegs);
00043                 curMaxNumLinesegs=0;
00044         }
00045 }
00046 
00047 bool Trajectory::extend_line_segments(int add_size)
00048 {
00049 
00050         LineSeg *extendlist=(LineSeg*)malloc(sizeof(LineSeg)*(curMaxNumLinesegs+add_size));
00051 
00052         if(extendlist == NULL)
00053                 //if(linesegs == NULL)
00054         {
00055                 return false;
00056         }
00057 
00058         int i;
00059         for(i = 0; i < curMaxNumLinesegs; i++)
00060         {
00061                 extendlist[i].end[0] = linesegs[i].end[0];
00062                 extendlist[i].end[1] = linesegs[i].end[1];
00063 
00064                 extendlist[i].start[0] = linesegs[i].start[0];
00065                 extendlist[i].start[1] = linesegs[i].start[1];
00066 
00067                 extendlist[i].gend[0] = linesegs[i].gend[0];
00068                 extendlist[i].gend[1] = linesegs[i].gend[1];
00069 
00070                 extendlist[i].gstart[0] = linesegs[i].gstart[0];
00071                 extendlist[i].gstart[1] = linesegs[i].gstart[1];
00072 
00073                 extendlist[i].length = linesegs[i].length;
00074                 extendlist[i].Triangle_ID = linesegs[i].Triangle_ID;
00075 
00076         }
00077         free(linesegs);
00078 
00079         linesegs = extendlist;
00080 
00081         for(i=curMaxNumLinesegs;i<curMaxNumLinesegs+add_size;i++)
00082         {
00083                 linesegs[i].gend[0]=linesegs[i].end[0]=linesegs[i].gstart[0]=linesegs[i].start[0]=
00084                         linesegs[i].gend[1]=linesegs[i].end[1]=linesegs[i].gstart[1]=linesegs[i].start[1]=0.;
00085                 linesegs[i].length=0;
00086                 linesegs[i].Triangle_ID=0;
00087         }
00088 
00089         curMaxNumLinesegs += add_size;
00090         return true;
00091 }
00092 
00093 /*get the flow length of the streamline*/
00094 double Trajectory::get_length()
00095 {
00096         int i;
00097         double len = 0;
00098         for(i = 0 ; i < nlinesegs; i++)
00099                 len += linesegs[i].length;
00100         return len;
00101 }
00102 
00103 
00104 //remove the front n line segments
00105 bool Trajectory::remove_front_nlines(int n)
00106 {
00107         if(nlinesegs-n<0) return false;
00108         /*move the content forward*/
00109         int i;
00110         for(i=0;i<nlinesegs-n;i++)
00111         {
00112                 linesegs[i].gstart[0]=linesegs[i+n].gstart[0];
00113                 linesegs[i].gstart[1]=linesegs[i+n].gstart[1];
00114                 linesegs[i].gend[0]=linesegs[i+n].gend[0];
00115                 linesegs[i].gend[1]=linesegs[i+n].gend[1];
00116 
00117                 linesegs[i].start[0]=linesegs[i+n].start[0];
00118                 linesegs[i].start[1]=linesegs[i+n].start[1];
00119                 linesegs[i].end[0]=linesegs[i+n].end[0];
00120                 linesegs[i].end[1]=linesegs[i+n].end[1];
00121 
00122                 linesegs[i].length=linesegs[i+n].length;
00123                 linesegs[i].Triangle_ID=linesegs[i+n].Triangle_ID;
00124         }
00125         nlinesegs-=n;
00126         return true;
00127 }
00128 
00129 //add n new line segments in the front
00130 bool Trajectory::add_front_nlines(LineSeg *otherlinesegs, int n)
00131 {
00132         if(nlinesegs+n>=curMaxNumLinesegs)
00133         {
00134                 if(!extend_line_segments(nlinesegs+n-curMaxNumLinesegs))
00135                         exit(-1);
00136         }
00137         /*move backward n elements*/
00138         int i;
00139         if(nlinesegs>0)
00140         {
00141                 for(i=nlinesegs-1;i>=0;i--)
00142                 {
00143                         linesegs[i+n].gstart[0]=linesegs[i].gstart[0];
00144                         linesegs[i+n].gstart[1]=linesegs[i].gstart[1];
00145                         linesegs[i+n].gend[0]=linesegs[i].gend[0];
00146                         linesegs[i+n].gend[1]=linesegs[i].gend[1];
00147 
00148                         linesegs[i+n].start[0]=linesegs[i].start[0];
00149                         linesegs[i+n].start[1]=linesegs[i].start[1];
00150                         linesegs[i+n].end[0]=linesegs[i].end[0];
00151                         linesegs[i+n].end[1]=linesegs[i].end[1];
00152 
00153                         linesegs[i+n].length=linesegs[i].length;
00154                         linesegs[i+n].Triangle_ID=linesegs[i].Triangle_ID;
00155                 }
00156         }
00157 
00158         /*copy the new n line segments to the front*/
00159         for(i=0;i<n;i++)
00160         {
00161                 linesegs[i].gstart[0]=otherlinesegs[i].gstart[0];
00162                 linesegs[i].gstart[1]=otherlinesegs[i].gstart[1];
00163                 linesegs[i].gend[0]=otherlinesegs[i].gend[0];
00164                 linesegs[i].gend[1]=otherlinesegs[i].gend[1];
00165 
00166                 linesegs[i].start[0]=otherlinesegs[i].start[0];
00167                 linesegs[i].start[1]=otherlinesegs[i].start[1];
00168                 linesegs[i].end[0]=otherlinesegs[i].end[0];
00169                 linesegs[i].end[1]=otherlinesegs[i].end[1];
00170 
00171                 linesegs[i].length=otherlinesegs[i].length;
00172                 linesegs[i].Triangle_ID=otherlinesegs[i].Triangle_ID;
00173         }
00174         nlinesegs+=n;
00175         return true;
00176 }
00177 
00178 //remove the last n line segments
00179 bool Trajectory::remove_last_nlines(int n)
00180 {
00181         if(nlinesegs-n<0) return false;
00182         nlinesegs-=n;
00183         return true;
00184 }
00185 
00186 //add n new line segments at the end
00187 bool Trajectory::add_last_nlines(LineSeg *otherlinesegs, int n)
00188 {
00189         if(nlinesegs+n>=curMaxNumLinesegs)
00190         {
00191                 if(!extend_line_segments(nlinesegs+n-curMaxNumLinesegs))
00192                         exit(-1);
00193         }
00194 
00195         /*copy the content of "linesegs" to the end of current list*/
00196         int i;
00197         for(i=nlinesegs;i<n+nlinesegs;i++)
00198         {
00199                 linesegs[i].gstart[0]=otherlinesegs[i-nlinesegs].gstart[0];
00200                 linesegs[i].gstart[1]=otherlinesegs[i-nlinesegs].gstart[1];
00201                 linesegs[i].gend[0]=otherlinesegs[i-nlinesegs].gend[0];
00202                 linesegs[i].gend[1]=otherlinesegs[i-nlinesegs].gend[1];
00203 
00204                 linesegs[i].start[0]=otherlinesegs[i-nlinesegs].start[0];
00205                 linesegs[i].start[1]=otherlinesegs[i-nlinesegs].start[1];
00206                 linesegs[i].end[0]=otherlinesegs[i-nlinesegs].end[0];
00207                 linesegs[i].end[1]=otherlinesegs[i-nlinesegs].end[1];
00208 
00209                 linesegs[i].length=otherlinesegs[i-nlinesegs].length;
00210                 linesegs[i].Triangle_ID=otherlinesegs[i-nlinesegs].Triangle_ID;
00211         }
00212         nlinesegs+=n;
00213         return true;
00214 }
00215 
00216 bool Trajectory::store_to_global_line_segs(CurvePoints *temp, int num)
00217 {
00218         int i;
00219         int tempid = nlinesegs;
00220         icVector3 dis_vec;
00221 
00224         if(tempid + num - 1 >= curMaxNumLinesegs)
00225         {
00226                 //if(curMaxNumLinesegs>1000) 
00227                 //      return false; // possible bug here! 12/27/2007
00228 
00229                 if(!extend_line_segments(200))
00230                 {
00231                         return false;
00232                 }
00233         }
00234 
00235         /*save to the global list*/
00236 
00237         for( i = 0; i < num-1; i++)
00238         {
00240                 linesegs[tempid+i].gstart[0] = temp[i].gpx;
00241                 linesegs[tempid+i].gstart[1] = temp[i].gpy;
00242                 linesegs[tempid+i].start[0] = temp[i].lpx;
00243                 linesegs[tempid+i].start[1] = temp[i].lpy;
00244 
00245                 linesegs[tempid+i].gend[0] = temp[i+1].gpx;
00246                 linesegs[tempid+i].gend[1] = temp[i+1].gpy;
00247                 linesegs[tempid+i].end[0] = temp[i+1].lpx;
00248                 linesegs[tempid+i].end[1] = temp[i+1].lpy;
00249 
00251                 dis_vec.entry[0] = temp[i+1].gpx - temp[i].gpx;
00252                 dis_vec.entry[1] = temp[i+1].gpy - temp[i].gpy;
00253                 dis_vec.entry[2] = 0;
00254 
00255                 linesegs[tempid+i].length = length(dis_vec);
00256 
00257                 linesegs[tempid+i].Triangle_ID = temp[i].triangleid;
00258         }
00259 
00260         nlinesegs = tempid + num - 1;
00261         return true;
00262 }
00263 
00264 
00265 
00266 
00267 
00268 


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