Files Classes Functions Hierarchy
00001 00002 #include <line.h> 00003 #include <pathlineseg.h> 00004 #include <print.h> 00005 #include <stringconvert.h> 00006 #include <stringserialization.h> 00007 #include <stringtagparser.h> 00008 00009 00010 pathlineseg::pathlineseg() 00011 { 00012 pts.push_back( pt2() ); 00013 00014 } 00015 00016 pathlineseg::operator stringc const () 00017 { 00018 string str; 00019 00020 str << "<path>\n"; 00021 // TODO optionally write if variable empty 00022 str << "<info>Path line segements</info>\n"; 00023 00024 str << "<points2D>\n"; 00025 assert(pts.empty()==false); 00026 if (pts.empty()==false) 00027 { str << printvecfunc(pts.begin(),pts.size()) << "\n"; } 00028 str << "</points2D>\n"; 00029 str << "<control>\n"; 00030 if (control.empty()==false) 00031 { str << printvecfunc(control.begin(),control.size()) << "\n"; } 00032 str << "</control>\n"; 00033 str << "<segments>\n"; 00034 if (segments.empty()==false) 00035 { str << printvecfunc(segments.begin(),segments.size()) << "\n"; } 00036 str << "</segments>\n"; 00037 str << "</path>"; 00038 00039 return str; 00040 } 00041 00042 void pathlineseg::serializeInverse(stringc & str) 00043 { 00044 //assert(false); 00045 pts.clear(); 00046 control.clear(); 00047 segments.clear(); 00048 00049 stringtagparser pars(str); 00050 00051 string s1 = pars.data("info"); 00052 //cout << "*info=" << s1 << "*" << endl; 00053 string s2=pars.data("points2D"); 00054 vectorstring::serializeInverse(pts,s2); 00055 vectorstring::serializeInverse(control,pars.data("control")); 00056 vectorstring::serializeInverse(segments,pars.data("segments")); 00057 } 00058 00059 doublec pathlineseg::dist02() 00060 { 00061 double dist=dist01(); 00062 uint kmax=segments.size()/2; 00063 for (uint k=0; k<kmax; ++k) 00064 { 00065 pt2c & p0(pts[ segments[k*2] ]); 00066 pt2c & p1(pts[ segments[k*2+1] ]); 00067 dist += (p0-p1).dot(); 00068 } 00069 00070 return dist; 00071 } 00072 00073 doublec pathlineseg::dist01() 00074 { 00075 double dist=0.0; 00076 00077 uint kmax=segments.size(); 00078 uint imax=control.size(); 00079 double tpos; 00080 for (uint k=0; k<kmax; ++k, ++k) 00081 { 00082 //cout << "p" << segments[k] << " p" << segments[k+1] << " "; 00083 pt2 p0(pts[ segments[k]]); 00084 pt2 p1(pts[ segments[k+1]]); 00085 line< pt2, double > Lk(p0,p1,true); 00086 //line< pt2, double > Lk( pts[ segments[k]], pts[segments[k+1]], true ); 00087 00088 //cout << SHOW(p0) << " " << SHOW(p1) << endl; 00089 //cout << "ln" << (stringc)Lk << endl; 00090 00091 for (uint i=0; i<imax; ++i) 00092 { 00093 pt2 const & q(pts[control[i]]); 00094 //cout << SHOW(k) << " " << control[i] << " " << q << " "; 00095 if (Lk.isnormalzero()) 00096 { 00097 //cout << "nm is zero" << endl; 00098 dist += (Lk.pos-q).dot(); 00099 } 00100 else 00101 { 00102 Lk.nearestpointcapped(tpos,q); 00103 //cout << "nearest point t=" << tpos << endl; 00104 dist += (Lk(tpos)-q).dot(); 00105 } 00106 //cout << SHOW(dist) << endl; 00107 } 00108 00109 } 00110 00111 return dist; 00112 } 00113 00114 pathlinesegvec::pathlinesegvec(pathlineseg& ps_) 00115 // n = seg size /2, n is segments. 00116 // (n+1)*2 point variables 00117 : funcstate<double>( (ps_.segments.size()/2+1)*2), 00118 distfn(2), ps(ps_), pts(ps_.pts), control(ps_.control), 00119 segments(ps_.segments) 00120 { 00121 } 00122 00123 00124 doublec pathlinesegvec::operator()() 00125 { 00126 if (distfn==1) 00127 return dist01(); 00128 00129 assert(distfn==2); 00130 return dist02(); 00131 } 00132 00133 doublec pathlinesegvec::dist02() 00134 { 00135 double dist=dist01(); 00136 uint kmax=segments.size()/2; 00137 for (uint k=0; k<kmax; ++k) 00138 { 00139 pt2 p0(xi[ k*2 ],xi[k*2+1]); 00140 pt2 p1(xi[(k+1)*2],xi[(k+1)*2+1]); 00141 dist += (p0-p1).dot(); 00142 } 00143 00144 xi[dim]=dist; 00145 return xi[dim]; 00146 } 00147 00148 doublec pathlinesegvec::dist01() 00149 { 00150 double dist=0.0; 00151 00152 uint kmax=segments.size()/2; 00153 uint imax=control.size(); 00154 double tpos; 00155 for (uint k=0; k<kmax; ++k) 00156 { 00157 //cout << "p" << segments[k] << " p" << segments[k+1] << " "; 00158 pt2 p0(xi[ k*2 ],xi[k*2+1]); 00159 pt2 p1(xi[(k+1)*2],xi[(k+1)*2+1]); 00160 //cout << SHOW(p0) << " " << SHOW(p1) << endl; 00161 line< pt2, double > Lk(p0,p1,true); 00162 // cout << "ln" << (stringc)Lk << endl; 00163 00164 for (uint i=0; i<imax; ++i) 00165 { 00166 pt2 const & q(pts[control[i]]); 00167 //cout << SHOW(k) << " " << control[i] << " " << q << " "; 00168 if (Lk.isnormalzero()) 00169 { 00170 //cout << "nm is zero" << endl; 00171 dist += (Lk.pos-q).dot(); 00172 } 00173 else 00174 { 00175 Lk.nearestpointcapped(tpos,q); 00176 //cout << "nearest point t=" << tpos << endl; 00177 dist += (Lk(tpos)-q).dot(); 00178 } 00179 //cout << SHOW(dist) << endl; 00180 } 00181 } 00182 00183 //cout << SHOW(dim) << endl; 00184 xi[dim]=dist; 00185 return xi[dim]; 00186 } 00187 00188 void pathlinesegvec::read() 00189 { 00190 assertreturn(dim>0); 00191 00192 xi[0] = pts[segments[0]].x; 00193 xi[1] = pts[segments[0]].y; 00194 00195 uint j=2; 00196 uint imax=segments.size(); 00197 for ( uint i=0; i<imax; ++i,++i) 00198 { 00199 assert(i+1<imax); 00200 xi[j++] = pts[segments[i+1]].x; 00201 xi[j++] = pts[segments[i+1]].y; 00202 } 00203 } 00204 00205 void pathlinesegvec::write() 00206 { 00207 assertreturn(dim>0); 00208 assertreturn(segments.empty()==false); 00209 00210 pts[segments[0]].x = xi[0]; 00211 pts[segments[0]].y = xi[1]; 00212 00213 uint kmax=segments.size()/2; 00214 for (uint k=0; k<kmax; ++k) 00215 { 00216 pts[segments[2*k+1]].x = xi[(k+1)*2]; 00217 pts[segments[2*k+1]].y = xi[(k+1)*2+1]; 00218 } 00219 } 00220 00221
1.5.8