$search
00001 /* 00002 James R. Diebel 00003 Stanford University 00004 00005 Started: 27 August 2004 00006 Last revised: 27 Sugust 2004 00007 00008 vert.cc - class implementation of Vert class (vert.hh) 00009 00010 Depends on vert.hh 00011 */ 00012 00013 #include "bmtk/vert.hh" 00014 00015 namespace bmtk { 00016 00017 // Constructor/Destructor 00018 Vert::Vert() { 00019 nf = ne = 0; 00020 i = -1; 00021 l = psi = 0.0; 00022 bound = false; 00023 flag = marker = -1; 00024 depth = 0.0f; 00025 } 00026 Vert::~Vert() { 00027 if (nf) delete [] f; 00028 if (ne) delete [] e; 00029 if (ne) delete [] v; 00030 if (m) if (m->nd) delete [] xs; 00031 } 00032 00033 // Member functions 00034 void Vert::findNormal() { 00035 n = 0.0f; 00036 for (int j=0;j<nf;j++) if (f[j]) n += f[j]->n; 00037 n.normalize(); 00038 } 00039 00040 void Vert::findLength() { 00041 l = 0; 00042 int count = 0; 00043 for (int j=0;j<ne;j++) if (e[j]) {l += e[j]->l; count++;} 00044 if (count > 0) l /= float(count); else l=0; 00045 } 00046 00047 void Vert::findPotential() { 00048 Vec3d temp = (x - x0); 00049 psi = temp.dot(iCov*temp)/(m->gs2); 00050 } 00051 00052 void Vert::findDepth() { 00053 Vec3d center(0,0,-1); 00054 depth = x.distTo(center) - 0.8; 00055 } 00056 00057 void Vert::refreshLocale() { 00058 for (int j=0;j<nf;j++) { 00059 f[j]->findNormal(); 00060 for (int k=0;k<3;k++) f[j]->e[k]->flag = -1; 00061 } 00062 for (int j=0;j<nf;j++) for (int k=0;k<3;k++) { 00063 if (f[j]->e[k]->flag != i) { 00064 f[j]->e[k]->findPotential(); 00065 f[j]->e[k]->flag = i; 00066 } 00067 } 00068 for (int j=0;j<nf;j++) for (int k=0;k<3;k++) f[j]->e[k]->flag = -1; 00069 } 00070 00071 void Vert::findLocalEdgePotential() { 00072 psiEdge = 0; 00073 00074 for (int j=0;j<nf;j++) { 00075 for (int k=0;k<3;k++) { 00076 if (f[j]->e[k]->flag != i) { 00077 psiEdge += f[j]->e[k]->psi; 00078 f[j]->e[k]->flag = i; 00079 } 00080 } 00081 } 00082 psiLocal = psi + psiEdge; 00083 } 00084 00085 void Vert::findGradient() { 00086 gradPsi0 = gradPsi; 00087 normGradPsi0 = normGradPsi; 00088 gradPsi = (2/m->gs2)*(x - x0); 00089 gradPsi *= iCov; 00090 for (int j=0;j<nf;j++) { 00091 for (int k=0;k<3;k++) { 00092 if (f[j]->e[k]->flag != i) { 00093 gradPsi += f[j]->e[k]->gradient(*this); 00094 f[j]->e[k]->flag = i; 00095 } 00096 } 00097 } 00098 normGradPsi = ~gradPsi; 00099 } 00100 00101 void Vert::findSearchDir(float beta) { 00102 dir = dir0; 00103 dir *= beta; 00104 dir -= gradPsi; 00105 } 00106 00107 00108 void Vert::move(float globalStep) { 00109 if (!bound || 1) { 00110 x = xr; 00111 x += globalStep*dir; 00112 } 00113 } 00114 00115 void Vert::move() { 00116 if (!bound || 1) { 00117 x = xr; 00118 x += step*dir; 00119 } 00120 } 00121 00122 void Vert::flatten() { 00123 Vec3d delta = 0.0f; 00124 for (int j=0;j<nf;j++) { 00125 //delta += f[j]->n*(xr - f[j]->x).dot(f[j]->n); 00126 delta += (xr - f[j]->x); 00127 } 00128 if (nf > 0) delta /= nf; 00129 if (bound && 0) 00130 x -= n*delta.dot(n); 00131 else 00132 x -= delta; 00133 } 00134 00135 // Equality tests 00136 bool Vert::operator == (const Vert &vp) const { 00137 return (this == &vp); 00138 } 00139 bool Vert::operator != (const Vert &vp) const { 00140 return (this != &vp); 00141 } 00142 00143 // Define << operator to handle output to screen 00144 ostream& operator << (ostream& os, const Vert &v) { 00145 return os<<"v"<<v.i<<": "<<v.x<<endl<<flush; 00146 } 00147 00148 } // namespace bmtk