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