<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta name="robots" content="noindex"> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>surf.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body bgcolor="#ffffff"> <!-- Generated by Doxygen 1.2.5 on Mon Oct 14 14:16:38 2002 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>surf.h</h1><div class="fragment"><pre>00001 <font class="comment">//</font> 00002 <font class="comment">// surf.h</font> 00003 <font class="comment">//</font> 00004 <font class="comment">// Copyright (C) 1996 Limit Point Systems, Inc.</font> 00005 <font class="comment">//</font> 00006 <font class="comment">// Author: Curtis Janssen <cljanss@limitpt.com></font> 00007 <font class="comment">// Maintainer: LPS</font> 00008 <font class="comment">//</font> 00009 <font class="comment">// This file is part of the SC Toolkit.</font> 00010 <font class="comment">//</font> 00011 <font class="comment">// The SC Toolkit is free software; you can redistribute it and/or modify</font> 00012 <font class="comment">// it under the terms of the GNU Library General Public License as published by</font> 00013 <font class="comment">// the Free Software Foundation; either version 2, or (at your option)</font> 00014 <font class="comment">// any later version.</font> 00015 <font class="comment">//</font> 00016 <font class="comment">// The SC Toolkit is distributed in the hope that it will be useful,</font> 00017 <font class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</font> 00018 <font class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</font> 00019 <font class="comment">// GNU Library General Public License for more details.</font> 00020 <font class="comment">//</font> 00021 <font class="comment">// You should have received a copy of the GNU Library General Public License</font> 00022 <font class="comment">// along with the SC Toolkit; see the file COPYING.LIB. If not, write to</font> 00023 <font class="comment">// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.</font> 00024 <font class="comment">//</font> 00025 <font class="comment">// The U.S. Government is granted a limited license as per AL 91-7.</font> 00026 <font class="comment">//</font> 00027 00028 <font class="preprocessor">#ifndef _math_isosurf_surf_h</font> 00029 <font class="preprocessor"></font><font class="preprocessor">#define _math_isosurf_surf_h</font> 00030 <font class="preprocessor"></font> 00031 <font class="preprocessor">#ifdef __GNUC__</font> 00032 <font class="preprocessor"></font><font class="preprocessor">#pragma interface</font> 00033 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00034 <font class="preprocessor"></font> 00035 <font class="preprocessor">#ifdef HAVE_CONFIG_H</font> 00036 <font class="preprocessor"></font><font class="preprocessor">#include <scconfig.h></font> 00037 <font class="preprocessor">#endif</font> 00038 <font class="preprocessor"></font> 00039 <font class="preprocessor">#ifdef HAVE_STL</font> 00040 <font class="preprocessor"></font><font class="preprocessor">#include <vector></font> 00041 <font class="preprocessor">#endif</font> 00042 <font class="preprocessor"></font> 00043 <font class="preprocessor">#include <util/container/array.h></font> 00044 <font class="preprocessor">#include <math/isosurf/triangle.h></font> 00045 <font class="preprocessor">#include <math/isosurf/volume.h></font> 00046 <font class="preprocessor">#include <util/render/render.h></font> 00047 00048 <font class="keyword">namespace </font>sc { 00049 00050 <font class="keyword">class </font>TriangulatedSurface: <font class="keyword">public</font> DescribedClass { 00051 <font class="keyword">protected</font>: 00052 <font class="keywordtype">int</font> _verbose; 00053 <font class="keywordtype">int</font> _debug; 00054 00055 <font class="keywordtype">int</font> _completed_surface; 00056 00057 <font class="comment">// sets of objects that make up the surface</font> 00058 AVLSet<Ref<Vertex> > _vertices; 00059 AVLSet<Ref<Edge> > _edges; 00060 AVLSet<Ref<Triangle> > _triangles; 00061 00062 <font class="comment">// map objects to an integer index</font> 00063 AVLMap<Ref<Vertex>,<font class="keywordtype">int</font>> _vertex_to_index; 00064 AVLMap<Ref<Edge>,<font class="keywordtype">int</font>> _edge_to_index; 00065 AVLMap<Ref<Triangle>,<font class="keywordtype">int</font>> _triangle_to_index; 00066 00067 <font class="comment">// map integer indices to an object</font> 00068 <font class="preprocessor">#ifdef HAVE_STL</font> 00069 <font class="preprocessor"></font> std::vector<Ref<Vertex> > _index_to_vertex; 00070 std::vector<Ref<Edge> > _index_to_edge; 00071 std::vector<Ref<Triangle> > _index_to_triangle; 00072 <font class="preprocessor">#else</font> 00073 <font class="preprocessor"></font> Array<Ref<Vertex> > _index_to_vertex; 00074 Array<Ref<Edge> > _index_to_edge; 00075 Array<Ref<Triangle> > _index_to_triangle; 00076 <font class="preprocessor">#endif</font> 00077 <font class="preprocessor"></font> 00078 <font class="comment">// mappings between array element numbers</font> 00079 <font class="keywordtype">int</font>** _triangle_vertex; 00080 <font class="keywordtype">int</font>** _triangle_edge; 00081 <font class="keywordtype">int</font>** _edge_vertex; 00082 00083 <font class="comment">// values for each of the vertices</font> 00084 <font class="keywordtype">int</font> _have_values; 00085 Arraydouble _values; 00086 00087 <font class="comment">// what to use to integrate over the surface, by default</font> 00088 Ref<TriangleIntegrator> _integrator; 00089 <font class="comment">// other integrators, in terms of time & accuracy:</font> 00090 <font class="comment">// _fast_integrator <= _integrator <= _accurate_interator</font> 00091 Ref<TriangleIntegrator> _fast_integrator; 00092 Ref<TriangleIntegrator> _accurate_integrator; 00093 00094 <font class="keywordtype">void</font> clear_int_arrays(); 00095 00096 <font class="keywordtype">void</font> complete_ref_arrays(); 00097 <font class="keywordtype">void</font> complete_int_arrays(); 00098 00099 <font class="keywordtype">void</font> recompute_index_maps(); 00100 00101 <font class="keywordtype">void</font> add_triangle(<font class="keyword">const</font> Ref<Triangle>&); 00102 <font class="keywordtype">void</font> add_vertex(<font class="keyword">const</font> Ref<Vertex>&); 00103 <font class="keywordtype">void</font> add_edge(<font class="keyword">const</font> Ref<Edge>&); 00104 00105 <font class="comment">// these members must be used to allocate new triangles and edges</font> 00106 <font class="comment">// since specializations of TriangulatedSurface might need to</font> 00107 <font class="comment">// override these to produce triangles and edges with interpolation</font> 00108 <font class="comment">// data.</font> 00109 <font class="keyword">virtual</font> Triangle* newTriangle(<font class="keyword">const</font> Ref<Edge>&, 00110 <font class="keyword">const</font> Ref<Edge>&, 00111 <font class="keyword">const</font> Ref<Edge>&, 00112 <font class="keywordtype">int</font> orientation) <font class="keyword">const</font>; 00113 <font class="keyword">virtual</font> Edge* newEdge(<font class="keyword">const</font> Ref<Vertex>&,<font class="keyword">const</font> Ref<Vertex>&) <font class="keyword">const</font>; 00114 00115 <font class="comment">// this map of edges to vertices is used to construct the surface</font> 00116 AVLMap<Ref<Vertex>,AVLSet<Ref<Edge> > > _tmp_edges; 00117 <font class="keyword">public</font>: 00118 TriangulatedSurface(); 00119 TriangulatedSurface(<font class="keyword">const</font> Ref<KeyVal>&); 00120 <font class="keyword">virtual</font> ~TriangulatedSurface(); 00121 00122 <font class="comment">// control printing</font> 00123 <font class="keywordtype">int</font> verbose()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _verbose; } 00124 <font class="keywordtype">void</font> verbose(<font class="keywordtype">int</font> v)<font class="keyword"> </font>{ _verbose = v; } 00125 00126 <font class="comment">// set up an integrator</font> 00127 <font class="keywordtype">void</font> set_integrator(<font class="keyword">const</font> Ref<TriangleIntegrator>&); 00128 <font class="keywordtype">void</font> set_fast_integrator(<font class="keyword">const</font> Ref<TriangleIntegrator>&); 00129 <font class="keywordtype">void</font> set_accurate_integrator(<font class="keyword">const</font> Ref<TriangleIntegrator>&); 00130 <font class="keyword">virtual</font> Ref<TriangleIntegrator> integrator(<font class="keywordtype">int</font> itri); 00131 <font class="keyword">virtual</font> Ref<TriangleIntegrator> fast_integrator(<font class="keywordtype">int</font> itri); 00132 <font class="keyword">virtual</font> Ref<TriangleIntegrator> accurate_integrator(<font class="keywordtype">int</font> itri); 00133 00134 <font class="comment">// construct the surface</font> 00135 <font class="keywordtype">void</font> add_triangle(<font class="keyword">const</font> Ref<Vertex>&, 00136 <font class="keyword">const</font> Ref<Vertex>&, 00137 <font class="keyword">const</font> Ref<Vertex>&); 00138 Ref<Edge> find_edge(<font class="keyword">const</font> Ref<Vertex>&, <font class="keyword">const</font> Ref<Vertex>&); 00139 <font class="keyword">virtual</font> <font class="keywordtype">void</font> complete_surface(); 00140 00141 <font class="comment">// clean up the surface</font> 00142 <font class="keyword">virtual</font> <font class="keywordtype">void</font> remove_short_edges(<font class="keywordtype">double</font> cutoff_length = 1.0e-6, 00143 <font class="keyword">const</font> Ref<Volume> &vol=0, <font class="keywordtype">double</font> isoval=0.0); 00144 <font class="keyword">virtual</font> <font class="keywordtype">void</font> remove_slender_triangles( 00145 <font class="keywordtype">int</font> remove_slender, <font class="keywordtype">double</font> height_cutoff, 00146 <font class="keywordtype">int</font> remove_small, <font class="keywordtype">double</font> area_cutoff, 00147 <font class="keyword">const</font> Ref<Volume> &vol=0, <font class="keywordtype">double</font> isoval=0.0); 00148 <font class="keyword">virtual</font> <font class="keywordtype">void</font> fix_orientation(); 00149 <font class="keyword">virtual</font> <font class="keywordtype">void</font> clear(); 00150 00151 <font class="comment">// get information from the object sets</font> 00152 <font class="keywordtype">int</font> nvertex()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _vertices.length(); }; 00153 Ref<Vertex> vertex(<font class="keywordtype">int</font> i)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _index_to_vertex[i]; }; 00154 <font class="keywordtype">int</font> vertex_index(<font class="keyword">const</font> Ref<Vertex> &o)<font class="keyword"> </font>{ 00155 AVLMap<Ref<Vertex>,<font class="keywordtype">int</font>>::iterator i = _vertex_to_index.find(o); 00156 <font class="keywordflow">if</font> (i != _vertex_to_index.end()) <font class="keywordflow">return</font> i.data(); 00157 <font class="keywordflow">return</font> -1; 00158 } 00159 <font class="keywordtype">int</font> nedge()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _edges.length(); }; 00160 Ref<Edge> edge(<font class="keywordtype">int</font> i)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _index_to_edge[i]; }; 00161 <font class="keywordtype">int</font> edge_index(<font class="keyword">const</font> Ref<Edge> &o)<font class="keyword"> </font>{ 00162 AVLMap<Ref<Edge>,<font class="keywordtype">int</font>>::iterator i = _edge_to_index.find(o); 00163 <font class="keywordflow">if</font> (i != _edge_to_index.end()) <font class="keywordflow">return</font> i.data(); 00164 <font class="keywordflow">return</font> -1; 00165 } 00166 <font class="keywordtype">int</font> ntriangle()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _triangles.length(); }; 00167 Ref<Triangle> triangle(<font class="keywordtype">int</font> i)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _index_to_triangle[i]; } 00168 <font class="keywordtype">int</font> triangle_index(<font class="keyword">const</font> Ref<Triangle> &o)<font class="keyword"> </font>{ 00169 AVLMap<Ref<Triangle>,<font class="keywordtype">int</font>>::iterator i = _triangle_to_index.find(o); 00170 <font class="keywordflow">if</font> (i != _triangle_to_index.end()) <font class="keywordflow">return</font> i.data(); 00171 <font class="keywordflow">return</font> -1; 00172 } 00173 00174 <font class="comment">// information from the index mappings</font> 00175 <font class="keywordtype">int</font> triangle_vertex(<font class="keywordtype">int</font> i,<font class="keywordtype">int</font> j)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _triangle_vertex[i][j]; }; 00176 <font class="keywordtype">int</font> triangle_edge(<font class="keywordtype">int</font> i,<font class="keywordtype">int</font> j)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _triangle_edge[i][j]; }; 00177 <font class="keywordtype">int</font> edge_vertex(<font class="keywordtype">int</font> i,<font class="keywordtype">int</font> j)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _edge_vertex[i][j]; }; 00178 00179 <font class="comment">// associate values with vertices</font> 00180 <font class="comment">//void compute_colors(Volume&);</font> 00181 <font class="keywordtype">void</font> compute_values(Ref<Volume>&); 00182 00183 <font class="comment">// properties of the surface</font> 00184 <font class="keyword">virtual</font> <font class="keywordtype">double</font> flat_area(); <font class="comment">// use flat triangles</font> 00185 <font class="keyword">virtual</font> <font class="keywordtype">double</font> flat_volume(); <font class="comment">// use flat triangles</font> 00186 <font class="keyword">virtual</font> <font class="keywordtype">double</font> area(); 00187 <font class="keyword">virtual</font> <font class="keywordtype">double</font> volume(); 00188 00189 <font class="comment">// output of the surface</font> 00190 <font class="keyword">virtual</font> <font class="keywordtype">void</font> print(std::ostream&o=ExEnv::out0()) <font class="keyword">const</font>; 00191 <font class="keyword">virtual</font> <font class="keywordtype">void</font> print_vertices_and_triangles(std::ostream&o=ExEnv::out0()) <font class="keyword">const</font>; 00192 <font class="keyword">virtual</font> <font class="keywordtype">void</font> print_geomview_format(std::ostream&o=ExEnv::out0()) <font class="keyword">const</font>; 00193 <font class="keyword">virtual</font> <font class="keywordtype">void</font> render(<font class="keyword">const</font> Ref<Render> &render); 00194 00195 <font class="comment">// print information about the topology</font> 00196 <font class="keywordtype">void</font> topology_info(std::ostream&o=ExEnv::out0()); 00197 <font class="keywordtype">void</font> topology_info(<font class="keywordtype">int</font> nvertex, <font class="keywordtype">int</font> nedge, <font class="keywordtype">int</font> ntri, std::ostream&o=ExEnv::out0()); 00198 }; 00199 00200 00201 <font class="keyword">class </font>TriangulatedSurfaceIntegrator { 00202 <font class="keyword">private</font>: 00203 Ref<TriangulatedSurface> _ts; 00204 <font class="keywordtype">int</font> _itri; 00205 <font class="keywordtype">int</font> _irs; 00206 <font class="keywordtype">double</font> _r; 00207 <font class="keywordtype">double</font> _s; 00208 <font class="keywordtype">double</font> _weight; 00209 <font class="keywordtype">double</font> _surface_element; 00210 Ref<Vertex> _current; 00211 SCVector3 _dA; 00212 Ref<TriangleIntegrator> (TriangulatedSurface::*_integrator)(<font class="keywordtype">int</font> itri); 00213 Ref<MessageGrp> _grp; 00214 <font class="keyword">public</font>: 00215 TriangulatedSurfaceIntegrator(); 00216 <font class="comment">// the surface cannot be changed until this is destroyed</font> 00217 TriangulatedSurfaceIntegrator(<font class="keyword">const</font> Ref<TriangulatedSurface>&); 00218 ~TriangulatedSurfaceIntegrator(); 00219 <font class="comment">// Objects initialized by these operators are not automatically</font> 00220 <font class="comment">// updated. This must be done with the update member.</font> 00221 <font class="comment">// The _grp is not copied.</font> 00222 <font class="keywordtype">void</font> operator = (<font class="keyword">const</font> TriangulatedSurfaceIntegrator&); 00223 TriangulatedSurfaceIntegrator(<font class="keyword">const</font> TriangulatedSurfaceIntegrator&i)<font class="keyword"> </font>{ 00224 operator = (i); 00225 } 00226 <font class="comment">// Return the number of integration points.</font> 00227 <font class="keywordtype">int</font> n(); 00228 <font class="comment">// Assign the surface. Don't do this while iterating.</font> 00229 <font class="keywordtype">void</font> set_surface(<font class="keyword">const</font> Ref<TriangulatedSurface>&); 00230 <font class="comment">// returns the number of the vertex in the current triangle</font> 00231 <font class="keywordtype">int</font> vertex_number(<font class="keywordtype">int</font> i); 00232 <font class="keyword">inline</font> <font class="keywordtype">double</font> r()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _r; } 00233 <font class="keyword">inline</font> <font class="keywordtype">double</font> s()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _s; } 00234 <font class="keyword">inline</font> <font class="keywordtype">double</font> w()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _weight*_surface_element; } 00235 <font class="keywordtype">double</font> surface_element()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _surface_element; } 00236 <font class="keywordtype">double</font> weight()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _weight; } 00237 <font class="keyword">const</font> SCVector3& dA()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _dA; } 00238 Ref<Vertex> current(); 00239 <font class="comment">// Tests to see if this point is valid, if it is then</font> 00240 <font class="comment">// _r, _s, etc are computed and 1 is returned.</font> 00241 <font class="keywordtype">int</font> update(); 00242 <font class="comment">// This can be used to loop through unique pairs of points.</font> 00243 <font class="comment">// The argument should be a TriangulatedSurfaceIntegrator for</font> 00244 <font class="comment">// the same surface as this.</font> 00245 <font class="keywordtype">int</font> operator < (TriangulatedSurfaceIntegrator&i)<font class="keyword"> </font>{ 00246 update(); 00247 <font class="keywordflow">return</font> _itri<i._itri?1:(_itri>i._itri?0:(_irs<i._irs?1:0)); 00248 } 00249 <font class="comment">// Goes to the next point. Does not update.</font> 00250 <font class="keywordtype">void</font> operator++(); 00251 <font class="keyword">inline</font> <font class="keywordtype">void</font> operator++(<font class="keywordtype">int</font>)<font class="keyword"> </font>{ operator++(); } 00252 <font class="comment">// setting TSI = i sets TSI to begin at the triangle i</font> 00253 <font class="keywordtype">int</font> operator = (<font class="keywordtype">int</font>); 00254 <font class="keywordtype">int</font> itri()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _itri; } 00255 <font class="keywordtype">int</font> irs()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _irs; } 00256 <font class="comment">// the number of points in the current triangle</font> 00257 <font class="keywordtype">int</font> n_in_tri()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> (_ts.pointer()->*_integrator)(_itri)->n(); } 00258 <font class="keywordtype">void</font> distribute(<font class="keyword">const</font> Ref<MessageGrp> &); 00259 <font class="keywordtype">void</font> use_fast_integrator(); 00260 <font class="keywordtype">void</font> use_accurate_integrator(); 00261 <font class="keywordtype">void</font> use_default_integrator(); 00262 }; 00263 00264 <font class="keyword">class </font>TriangulatedImplicitSurface: <font class="keyword">public</font> TriangulatedSurface { 00265 <font class="keyword">private</font>: 00266 <font class="comment">// The surface is defined as an isosurface of the volume vol_.</font> 00267 Ref<Volume> vol_; 00268 <font class="keywordtype">double</font> isovalue_; 00269 00270 <font class="keywordtype">int</font> fix_orientation_; 00271 <font class="keywordtype">int</font> remove_short_edges_; 00272 <font class="keywordtype">double</font> short_edge_factor_; 00273 <font class="keywordtype">int</font> remove_slender_triangles_; 00274 <font class="keywordtype">double</font> slender_triangle_factor_; 00275 <font class="keywordtype">int</font> remove_small_triangles_; 00276 <font class="keywordtype">double</font> small_triangle_factor_; 00277 <font class="keywordtype">double</font> resolution_; 00278 00279 <font class="keywordtype">int</font> order_; 00280 00281 <font class="keywordtype">int</font> inited_; 00282 <font class="keyword">public</font>: 00283 TriangulatedImplicitSurface(<font class="keyword">const</font> Ref<KeyVal>&); 00284 ~TriangulatedImplicitSurface(); 00285 00286 Ref<Volume> volume_object()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> vol_; } 00287 <font class="keywordtype">double</font> isovalue()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> isovalue_; } 00288 00289 <font class="keywordtype">void</font> init(); 00290 <font class="keywordtype">int</font> inited()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> inited_; } 00291 }; 00292 00293 } 00294 00295 <font class="preprocessor">#endif</font> 00296 <font class="preprocessor"></font> 00297 <font class="comment">// Local Variables:</font> 00298 <font class="comment">// mode: c++</font> 00299 <font class="comment">// c-file-style: "CLJ"</font> 00300 <font class="comment">// End:</font> </div></pre><hr> <address> <small> Generated at Mon Oct 14 14:16:38 2002 for <a href="http://aros.ca.sandia.gov/~cljanss/mpqc">MPQC</a> 2.1.2 using the documentation package <a href="http://www.stack.nl/~dimitri/doxygen/index.html">Doxygen</a> 1.2.5. </small> </address> </body> </html>