proj home

Files   Classes   Functions   Hierarchy  

pathlineseg.cpp

Go to the documentation of this file.
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 

Generated on Fri Mar 4 00:49:25 2011 for Chelton Evans Source by  doxygen 1.5.8