Classes | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes
imesh_imls_surface Class Reference

#include <imesh_imls_surface.h>

List of all members.

Classes

struct  integral_data
 a data structure to hold the integral terms. More...

Public Member Functions

 imesh_imls_surface (const imesh_mesh &mesh, double eps=0.01, double lambda=0.1, bool enforce_bounded=false, const vcl_set< unsigned int > &no_normal_faces=vcl_set< unsigned int >())
 Constructor.
 imesh_imls_surface (const imesh_imls_surface &other)
 Copy Constructor.
double operator() (const vgl_point_3d< double > &p) const
 evaluate the implicit surface at a point.
double operator() (double x, double y, double z) const
 evaluate the implicit surface at a point.
double w2 (double dist2) const
 evaluate the squared weighting function given a squared distance.
vgl_box_3d< double > bounding_box () const
 return a bounding box for the original input mesh.
double deriv (const vgl_point_3d< double > &p, vgl_vector_3d< double > &dp) const
 evaluate the function and its derivative (returned by reference).
double deriv2 (const vgl_point_3d< double > &p, vgl_vector_3d< double > &dp, vnl_double_3x3 &ddp) const
 evaluate the function and its first and second derivatives (returned by reference).
void set_epsilon (double eps)
 change the epsilon (smoothness) of the surface.
void set_lambda (double lambda)
 change the lambda (accuracy parameter).

Static Public Member Functions

static void line_integrals (double k1, double k2, double &I1, double &Ix)
 integrals of f(x)dx and x*f(x)dx over [0,1] where f(x)= 1/((x+k1)^2 + k2)^2.
static void line_integrals (double k1, double k2, double &I1, double &Ix, double &dI1, double &dIx, double &dIx2)
 integrals of f(x)dx and x*f(x)dx over [0,1] where f(x)= 1/((x+k1)^2 + k2)^2.
static double line_integral (const vgl_point_3d< double > &x, const vgl_point_3d< double > &p0, const vgl_point_3d< double > &p1, double v0, double v1, double eps)
 line integral of the squared weight function times a linear value on the line from p0 to p1.
static vgl_vector_3d< double > line_integral_deriv (const vgl_point_3d< double > &x, const vgl_point_3d< double > &p0, const vgl_point_3d< double > &p1, double v0, double v1, double eps2)
 The derivative of the line integral with respect to x.
static vgl_vector_2d< double > split_triangle_quadrature (const vgl_point_3d< double > &x, const vgl_point_3d< double > &m, const vgl_point_3d< double > &pp, const vgl_point_3d< double > &pm, double v0, double v1, double v2, double eps)
 area integral of the squared weight function times a linearly interpolated value.
template<class T , class F >
static T triangle_quadrature (F quad_func, const vgl_point_3d< double > &x, const vgl_point_3d< double > &p0, const vgl_point_3d< double > &p1, const vgl_point_3d< double > &p2, const vgl_vector_3d< double > &n, double v0, double v1, double v2, double eps)
 area integral of the squared weight function times a linearly interpolated value.
static integral_data split_triangle_quadrature_with_deriv (const vgl_point_3d< double > &x, const vgl_point_3d< double > &m, const vgl_point_3d< double > &pp, const vgl_point_3d< double > &pm, double v0, double v1, double v2, double eps)
 area integral of the squared weight function times a linearly interpolated value.

Private Member Functions

void compute_centroids_rec (const vcl_auto_ptr< imesh_kd_tree_node > &node, const vcl_set< unsigned int > &no_normal_faces)
 recursively compute the area weighted centroids.
void compute_unweighed_rec (const vcl_auto_ptr< imesh_kd_tree_node > &node)
 recursively compute the unweighted integrals.
void compute_iso_level ()
 compute the iso value such that the mean value at the vertices is zero.
void compute_enclosing_phi ()
 adjust the phi values until all vertices are within the iso surface.

Private Attributes

vcl_vector< vgl_point_3d
< double > > 
verts_
vcl_auto_ptr
< imesh_regular_face_array< 3 > > 
triangles_
vcl_auto_ptr< imesh_kd_tree_nodekd_tree_
vcl_vector< double > phi_
vcl_vector< double > area_
vcl_vector< double > unweighted_
vcl_vector< vgl_point_3d
< double > > 
centroid_
vcl_vector< vgl_vector_3d
< double > > 
normals_
vcl_vector< double > normal_len_
double eps2_
double lambda_
double iso_level_
bool bounded_

Detailed Description

Definition at line 25 of file imesh_imls_surface.h.


Constructor & Destructor Documentation

imesh_imls_surface::imesh_imls_surface ( const imesh_mesh mesh,
double  eps = 0.01,
double  lambda = 0.1,
bool  enforce_bounded = false,
const vcl_set< unsigned int > &  no_normal_faces = vcl_set<unsigned int>() 
)

Constructor.

Definition at line 19 of file imesh_imls_surface.cxx.

imesh_imls_surface::imesh_imls_surface ( const imesh_imls_surface other)

