From: Gong D. <gd...@us...> - 2008-10-14 04:23:08
|
Hi, There is a small bug in on_surface function. Most of the people may not meet this bug. Unfortunately, I was troubled much with it. Here is the fix. bool Plane::on_surface (const Point& p) const { // Create a vector from the surface to point p; const Point w = p - _point; // If the projection of that vector onto the // plane's normal is 0 then the point is in // the plane. const Real proj = w*this->normal(); if ( std::abs(proj) < 1.e-10 ) return true; return false; } An useful constructor of building sphere from 4 points. Will you please add it to libmesh? Sphere::Sphere (const Point& pa, const Point& pb, const Point& pc, const Point& pd) { Point pad = pa - pd; Point pbd = pb - pd; Point pcd = pc - pd; TensorValue<Real> T(pad,pbd,pcd); // the det Real D = T.det(); assert (std::abs(D) > 1e-12); Real e = 0.5*(pa.size_sq() - pd.size_sq()); Real f = 0.5*(pb.size_sq() - pd.size_sq()); Real g = 0.5*(pc.size_sq() - pd.size_sq()); TensorValue<Real> T1(e,pad(1),pad(2), f,pbd(1),pbd(2), g,pcd(1),pcd(2)); Real sx = T1.det()/D; TensorValue<Real> T2(pad(0),e,pad(2), pbd(0),f,pbd(2), pcd(0),g,pcd(2)); Real sy = T2.det()/D; TensorValue<Real> T3(pad(0),pad(1),e, pbd(0),pbd(1),f, pcd(0),pcd(1),g); Real sz = T3.det()/D; Point c(sx,sy,sz); Real r = (c-pa).size(); this->create_from_center_radius (c, r); } Gong Ding |