RealGradient CrossIC::gradient(const Point & p) { Point pxminus = p, pxplus = p, pyminus = p, pyplus = p; pxminus(0) -= TOLERANCE; pyminus(1) -= TOLERANCE; pxplus(0) += TOLERANCE; pyplus(1) += TOLERANCE; Number uxminus = value(pxminus), uxplus = value(pxplus), uyminus = value(pyminus), uyplus = value(pyplus); return Gradient((uxplus - uxminus) / 2.0 / TOLERANCE, (uyplus - uyminus) / 2.0 / TOLERANCE); }
Vector3D Terrain::norm(const Vector2D &p) const { Vector2D px(p.x()+epsilon,p.y()); Vector2D pxminus(p.x()-epsilon, p.y()); Vector2D py(p.x(),p.y()+epsilon); Vector2D pyminus(p.x(),p.y()-epsilon); double hpx=getHauteur(px); double hpxminus = getHauteur(pxminus); double hpy=getHauteur(py); double hpyminus = getHauteur(pyminus); Vector3D resu(-(hpx-hpxminus),2*epsilon,-(hpy-hpyminus)); resu.normalize(); return resu; }
Vector3D Terrain::norm(const Vector2D &p) { /* Vector2D px(p.x()+epsilon,p.y()); Vector2D py(p.x(),p.y()+epsilon); double hp=getHauteur(p); double hpx=getHauteur(px); double hpy=getHauteur(py); Vector3D vp(p.x(),p.y(),(double)hp); Vector3D vpx(px.x(),px.y(),(double)hpx); Vector3D vpy(py.x(),py.y(),(double)hpy); Vector3D u=vpx-vp; Vector3D v=vpy-vp; Vector3D n(-u.z()/u.x(),1.0f,-v.z()/v.y()); n.normalize(); return n;*/ //std::cout<<p.x()<<" "<<p.x()+epsilon<<std::endl; Vector2D px(p.x()+epsilon,p.y()); Vector2D pxminus(p.x()-epsilon, p.y()); Vector2D py(p.x(),p.y()+epsilon); Vector2D pyminus(p.x(),p.y()-epsilon); double hpx=getHauteur(px); double hpxminus = getHauteur(pxminus); double hpy=getHauteur(py); double hpyminus = getHauteur(pyminus); //std::cout<<hpx<<" "<<hpxminus<<std::endl; Vector3D resu(-(hpx-hpxminus),2*epsilon,-(hpy-hpyminus)); resu.normalize(); return resu; }