Copy Constructor.

Definition at line 94 of file imesh_imls_surface.cxx.


Member Function Documentation

vgl_box_3d< double > imesh_imls_surface::bounding_box ( ) const

return a bounding box for the original input mesh.

Definition at line 231 of file imesh_imls_surface.cxx.

void imesh_imls_surface::compute_centroids_rec ( const vcl_auto_ptr< imesh_kd_tree_node > &  node,
const vcl_set< unsigned int > &  no_normal_faces 
) [private]

recursively compute the area weighted centroids.

Definition at line 165 of file imesh_imls_surface.cxx.

void imesh_imls_surface::compute_enclosing_phi ( ) [private]

adjust the phi values until all vertices are within the iso surface.

Also computes the iso level

Definition at line 127 of file imesh_imls_surface.cxx.

void imesh_imls_surface::compute_iso_level ( ) [private]

compute the iso value such that the mean value at the vertices is zero.

Definition at line 116 of file imesh_imls_surface.cxx.

void imesh_imls_surface::compute_unweighed_rec ( const vcl_auto_ptr< imesh_kd_tree_node > &  node) [private]

recursively compute the unweighted integrals.

Definition at line 209 of file imesh_imls_surface.cxx.

double imesh_imls_surface::deriv ( const vgl_point_3d< double > &  p,
vgl_vector_3d< double > &  dp 
) const

evaluate the function and its derivative (returned by reference).

Definition at line 368 of file imesh_imls_surface.cxx.

double imesh_imls_surface::deriv2 ( const vgl_point_3d< double > &  p,
vgl_vector_3d< double > &  dp,
vnl_double_3x3 &  ddp 
) const

evaluate the function and its first and second derivatives (returned by reference).

Definition at line 467 of file imesh_imls_surface.cxx.

double imesh_imls_surface::line_integral ( const vgl_point_3d< double > &  x,
const vgl_point_3d< double > &  p0,
const vgl_point_3d< double > &  p1,
double  v0,
double  v1,
double  eps2 
) [static]

line integral of the squared weight function times a linear value on the line from p0 to p1.

(value at p0 is v0 and at p1 is v1) eps2 is epsilon^2

Definition at line 563 of file imesh_imls_surface.cxx.

vgl_vector_3d< double > imesh_imls_surface::line_integral_deriv ( const vgl_point_3d< double > &  x,
const vgl_point_3d< double > &  p0,
const vgl_point_3d< double > &  p1,
double  v0,
double  v1,
double  eps2 
) [static]

The derivative of the line integral with respect to x.

Definition at line 581 of file imesh_imls_surface.cxx.

void imesh_imls_surface::line_integrals ( double  k1,
double  k2,
double &  I1,
double &  Ix 
) [static]

integrals of f(x)dx and x*f(x)dx over [0,1] where f(x)= 1/((x+k1)^2 + k2)^2.

These equations are wrong in the paper, they should be (for a=1): Beta = atan( k1/sqrt(k2) ) - atan( (k1+1)/sqrt(k2) ) I1 = -Beta * 1/(2*k2^(3/2)) + (k2 - k1*(k1+1)) / (2*k2*(k1^2+k2)*((k1+1)^2+k2)) Ix = Beta * k1/(2*k2^(3/2)) + (k1 + 1) / (2*k2*((k1+1)^2+k2))

Definition at line 496 of file imesh_imls_surface.cxx.

void imesh_imls_surface::line_integrals ( double  k1,
double  k2,
double &  I1,
double &  Ix,
double &  dI1,
double &  dIx,
double &  dIx2 
) [static]

integrals of f(x)dx and x*f(x)dx over [0,1] where f(x)= 1/((x+k1)^2 + k2)^2.

Also compute the integrals when f(x)=1/((x+k1)^2 + k2)^3 (for use in derivatives)

Also compute the integrals when f(x)=1/((x+k1)^2 + k2)^3 (for use in derivatives)

Beta = atan( k1/sqrt(k2) ) - atan( (k1+1)/sqrt(k2) ) I1 = -Beta * 1/(2*k2^(3/2)) + (k2 - k1*(k1+1)) / (2*k2*(k1^2+k2)*((k1+1)^2+k2)) Ix = Beta * k1/(2*k2^(3/2)) + (k1 + 1) / (2*k2*((k1+1)^2+k2)) dI1 = 1/8 * ( -Beta*3/k2^(5/2) + (5*k2^3 - (k1*(k1+1)-3)*k2^2 - k1*(k1+1)*(9*k1*(k1+1)+5)*k2 - 3*k1^3*(k1+1)^3) / (k2^2*(k1^2+k2)^2*((k1+1)^2+k2)^2) ) dIx = 1/8 * ( Beta*3*k1/k2^(5/2) + ((k1^2+k2)*((3*(k1+1)+1)*k2^2 + (k1+1)*(6*k1^2+3*k1+2)*k2 + 3*k1^2*(k1+1)^3)) /(k2^2*(k1^2+k2)^2*((k1+1)^2+k2)^2) ) dIx2 = 1/8 * ( -Beta*(3*k1^2+k2)/k2^(5/2) - ((k1^2+k2)^2*(k2^2 + (k1+1)*(4*k1-1)*k2 + 3*k1*(k1+1)^3)) /(k2^2*(k1^2+k2)^2*((k1+1)^2+k2)^2) )

