This commit is contained in:
Abdelkrim Mebarki 2006-01-26 10:40:13 +00:00
parent 01c80c0e4c
commit 5871846965
5 changed files with 997 additions and 789 deletions

View File

@ -27,9 +27,10 @@ CGAL_BEGIN_NAMESPACE
// The class Euler_integrator_2 is a model of the concept Integrator
template <class VectorField_2>
class Euler_integrator_2{
class Euler_integrator_2
{
public:
typedef Euler_integrator_2<VectorField_2> self;
typedef Euler_integrator_2<VectorField_2> self;
typedef typename VectorField_2::FT FT;
typedef typename VectorField_2::Point_2 Point_2;
typedef typename VectorField_2::Vector_2 Vector_2;
@ -37,17 +38,32 @@ public:
protected:
FT default_integration_step;
public:
Euler_integrator_2();
Euler_integrator_2();
Euler_integrator_2(const FT & integration_step);
inline Point_2 operator()(const Point_2 & p, const Vector_field_2 & vector_field_2, const bool & index) const;
inline Point_2 operator()(const Point_2 & p, const Vector_field_2 & vector_field_2, const FT & integration_step, const bool & index) const;
inline Point_2 operator()(const Point_2 & p, const Vector_field_2 & vector_field_2, const FT & integration_step, Vector_2 v, const bool & index) const;
inline FT get_default_integration_step(){return default_integration_step;}
// just for debugging
inline FT distance(const Point_2 & p, const Point_2 & q)
{
return sqrt(((p.x() - q.x())*(p.x() - q.x()))+((p.y() - q.y())*(p.y() - q.y())));
}
inline Point_2 operator()(const Point_2 & p, const Vector_field_2 &
vector_field_2, const bool & index) const;
inline Point_2 operator()(const Point_2 & p, const Vector_field_2 &
vector_field_2, const FT &
integration_step, const bool & index)
const;
inline Point_2 operator()(const Point_2 & p, const Vector_field_2 &
vector_field_2, const FT &
integration_step, Vector_2 v, const bool &
index) const;
inline FT get_default_integration_step()
{
return default_integration_step;
}
// just for debugging
inline FT distance(const Point_2 & p, const Point_2 & q)
{
return sqrt(((p.x() - q.x())*(p.x() - q.x()))+((p.y() - q.y())*(p.y() - q.y())));
}
};
template <class Vector_field>

View File

@ -31,9 +31,10 @@ CGAL_BEGIN_NAMESPACE
// bilinear interpolation to extract the vector field values
template <class StreamLinesTraits_2>
class Regular_grid_2{
class Regular_grid_2
{
public:
typedef Regular_grid_2<StreamLinesTraits_2> Vector_field_2;
typedef Regular_grid_2<StreamLinesTraits_2> Vector_field_2;
typedef StreamLinesTraits_2 Geom_traits;
typedef typename StreamLinesTraits_2::FT FT;
typedef typename StreamLinesTraits_2::Point_2 Point_2;
@ -50,68 +51,107 @@ protected:
bool is_in_samples(const int & i,const int & j) const;
public:
Regular_grid_2(const int & m, const int & n,const FT & x, const FT & y);
// Regular_grid_2();
~Regular_grid_2(){delete [] vector_field;}
void fill(std::ifstream & f, const FT & x, const FT & y);
// Regular_grid_2();
~Regular_grid_2()
{
delete [] vector_field;
}
void fill(std::ifstream & f, const FT & x, const FT & y);
inline typename Geom_traits::Iso_rectangle_2 bbox() const;
std::pair<Vector_2,FT>
get_field(const Point_2 & p) const
{
CGAL_streamlines_precondition(is_in_domain(p));
Vector_2 v = get_vector_field(p);
FT density = get_density_field(p);
return std::pair<Vector_2, FT>(v,density);
}
{
CGAL_streamlines_precondition(is_in_domain(p));
Vector_2 v = get_vector_field(p);
FT density = get_density_field(p);
return std::pair<Vector_2, FT>(v,density);
}
inline bool is_in_domain(const Point_2 & p) const;
inline FT get_integration_step(const Point_2 &) const;
inline FT get_integration_step() const;
inline FT get_integration_step() const;
inline void set_field(const int & i, const int & j, const Vector_2 & v);
inline std::pair<int, int> get_dimension(){return std::pair<int, int>(number_of_samples_x, number_of_samples_y);}
inline std::pair<FT, FT> get_size(){return std::pair<FT, FT>(domain_size_x, domain_size_y);}};
inline std::pair<int, int> get_dimension()
{
return std::pair<int, int>(number_of_samples_x, number_of_samples_y);
}
inline std::pair<FT, FT> get_size()
{
return std::pair<FT,
FT>(domain_size_x,
domain_size_y);
}
};
template <class StreamLinesTraits_2>
inline
typename Regular_grid_2<StreamLinesTraits_2>::Geom_traits::Iso_rectangle_2
Regular_grid_2<StreamLinesTraits_2>::bbox() const{
return typename Geom_traits::Iso_rectangle_2(0.0, 0.0, domain_size_x, domain_size_y);}
Regular_grid_2<StreamLinesTraits_2>::bbox() const
{
return typename Geom_traits::Iso_rectangle_2(0.0, 0.0,
domain_size_x,
domain_size_y);
}
template <class StreamLinesTraits_2>
inline int
Regular_grid_2<StreamLinesTraits_2>::get_index(const int & i, const int & j) const{
return 2*(number_of_samples_x*j + i);}
Regular_grid_2<StreamLinesTraits_2>::get_index(const int & i, const
int & j) const
{
return 2*(number_of_samples_x*j + i);
}
template <class StreamLinesTraits_2>
Regular_grid_2<StreamLinesTraits_2>::Regular_grid_2(const int & m, const int & n,const FT & x, const FT & y){
Regular_grid_2<StreamLinesTraits_2>::Regular_grid_2(const int & m,
const int &
n,const FT & x,
const FT & y)
{
number_of_samples_x = m;
number_of_samples_y = n;
domain_size_x = x;
domain_size_y = y;
vector_field = new FT[number_of_samples_x*number_of_samples_y* 2];}
vector_field = new FT[number_of_samples_x*number_of_samples_y* 2];
}
template <class StreamLinesTraits_2>
inline void
Regular_grid_2<StreamLinesTraits_2>::set_field(const int & i, const int & j, const Vector_2 & v){
Regular_grid_2<StreamLinesTraits_2>::set_field(const int & i, const
int & j, const Vector_2
& v)
{
CGAL_streamlines_precondition(is_in_samples(i,j));
int index = get_index(i,j);
vector_field[index++] = v.x();
vector_field[index] = v.y();}
vector_field[index] = v.y();
}
template <class StreamLinesTraits_2>
inline bool
Regular_grid_2<StreamLinesTraits_2>::is_in_domain(const Point_2 & p) const{
return ((p.x()>=0.0) && (p.x()<=domain_size_x) && (p.y()>=0.0) && (p.y()<=domain_size_y));}
Regular_grid_2<StreamLinesTraits_2>::is_in_domain(const Point_2 & p)
const
{
return ((p.x()>=0.0) && (p.x()<=domain_size_x) && (p.y()>=0.0) &&
(p.y()<=domain_size_y));
}
template <class StreamLinesTraits_2>
bool
Regular_grid_2<StreamLinesTraits_2>::is_in_samples(const int & i, const int & j) const{
return ((i>=0) && (i<=number_of_samples_x-1) && (j>=0) && (j<=number_of_samples_y-1));}
Regular_grid_2<StreamLinesTraits_2>::is_in_samples(const int & i,
const int & j)
const
{
return ((i>=0) && (i<=number_of_samples_x-1) && (j>=0) &&
(j<=number_of_samples_y-1));
}
template <class StreamLinesTraits_2>
typename Regular_grid_2<StreamLinesTraits_2>::Vector_2
Regular_grid_2<StreamLinesTraits_2>::get_vector_field(const Point_2 & p) const{
Regular_grid_2<StreamLinesTraits_2>::get_vector_field(const Point_2 &
p) const
{
FT fXv,fYv;
FT x = (p.x() / domain_size_x) * (number_of_samples_x-1);
FT y = (p.y() / domain_size_y) * (number_of_samples_y-1);
@ -146,24 +186,34 @@ Regular_grid_2<StreamLinesTraits_2>::get_vector_field(const Point_2 & p) const{
fXv = fXv / normal;
fYv = fYv / normal;
Vector_2 v = Vector_2(fXv, fYv);
return v;}
return v;
}
template <class StreamLinesTraits_2>
typename Regular_grid_2<StreamLinesTraits_2>::FT
Regular_grid_2<StreamLinesTraits_2>::get_density_field(const Point_2 & p) const{
return 1.0;}
Regular_grid_2<StreamLinesTraits_2>::get_density_field(const Point_2 &
p) const
{
return 1.0;
}
template<class StreamLinesTraits_2>
inline
typename Regular_grid_2<StreamLinesTraits_2>::FT
Regular_grid_2<StreamLinesTraits_2>::get_integration_step(const Point_2 &) const{
return 1.0;}
Regular_grid_2<StreamLinesTraits_2>::get_integration_step(const
Point_2 &)
const
{
return 1.0;
}
template<class StreamLinesTraits_2>
inline
typename Regular_grid_2<StreamLinesTraits_2>::FT
Regular_grid_2<StreamLinesTraits_2>::get_integration_step() const{
return 1.0;}
Regular_grid_2<StreamLinesTraits_2>::get_integration_step() const
{
return 1.0;
}
CGAL_END_NAMESPACE

View File

@ -28,36 +28,55 @@ CGAL_BEGIN_NAMESPACE
// The class Runge_kutta_integrator_2 is a model of the concept Integrator
template <class VectorField_2>
class Runge_kutta_integrator_2{
class Runge_kutta_integrator_2
{
public:
typedef Runge_kutta_integrator_2<VectorField_2> self;
typedef Runge_kutta_integrator_2<VectorField_2> self;
typedef typename VectorField_2::FT FT;
typedef typename VectorField_2::Point_2 Point_2;
typedef typename VectorField_2::Vector_2 Vector_2;
typedef typename VectorField_2::Vector_field_2 Vector_field_2;
protected:
typedef CGAL::Euler_integrator_2<VectorField_2> Euler_integrator_2;
typedef CGAL::Euler_integrator_2<VectorField_2> Euler_integrator_2;
Euler_integrator_2 * euler_integrator_2;
FT default_integration_step;
public:
Runge_kutta_integrator_2();
Runge_kutta_integrator_2(FT integration_step);
~Runge_kutta_integrator_2();
Point_2 operator()(const Point_2 & p, const Vector_field_2 & vector_field_2, const bool & index) const;
Point_2 operator()(const Point_2 & p, const Vector_field_2 & vector_field_2, const FT & integration_step, const bool & index) const;
Point_2 operator()(const Point_2 & p, const Vector_field_2 & vector_field_2, const FT & integration_step, Vector_2 v, const bool & index) const;
inline FT get_default_integration_step(){return default_integration_step;}
Euler_integrator_2 * get_euler_integrator_2(){return euler_integrator_2;}
inline FT distance(const Point_2 & p, const Point_2 & q){
return sqrt(((p.x() - q.x())*(p.x() - q.x()))+((p.y() - q.y())*(p.y() - q.y())));}
inline FT get_default_integration_step()
{
return default_integration_step;
}
Euler_integrator_2 * get_euler_integrator_2()
{
return euler_integrator_2;
}
inline FT distance(const Point_2 & p, const Point_2 & q)
{
return sqrt(((p.x() - q.x())*(p.x() - q.x()))+((p.y()
-
q.y())*(p.y() - q.y())));
}
};
template <class VectorField_2>
Runge_kutta_integrator_2<VectorField_2>::
Runge_kutta_integrator_2()
{
euler_integrator_2 = new Euler_integrator_2();
euler_integrator_2 = new Euler_integrator_2();
default_integration_step =
euler_integrator_2->get_default_integration_step();
}
@ -66,7 +85,7 @@ template <class VectorField_2>
Runge_kutta_integrator_2<VectorField_2>::
Runge_kutta_integrator_2(FT integration_step)
{
euler_integrator_2 = new Euler_integrator_2(integration_step);
euler_integrator_2 = new Euler_integrator_2(integration_step);
default_integration_step =
euler_integrator_2->get_default_integration_step();
}
@ -75,7 +94,7 @@ template <class VectorField_2>
Runge_kutta_integrator_2<VectorField_2>::
~Runge_kutta_integrator_2()
{
delete euler_integrator_2;
delete euler_integrator_2;
}
template <class VectorField_2>
@ -95,7 +114,9 @@ Point_2 Runge_kutta_integrator_2<VectorField_2>::operator()
template <class VectorField_2>
inline
typename Runge_kutta_integrator_2<VectorField_2>::Point_2 Runge_kutta_integrator_2<VectorField_2>::operator()
(const Point_2 & p, const Vector_field_2& vector_field_2, const FT & integration_step, const bool & index) const{
(const Point_2 & p, const Vector_field_2& vector_field_2, const FT &
integration_step, const bool & index) const
{
Vector_2 v;
v = vector_field_2.get_field(p).first;
Runge_kutta_integrator_2<VectorField_2>

File diff suppressed because it is too large Load Diff

View File

@ -20,19 +20,15 @@
#ifndef CGAL_TRIANGULAR_FIELD_2_H_
#define CGAL_TRIANGULAR_FIELD_2_H_
#include <CGAL/basic.h>
#include <CGAL/Cartesian.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <CGAL/Polygon_2_algorithms.h>
#include <float.h>
// #include <strings.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <list>
#include <queue>
#include <cmath>
#include <string>
@ -41,143 +37,190 @@
CGAL_BEGIN_NAMESPACE
template <class StreamLinesTraits_2>
class Triangular_field_2{
class Triangular_field_2
{
public:
typedef Triangular_field_2<StreamLinesTraits_2> Vector_field_2;
typedef StreamLinesTraits_2 Geom_traits;
typedef typename StreamLinesTraits_2::FT FT;
typedef typename StreamLinesTraits_2::Point_2 Point_2;
typedef typename StreamLinesTraits_2::Vector_2 Vector_2;
typedef Triangular_field_2<StreamLinesTraits_2> Vector_field_2;
typedef StreamLinesTraits_2 Geom_traits;
typedef typename StreamLinesTraits_2::FT FT;
typedef typename StreamLinesTraits_2::Point_2 Point_2;
typedef typename StreamLinesTraits_2::Vector_2 Vector_2;
protected:
typedef CGAL::Triangulation_vertex_base_2<StreamLinesTraits_2> Vb;
typedef CGAL::Triangulation_face_base_with_info_2<Vector_2, StreamLinesTraits_2> Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb> TDS;
typedef CGAL::Delaunay_triangulation_2<StreamLinesTraits_2,TDS> D_Ttr;
typedef typename D_Ttr::Vertex_handle Vertex_handle;
typedef typename TDS::Face_handle Face_handle;
typedef CGAL::Triangulation_vertex_base_2<StreamLinesTraits_2> Vb;
typedef CGAL::Triangulation_face_base_with_info_2<Vector_2, StreamLinesTraits_2> Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb> TDS;
typedef CGAL::Delaunay_triangulation_2<StreamLinesTraits_2,TDS> D_Ttr;
typedef typename D_Ttr::Vertex_handle Vertex_handle;
typedef typename TDS::Face_handle Face_handle;
public:
typedef typename D_Ttr::Vertex_iterator Vertex_iterator;
D_Ttr m_D_Ttr;
typedef typename D_Ttr::Vertex_iterator Vertex_iterator;
D_Ttr m_D_Ttr;
protected:
Vector_2 get_vector_field(const Point_2 & p) const;
FT get_density_field(const Point_2 & p) const;
template <class PointInputIterator, class VectorInputIterator>
void fill(PointInputIterator pBegin, PointInputIterator pEnd, VectorInputIterator vBegin){
std::cout << "reading file...\n";
while(pBegin != pEnd){
Point_2 p;
Vector_2 v;
p = (*pBegin);
v = (*vBegin);
Vertex_handle m_Vertex_handle = m_D_Ttr.insert(p);
field_map[p] = v;
if (m_D_Ttr.number_of_vertices() == 1){
maxx = minx = p.x();
maxy = miny = p.y();}
if(p.x()<minx)
minx = p.x();
if(p.y()<miny)
miny = p.y();
if(p.x()>maxx)
maxx = p.x();
if(p.y()>maxy)
maxy = p.y();
pBegin++;
vBegin++;}
std::cout << "number of samples " << m_D_Ttr.number_of_vertices() << "\n";}
public:
template <class PointInputIterator, class VectorInputIterator>
Triangular_field_2(PointInputIterator pBegin, PointInputIterator pEnd, VectorInputIterator vBegin){
fill(pBegin, pEnd, vBegin);}
inline typename Geom_traits::Iso_rectangle_2 bbox() const;
Vector_2 get_vector_field(const Point_2 & p) const;
std::pair<Vector_2,FT> get_field(const Point_2 & p) const
{
assert(is_in_domain(p));
Vector_2 v = get_vector_field(p);
FT density = get_density_field(p);
std::pair<Vector_2, FT> field_value(v,density);
return field_value;
FT get_density_field(const Point_2 & p) const;
template <class PointInputIterator, class VectorInputIterator>
void fill(PointInputIterator pBegin, PointInputIterator pEnd, VectorInputIterator vBegin)
{
std::cout << "reading file...\n";
while(pBegin != pEnd)
{
Point_2 p;
Vector_2 v;
p = (*pBegin);
v = (*vBegin);
Vertex_handle m_Vertex_handle = m_D_Ttr.insert(p);
field_map[p] = v;
if (m_D_Ttr.number_of_vertices() == 1)
{
maxx = minx = p.x();
maxy = miny = p.y();
}
if(p.x()<minx)
{
minx = p.x();
}
if(p.y()<miny)
{
miny = p.y();
}
if(p.x()>maxx)
{
maxx = p.x();
}
if(p.y()>maxy)
{
maxy = p.y();
}
++pBegin;
++vBegin;
}
std::cout << "number of samples " << m_D_Ttr.number_of_vertices() << "\n";
}
public:
template <class PointInputIterator, class VectorInputIterator>
Triangular_field_2(PointInputIterator pBegin, PointInputIterator
pEnd, VectorInputIterator vBegin)
{
fill(pBegin, pEnd, vBegin);
}
inline typename Geom_traits::Iso_rectangle_2 bbox() const;
std::pair<Vector_2,FT> get_field(const Point_2 & p) const
{
assert(is_in_domain(p));
Vector_2 v = get_vector_field(p);
FT density = get_density_field(p);
return std::make_pair(v, density);
}
bool is_in_domain(const Point_2 & p) const;
FT get_integration_step(const Point_2 &) const;
FT get_integration_step() const;
bool is_in_domain(const Point_2 & p) const;
FT get_integration_step(const Point_2 &) const;
FT get_integration_step() const;
protected:
FT minx;
FT miny;
FT maxx;
FT maxy;
FT minx;
FT miny;
FT maxx;
FT maxy;
protected:
mutable std::map<Point_2, Vector_2> field_map;
FT distance(const Point_2 & p, const Point_2 & q){
return sqrt(((p.x() - q.x()) * (p.x() - q.x())) + ((p.y() - q.y()) * (p.y() - q.y())));}
mutable std::map<Point_2, Vector_2> field_map;
FT distance(const Point_2 & p, const Point_2 & q)
{
return sqrt( CGAL::squared_distance(p, q) );
}
};
template <class StreamLinesTraits_2>
inline
typename Triangular_field_2<StreamLinesTraits_2>::Geom_traits::Iso_rectangle_2
Triangular_field_2<StreamLinesTraits_2>::bbox() const{
return typename Geom_traits::Iso_rectangle_2(minx, miny, maxx, maxy);}
Triangular_field_2<StreamLinesTraits_2>::bbox() const
{
return typename Geom_traits::Iso_rectangle_2(minx, miny, maxx,
maxy);
}
template <class StreamLinesTraits_2>
bool
Triangular_field_2<StreamLinesTraits_2>::is_in_domain(const Point_2 & p) const{
Face_handle f = m_D_Ttr.locate(p);
return !m_D_Ttr.is_infinite(f);}
Triangular_field_2<StreamLinesTraits_2>::is_in_domain(const Point_2 &
p) const
{
Face_handle f = m_D_Ttr.locate(p);
return !m_D_Ttr.is_infinite(f);
}
template <class StreamLinesTraits_2>
typename Triangular_field_2<StreamLinesTraits_2>::Vector_2
Triangular_field_2<StreamLinesTraits_2>::get_vector_field(const Point_2 & p) const{
Face_handle m_Face_handle = m_D_Ttr.locate(p);
assert(is_in_domain(p));
Point_2 p0 = m_Face_handle->vertex(0)->point();
Point_2 p1 = m_Face_handle->vertex(1)->point();
Point_2 p2 = m_Face_handle->vertex(2)->point();
Vertex_handle v0 = m_Face_handle->vertex(0);
Vertex_handle v1 = m_Face_handle->vertex(1);
Vertex_handle v2 = m_Face_handle->vertex(2);
FT s0,s1,s2,s;
std::vector<Point_2> vec;
vec.push_back(p0); vec.push_back(p1); vec.push_back(p2);
s = polygon_area_2(vec.begin(), vec.end(), m_D_Ttr.geom_traits());
vec.clear();
vec.push_back(p); vec.push_back(p1); vec.push_back(p2);
s0 = polygon_area_2(vec.begin(), vec.end(), m_D_Ttr.geom_traits());
vec.clear();
vec.push_back(p0); vec.push_back(p); vec.push_back(p2);
s1 = polygon_area_2(vec.begin(), vec.end(), m_D_Ttr.geom_traits());
vec.clear();
vec.push_back(p0); vec.push_back(p1); vec.push_back(p);
s2 = polygon_area_2(vec.begin(), vec.end(), m_D_Ttr.geom_traits());
vec.clear();
s0 = s0 / s; s1 = s1 / s; s2 = s2 / s;
Vector_2 v_0 = field_map[p0];
Vector_2 v_1 = field_map[p1];
Vector_2 v_2 = field_map[p2];
FT x = ((v_0.x()*s0)+(v_1.x()*s1)+(v_2.x()*s2));
FT y = ((v_0.y()*s0)+(v_1.y()*s1)+(v_2.y()*s2));
FT normal = sqrt((x)*(x) + (y)*(y));
if (normal != 0){
x = x / normal;
y = y / normal;}
Vector_2 v = Vector_2(x, y);
return v;}
Triangular_field_2<StreamLinesTraits_2>::get_vector_field(const
Point_2 & p)
const
{
Face_handle m_Face_handle = m_D_Ttr.locate(p);
assert(is_in_domain(p));
Vertex_handle v0 = m_Face_handle->vertex(0);
Vertex_handle v1 = m_Face_handle->vertex(1);
Vertex_handle v2 = m_Face_handle->vertex(2);
const Point_2 & p0 = v0->point();
const Point_2 & p1 = v1->point();
const Point_2 & p2 = v2->point();
FT s0,s1,s2,s;
std::vector<Point_2> vec;
vec.push_back(p0); vec.push_back(p1); vec.push_back(p2);
s = polygon_area_2(vec.begin(), vec.end(), m_D_Ttr.geom_traits());
vec.clear();
vec.push_back(p); vec.push_back(p1); vec.push_back(p2);
s0 = polygon_area_2(vec.begin(), vec.end(), m_D_Ttr.geom_traits());
vec.clear();
vec.push_back(p0); vec.push_back(p); vec.push_back(p2);
s1 = polygon_area_2(vec.begin(), vec.end(), m_D_Ttr.geom_traits());
vec.clear();
vec.push_back(p0); vec.push_back(p1); vec.push_back(p);
s2 = polygon_area_2(vec.begin(), vec.end(), m_D_Ttr.geom_traits());
vec.clear();
s0 = s0 / s; s1 = s1 / s; s2 = s2 / s;
Vector_2 v_0 = field_map[p0];
Vector_2 v_1 = field_map[p1];
Vector_2 v_2 = field_map[p2];
FT x = ((v_0.x()*s0)+(v_1.x()*s1)+(v_2.x()*s2));
FT y = ((v_0.y()*s0)+(v_1.y()*s1)+(v_2.y()*s2));
FT normal = sqrt((x)*(x) + (y)*(y));
if (normal != 0)
{
x = x / normal;
y = y / normal;
}
Vector_2 v = Vector_2(x, y);
return v;
}
template <class StreamLinesTraits_2>
typename Triangular_field_2<StreamLinesTraits_2>::FT
Triangular_field_2<StreamLinesTraits_2>::get_density_field(const Point_2 & p) const{
return p.x();}
Triangular_field_2<StreamLinesTraits_2>::get_density_field(const
Point_2 &
p) const
{
return p.x();
}
template<class StreamLinesTraits_2>
typename Triangular_field_2<StreamLinesTraits_2>::FT
Triangular_field_2<StreamLinesTraits_2>::get_integration_step(const Point_2 &) const{
return 1.0;}
Triangular_field_2<StreamLinesTraits_2>::get_integration_step(const
Point_2
&) const
{
return 1.0;
}
template<class StreamLinesTraits_2>
typename Triangular_field_2<StreamLinesTraits_2>::FT
Triangular_field_2<StreamLinesTraits_2>::get_integration_step() const{
return 1.0;}
Triangular_field_2<StreamLinesTraits_2>::get_integration_step() const
{
return 1.0;
}
CGAL_END_NAMESPACE