Definition at line 526 of file imesh_imls_surface.cxx.

double imesh_imls_surface::operator() ( const vgl_point_3d< double > &  p) const

evaluate the implicit surface at a point.

Definition at line 288 of file imesh_imls_surface.cxx.

double imesh_imls_surface::operator() ( double  x,
double  y,
double  z 
) const [inline]

evaluate the implicit surface at a point.

Definition at line 41 of file imesh_imls_surface.h.

void imesh_imls_surface::set_epsilon ( double  eps)

change the epsilon (smoothness) of the surface.

Definition at line 238 of file imesh_imls_surface.cxx.

void imesh_imls_surface::set_lambda ( double  lambda) [inline]

change the lambda (accuracy parameter).

Definition at line 67 of file imesh_imls_surface.h.

vgl_vector_2d< double > imesh_imls_surface::split_triangle_quadrature ( const vgl_point_3d< double > &  x,
const vgl_point_3d< double > &  pm,
const vgl_point_3d< double > &  p1,
const vgl_point_3d< double > &  p2,
double  vm,
double  v1,
double  v2,
double  eps 
) [static]

area integral of the squared weight function times a linearly interpolated value.

m is the point closest point on the triangle to sample point x pp is second closest vertex and pm is the furthest call triangle_quadrature to first split an arbitrary triangle eps2 is epsilon^2

m is the point closest point on the triangle to sample point x p0 and p1 are the other vertices call triangle_quadrature to first split an arbitrary triangle eps2 is epsilon^2

Definition at line 606 of file imesh_imls_surface.cxx.

imesh_imls_surface::integral_data imesh_imls_surface::split_triangle_quadrature_with_deriv ( const vgl_point_3d< double > &  x,
const vgl_point_3d< double > &  pm,
const vgl_point_3d< double > &  p1,
const vgl_point_3d< double > &  p2,
double  vm,
double  v1,
double  v2,
double  eps 
) [static]

area integral of the squared weight function times a linearly interpolated value.

Also computes vector term used in the derivative m is the point closest point on the triangle to sample point x pp is second closest vertex and pm is the furthest call triangle_quadrature to first split an arbitrary triangle eps2 is epsilon^2

Also computes vector term used in the derivative m is the point closest point on the triangle to sample point x p0 and p1 are the other vertices call triangle_quadrature to first split an arbitrary triangle eps2 is epsilon^2

Definition at line 690 of file imesh_imls_surface.cxx.

template<class T , class F >
T imesh_imls_surface::triangle_quadrature ( quad_func,
const vgl_point_3d< double > &  x,
const vgl_point_3d< double > &  p0,
const vgl_point_3d< double > &  p1,
const vgl_point_3d< double > &  p2,
const vgl_vector_3d< double > &  n,
double  v0,
double  v1,
double  v2,
double  eps 
) [static]

area integral of the squared weight function times a linearly interpolated value.

eps2 is epsilon^2

Definition at line 18 of file imesh_imls_surface.txx.

double imesh_imls_surface::w2 ( double  dist2) const [inline]

evaluate the squared weighting function given a squared distance.

Definition at line 47 of file imesh_imls_surface.h.


Member Data Documentation

vcl_vector<double> imesh_imls_surface::area_ [private]

Definition at line 186 of file imesh_imls_surface.h.

Definition at line 195 of file imesh_imls_surface.h.

vcl_vector<vgl_point_3d<double> > imesh_imls_surface::centroid_ [private]

Definition at line 188 of file imesh_imls_surface.h.

double imesh_imls_surface::eps2_ [private]

Definition at line 192 of file imesh_imls_surface.h.

Definition at line 194 of file imesh_imls_surface.h.

Definition at line 184 of file imesh_imls_surface.h.

double imesh_imls_surface::lambda_ [private]

Definition at line 193 of file imesh_imls_surface.h.

vcl_vector<double> imesh_imls_surface::normal_len_ [private]

Definition at line 190 of file imesh_imls_surface.h.

vcl_vector<vgl_vector_3d<double> > imesh_imls_surface::normals_ [private]

Definition at line 189 of file imesh_imls_surface.h.

vcl_vector<double> imesh_imls_surface::phi_ [private]

Definition at line 185 of file imesh_imls_surface.h.

Definition at line 182 of file imesh_imls_surface.h.

vcl_vector<double> imesh_imls_surface::unweighted_ [private]

Definition at line 187 of file imesh_imls_surface.h.

vcl_vector<vgl_point_3d<double> > imesh_imls_surface::verts_ [private]

Definition at line 181 of file imesh_imls_surface.h.


The documentation for this class was generated from the following files: