yade-dev team mailing list archive
-
yade-dev team
-
Mailing list archive
-
Message #08253
[Branch ~yade-dev/yade/trunk] Rev 3006: - account for sweepLength in bounds comparisons of Collider::probeVolume()
------------------------------------------------------------
revno: 3006
committer: Bruno Chareyre <bruno.chareyre@xxxxxxxxxxx>
branch nick: trunk
timestamp: Thu 2012-01-26 12:19:05 +0100
message:
- account for sweepLength in bounds comparisons of Collider::probeVolume()
- removed unused file
removed:
lib/triangulation/Tesselation.cpp
modified:
pkg/common/InsertionSortCollider.cpp
--
lp:yade
https://code.launchpad.net/~yade-dev/yade/trunk
Your team Yade developers is subscribed to branch lp:yade.
To unsubscribe from this branch go to https://code.launchpad.net/~yade-dev/yade/trunk/+edit-subscription
=== removed file 'lib/triangulation/Tesselation.cpp'
--- lib/triangulation/Tesselation.cpp 2011-05-02 09:17:49 +0000
+++ lib/triangulation/Tesselation.cpp 1970-01-01 00:00:00 +0000
@@ -1,507 +0,0 @@
-#include "Tesselation.h"
-#include "CGAL/constructions/constructions_on_weighted_points_cartesian_3.h"
-//Tesselation TESSELATION = Tesselation();
-
-
-using namespace std;
-
-namespace CGT {
-
-Tesselation::Tesselation ( void )
-{
-// std::cout << "Tesselation(void)" << std::endl;
- Tri = new RTriangulation;
- Tes = Tri;
- computed=false;
- max_id = -1;
- TotalFiniteVoronoiVolume=0;
- area=0;
- TotalInternalVoronoiPorosity=0;
- TotalInternalVoronoiVolume=0;
- redirected = false;
- //FIXME : find a better way to avoid segfault when insert() is used before resizing this vector
- vertexHandles.resize(1000000);
-}
-
-Tesselation::Tesselation ( RTriangulation &T )
- : Tri ( &T ), Tes ( &T ), computed ( false )
-{
- std::cout << "Tesselation(RTriangulation &T)" << std::endl;
- Compute();
-}
-
-
-Tesselation::~Tesselation ( void )
-{
- if ( Tri ) Tri->~RTriangulation();
-}
-
-void Tesselation::Clear ( void )
-{
- Tri->clear();
- max_id=0;
- redirected = false;
- vertexHandles.clear();
-}
-
-Vertex_handle Tesselation::insert ( Real x, Real y, Real z, Real rad, unsigned int id, bool isFictious )
-{
- Vertex_handle Vh;
- Vh = Tri->insert(Sphere(Point(x,y,z),pow(rad,2)));
- if ( Vh!=NULL )
- {
- Vh->info() = id;
- Vh->info().isFictious = isFictious;
- vertexHandles[id] = Vh;
- /*if ( !isFictious ) */max_id = std::max ( max_id, (int) id );
- }
- else cout << id << " : Vh==NULL!!" << endl;
- return Vh;
-}
-
-Vertex_handle Tesselation::move ( Real x, Real y, Real z, Real rad, unsigned int id )
-{
- bool fictious = vertexHandles[id]->info().isFictious;
- Vertex_handle Vh;
- Vh = Tri->move_point ( vertexHandles[id], Sphere ( Point ( x,y,z ),pow ( rad,2 ) ) );
- if ( Vh!=NULL )
- {
- vertexHandles[id] = Vh;
- Vh->info() = id;
- Vh->info().isFictious = fictious;
- }
- else cerr << "Vh==NULL" << " id=" << id << " Point=" << Point ( x,y,z ) << " rad=" << rad << endl;
- return Vh;
-}
-
-
-
-bool Tesselation::redirect ( void )
-{
- if ( !redirected )
- {
- //Set size of the redirection vector
- if ( (unsigned int)max_id+1 != vertexHandles.size() ) vertexHandles.resize ( max_id+1 );
- //cout << "!redirected" << endl;
- max_id = 0;
- Finite_vertices_iterator vertices_end = Tri->finite_vertices_end ();
- for ( Finite_vertices_iterator V_it = Tri->finite_vertices_begin (); V_it != vertices_end; V_it++ )
- {
- vertexHandles[V_it->info().id()]= V_it;
- max_id = max(max_id, (int) V_it->info().id());
- //if ( ! ( V_it->info().isFictious ) ) vertexHandles[V_it->info().id() ]= V_it;
- //std::cout<< "Cell " << V_it->info().id() << ": v=" << V_it->info().v() << std::endl;
- }
- if ( (unsigned int)max_id+1 != vertexHandles.size() ) vertexHandles.resize ( max_id+1 );
- redirected = true;
- } else return false;
- return true;
-}
-
-
-bool Tesselation::remove ( unsigned int id )
-{
- redirect();
- Tri->remove ( vertexHandles[id] );
- return true;
-}
-
-
-Finite_cells_iterator Tesselation::finite_cells_begin ( void )
-{ return Tri->finite_cells_begin(); }
-
-Finite_cells_iterator Tesselation::finite_cells_end ( void )
-{ return Tri->finite_cells_end(); }
-
-void Tesselation::Voisins ( Vertex_handle v, Vector_Vertex& Output_vector )
-{ Tri->incident_vertices ( v, back_inserter ( Output_vector ) ); }
-
-RTriangulation& Tesselation::Triangulation ( void )
-{ return *Tri; }
-
-Real Tesselation::Volume ( Finite_cells_iterator cell )
-{
- return ( Tetraedre ( cell->vertex ( 0 )->point(), cell->vertex ( 1 )->point(),
- cell->vertex ( 2 )->point(), cell->vertex ( 3 )->point() ) ).volume();
-}
-
-Plan Tesselation::Dual ( Vertex_handle S1, Vertex_handle S2 )
-{
- Segment seg ( S1->point(), S2->point() );
- Real r = 0.5* ( 1.0 + ( ( S1->point() ).weight() * ( S1->point() ).weight() - ( S2->point() ).weight() * ( S2->point() ).weight() ) /seg.squared_length() );
- return Plan ( S1->point() + seg.to_vector() *r, seg.to_vector() );
-}
-
-Point Tesselation::Dual ( const Cell_handle &cell )
-{
- return cell->info();
-}
-
-void Tesselation::Compute ()
-{
- redirect();
- Finite_cells_iterator cell_end = Tri->finite_cells_end();
- for ( Finite_cells_iterator cell = Tri->finite_cells_begin(); cell != cell_end; cell++ )
- {
-
- const Sphere& S0 = cell->vertex ( 0 )->point();
- const Sphere& S1 = cell->vertex ( 1 )->point();
- const Sphere& S2 = cell->vertex ( 2 )->point();
- const Sphere& S3 = cell->vertex ( 3 )->point();
- Real x,y,z;
- CGAL::weighted_circumcenterC3 (
- S0.point().x(), S0.point().y(), S0.point().z(), S0.weight(),
- S1.point().x(), S1.point().y(), S1.point().z(), S1.weight(),
- S2.point().x(), S2.point().y(), S2.point().z(), S2.weight(),
- S3.point().x(), S3.point().y(), S3.point().z(), S3.weight(),
- x, y, z );
- cell->info() =Point ( x,y,z );
- }
- computed = true;
-}
-
-long Tesselation::New_liste_adjacent_edges ( Vertex_handle vertex0, Real** Coordonnes )
-{
- Delete_liste_edges ( Coordonnes );
- *Coordonnes = new Real [600];
- long k = 0;
- Finite_edges_iterator ed_it;
-
- for ( ed_it = Tri->finite_edges_begin(); ed_it != Tri->finite_edges_end(); ed_it++ )
- {
- if ( ed_it->first->vertex ( ed_it->second ) == vertex0 || ed_it->first->vertex ( ed_it->third ) == vertex0 )
- {
- Point p;
- Facet_circulator facet0, facet;
- facet0 = Tri->incident_facets ( *ed_it );
- bool pass = false;
- for ( facet = facet0; ! ( facet == facet0 && pass ) ; facet++ )
- {
- pass = true;
- if ( !Tri->is_infinite ( ( *facet ).first ) && !Tri->is_infinite ( ( *facet ).first->neighbor ( ( *facet ).second ) ) )
- {
-// cout << "p.x() = " << p.x() << "p.y() = " << p.y() << "p.z() = " << p.z() << endl;
- p = ( *facet ).first->info();
- ( *Coordonnes ) [k++] = p.x(); ( *Coordonnes ) [k++] = p.y(); ( *Coordonnes ) [k++] = p.z();
- p = ( *facet ).first->neighbor ( ( *facet ).second )->info();
- ( *Coordonnes ) [k++] = p.x(); ( *Coordonnes ) [k++] = p.y(); ( *Coordonnes ) [k++] = p.z();
- }
- }
- }
- }
-
-
- return k/6;
-}
-
-
-long Tesselation::New_liste_short_edges2 ( Real** Coordonnes )
-{
- Delete_liste_edges ( Coordonnes );
- //long j = 6 * T.number_of_finite_edges();
-
- long Nff = Tri->number_of_finite_facets();
- *Coordonnes = new Real [6 * Nff];
-
- long k = 0;
- Point p, p2;
- Finite_facets_iterator f_it; //une facette = { cell, long }
- Cell_handle cell;
-// long id_facet ;
-// Locate_type lt;
-// int n, m;
- CGAL::Object result; //utilis� pour le retour du pr�dicat CGAL::intersection
-
- // const Edge & e : (e.first, e.second, e.third) == const Cell_handle& c, int i, int j
- //H2.top("initialisation de la liste de segments");
- for ( f_it = Tri->finite_facets_begin(); f_it != Tri->finite_facets_end(); f_it++ )
- {
- if ( is_short ( f_it ) )
- {
- p = f_it->first->info();
- ( *Coordonnes ) [k++] = p.x(); ( *Coordonnes ) [k++] = p.y(); ( *Coordonnes ) [k++] = p.z();
- Cell_handle cell = f_it->first->neighbor ( f_it->second );
-
- p = cell->info();
- ( *Coordonnes ) [k++] = p.x(); ( *Coordonnes ) [k++] = p.y(); ( *Coordonnes ) [k++] = p.z();
- }
- }
- return k/6;
-}
-
-bool Tesselation::is_short ( Finite_facets_iterator f_it )
-{
- Cell_handle cell1 = f_it->first;
- Cell_handle cell2 = cell1->neighbor ( f_it->second );
-// return ( !Tri->is_infinite(cell1->neighbor(1)) && !Tri->is_infinite(cell1->neighbor(2))
-// && !Tri->is_infinite(cell1->neighbor(3)) && !Tri->is_infinite(cell1->neighbor(0))
-// && !Tri->is_infinite(cell2->neighbor(1)) && !Tri->is_infinite(cell2->neighbor(2))
-// && !Tri->is_infinite(cell2->neighbor(3)) && !Tri->is_infinite(cell2->neighbor(0)) );
- return ( !Tri->is_infinite ( cell1 ) && !Tri->is_infinite ( cell2 ) );
-
-}
-
-long Tesselation::New_liste_short_edges ( Real** Coordonnes )
-{
- Delete_liste_edges ( Coordonnes );
- //long j = 6 * T.number_of_finite_edges();
-
- long Nff = Tri->number_of_finite_facets();
- *Coordonnes = new Real [6 * Nff];
-
- long k = 0;
- int n = 0;
- Point p, p2;
- Point v1, v2, v3;
- Finite_facets_iterator f_it; //une facette = { cell, long }
- Cell_handle cell, location;
- long id_facet ;
- CGAL::Object result; //utilis� pour le retour du pr�dicat CGAL::intersection
-
- // const Edge & e : (e.first, e.second, e.third) == const Cell_handle& c, int i, int j
- //H2.top("initialisation de la liste de segments");
- for ( f_it = Tri->finite_facets_begin(); f_it != Tri->finite_facets_end(); f_it++ )
- {
- id_facet = f_it->second; //indice de la facette dans la cellule
- cell = f_it->first->neighbor ( id_facet ); //Deuxi�me cellule adjacente
- if ( !Tri->is_infinite ( f_it->first ) && !Tri->is_infinite ( cell ) )
- {
- p = f_it->first->info();
- p2 = cell->info();
-
- location = Tri->locate ( p );
- if ( !Tri->is_infinite ( location ) )
- {
- ( *Coordonnes ) [k++] = p.x(); ( *Coordonnes ) [k++] = p.y(); ( *Coordonnes ) [k++] = p.z();
-
- location = Tri->locate ( p2 );
- if ( !Tri->is_infinite ( location ) ) { p = p2; }
- else
- {
- n = 0;
- v1 = f_it->first->vertex ( n == id_facet ? ++n : n )->point(); n++;
- v2 = f_it->first->vertex ( n == id_facet ? ++n : n )->point(); n++;
- v3 = f_it->first->vertex ( n == id_facet ? ++n : n )->point(); n++;
- Plan P1 ( v1, v2, v3 );
-
- result = CGAL::intersection ( P1, Droite ( p, p2 ) );
- if ( !CGAL::assign ( p, result ) ) std::cout << "pas de point d'intersection!!!!!!!!!" << std::endl;
- }
- ( *Coordonnes ) [k++] = p.x(); ( *Coordonnes ) [k++] = p.y(); ( *Coordonnes ) [k++] = p.z();
- }
- else
- {
- location = Tri->locate ( p2 );
- if ( !Tri->is_infinite ( location ) )
- {
- ( *Coordonnes ) [k++] = p2.x(); ( *Coordonnes ) [k++] = p2.y(); ( *Coordonnes ) [k++] = p2.z();
- n = 0;
- n = 0;
- v1 = f_it->first->vertex ( n == id_facet ? ++n : n )->point(); n++;
- v2 = f_it->first->vertex ( n == id_facet ? ++n : n )->point(); n++;
- v3 = f_it->first->vertex ( n == id_facet ? ++n : n )->point(); n++;
- Plan P1 ( v1, v2, v3 );
-
- result = CGAL::intersection ( P1, Droite ( p, p2 ) );
- if ( !CGAL::assign ( p, result ) ) std::cout << "pas de point d'intersection!!!!!!!!!" << std::endl;
- ( *Coordonnes ) [k++] = p.x(); ( *Coordonnes ) [k++] = p.y(); ( *Coordonnes ) [k++] = p.z();
- }
- }
- }
- }
- return k/6;
-}
-
-
-
-long Tesselation::New_liste_edges ( Real** Coordonnes )
-{
- Delete_liste_edges ( Coordonnes );
- //long j = 6 * T.number_of_finite_edges();
-
- long Nff = Tri->number_of_finite_facets();
- *Coordonnes = new Real [6 * Nff];
-
- long k = 0;
- Point p;
-
- // const Edge & e : (e.first, e.second, e.third) == const Cell_handle& c, int i, int j
- //H2.top("initialisation de la liste de segments");
- for ( Finite_facets_iterator f_it = Tri->finite_facets_begin(); f_it != Tri->finite_facets_end(); f_it++ )
- {
- if ( !Tri->is_infinite ( f_it->first ) )
- {
- p = f_it->first->info();
- //}
- ( *Coordonnes ) [k++] = p.x(); ( *Coordonnes ) [k++] = p.y(); ( *Coordonnes ) [k++] = p.z();
-
- Cell_handle cell = f_it->first->neighbor ( f_it->second );
- if ( !Tri->is_infinite ( cell ) )
- {
- p = cell->info();
- }
- ( *Coordonnes ) [k++] = p.x(); ( *Coordonnes ) [k++] = p.y(); ( *Coordonnes ) [k++] = p.z();
- }
- }
- return Nff;
-}
-
-
-Segment Tesselation::Dual ( Finite_facets_iterator &f_it )
-{
- return Segment ( f_it->first->info(), ( f_it->first->neighbor ( f_it->second ) )->info() );
-}
-
-double Tesselation::ComputeVFacetArea ( Finite_edges_iterator ed_it )
-{
- Cell_circulator cell0 = Tri->incident_cells ( *ed_it );
- Cell_circulator cell2 = cell0;
-
- if ( Tri->is_infinite ( cell2 ) )
- {
- ++cell2;
- while ( Tri->is_infinite ( cell2 ) && cell2!=cell0 ) ++cell2;
- if ( cell2==cell0 ) return 0;
- }
- cell0=cell2++;
- Cell_circulator cell1=cell2++;
- Real area = 0;
-
- while ( cell2!=cell0 )
- {
- area+= sqrt(std::abs (( Triangle ( cell0->info(), cell1->info(), cell2->info() ) ).squared_area())) ;
- ++cell1;
- ++cell2;
- }
-
- return area;
-}
-
-void Tesselation::AssignPartialVolume ( Finite_edges_iterator& ed_it )
-{
- //Edge_iterator ed_it
- Cell_circulator cell0=Tri->incident_cells ( *ed_it );
- Cell_circulator cell2=cell0;
- if ( Tri->is_infinite ( cell2 ) )
- {
- ++cell2;
- while ( Tri->is_infinite ( cell2 ) && cell2!=cell0 ) ++cell2;
- if ( cell2==cell0 ) return;
- }
- cell0=cell2++;
- Cell_circulator cell1=cell2++;
- //std::cout << "edge : " << ed_it->first->vertex ( ed_it->second )->info().id() << "-" << ed_it->first->vertex ( ed_it->third )->info().id() << std::endl;
- bool isFictious1 = ( ed_it->first )->vertex ( ed_it->second )->info().isFictious;
- bool isFictious2 = ( ed_it->first )->vertex ( ed_it->third )->info().isFictious;
- Real r;
-
- //cout << "cell0 : " << cell0->vertex(0)->info().id() << " "
- // << cell0->vertex(1)->info().id() << " "
- // << cell0->vertex(2)->info().id() << " "
- // << cell0->vertex(3)->info().id() << "(center : " << (Point) cell0->info() << ")" << endl;
-
- while ( cell2!=cell0 )
- {
- if ( !Tri->is_infinite ( cell1 ) && !Tri->is_infinite ( cell2 ) )
- {
- // cout << "cell1 : " << cell1->vertex(0)->info().id() << " "
- // << cell1->vertex(1)->info().id() << " "
- // << cell1->vertex(2)->info().id() << " "
- // << cell1->vertex(3)->info().id() << "(center : " << (Point) cell1->info() << ")" << endl;
- // cout << "cell2 : " << cell2->vertex(0)->info().id() << " "
- // << cell2->vertex(1)->info().id() << " "
- // << cell2->vertex(2)->info().id() << " "
- // << cell2->vertex(3)->info().id() << "(center : " << (Point) cell2->info() << ")" << endl;
-
- //std::cout << "assign tetra : (" << ed_it->first->vertex ( ed_it->second )->point() << "),(" << cell0->info() << "),(" << cell1->info() << "),(" <<cell2->info() << ")" << std::endl;
- if ( !isFictious1 )
- {
- r = std::abs ( ( Tetraedre ( ed_it->first->vertex ( ed_it->second )->point(), cell0->info(), cell1->info(), cell2->info() ) ).volume() );
- //std::cout << "assigned1=" << r << " on " << ed_it->first->vertex ( ed_it->second )->info().id() << std::endl;
- ( ed_it->first )->vertex ( ed_it->second )->info().v() += r;
- TotalFiniteVoronoiVolume+=r;
- }
- //std::cout << "assign tetra : (" << ed_it->first->vertex ( ed_it->third )->point() << "),(" << cell0->info() << "),(" << cell1->info() << "),(" <<cell2->info() << ")" << std::endl;
- if ( !isFictious2 )
- {
- r = std::abs ( ( Tetraedre ( ed_it->first->vertex ( ed_it->third )->point(), cell0->info(), cell1->info(), cell2->info() ) ).volume() );
- //std::cout << "assigned2=" << r << " on " << ed_it->first->vertex ( ed_it->third )->info().id() << std::endl;
- ed_it->first->vertex ( ed_it->third )->info().v() +=r;
- TotalFiniteVoronoiVolume+=r;
- }
- }
- ++cell1; ++cell2;
- }
- //std::cout << "fin AssignPartialVolume" << std::endl;
-}
-
-void Tesselation::ResetVCellVolumes ( void )
-{
- for ( Vertex_iterator V_it = Tri->vertices_begin (); V_it != Tri->vertices_end (); V_it++ )
- {
- V_it->info().v() =0;
- }
- TotalFiniteVoronoiVolume=0;
- TotalInternalVoronoiPorosity=0;
-}
-
-void Tesselation::ComputeVolumes ( void )
-{
- if ( !computed ) Compute();
- ResetVCellVolumes();
- for ( Finite_edges_iterator ed_it=Tri->finite_edges_begin(); ed_it!=Tri->finite_edges_end();ed_it++ )
- {
- AssignPartialVolume ( ed_it );
- }
- //Delete volume for spheres on the boarders of the packing
- //FIXME: find a way to compute a volume correctly for spheres of the boarders.
-
-// Vector_Vertex boarder_vertices;
-// Voisins(Tri->infinite_vertex (), boarder_vertices);
-// unsigned int l = boarder_vertices.size();
-// for (unsigned int i=0; i<l; ++i) boarder_vertices[i]->info().v()=0;
-// cout << "TotalVolume : " << TotalFiniteVoronoiVolume << endl;
-}
-
-void Tesselation::ComputePorosity ( void ) //WARNING : This function will erase real volumes of cells
-{
- // and replace it with porosity
- ComputeVolumes();
- //Real rr=0;
- Finite_vertices_iterator vertices_end = Tri->finite_vertices_end ();
- for ( Finite_vertices_iterator V_it = Tri->finite_vertices_begin (); V_it != vertices_end; V_it++ )
- {
- if ( V_it->info().v() && !V_it->info().isFictious )
- {
- Real r = 4.188790 * std::pow ( ( V_it->point().weight() ),1.5 );// 4/3*PI*R³ = 4.188...*R³
- TotalInternalVoronoiPorosity+=r;
- //rr+=V_it->info().v();
- TotalInternalVoronoiVolume += V_it->info().v();
- V_it->info().v() =
- ( V_it->info().v() - r )
- / V_it->info().v();
- //std::cout << "Cell " << V_it->info().id() << ": V_it->point().weight()=" << V_it->point().weight() << std::endl;
- std::cout << "Cell " << V_it->info().id() << ": v=" << V_it->info().v() << " radius=" << sqrt ( V_it->point().weight() ) << " volume sphere ="<< r << std::endl;
- }
- }
- std::cout << "total internal solid = " << TotalInternalVoronoiPorosity << std::endl;
- std::cout << "TotalFiniteVoronoiVolume = " << TotalFiniteVoronoiVolume << std::endl;
- std::cout << "TotalInternalVoronoiVolume = " << TotalInternalVoronoiVolume << std::endl;
-
- TotalInternalVoronoiPorosity= ( TotalInternalVoronoiVolume-TotalInternalVoronoiPorosity ) /TotalInternalVoronoiVolume;
- std::cout << "TotalInternalVoronoiPorosity = " << TotalInternalVoronoiPorosity << std::endl;
-}
-
-
-
-bool Tesselation::is_internal ( Finite_facets_iterator &facet )
-{
- return ( !Tri->is_infinite ( facet->first ) && !Tri->is_infinite ( facet->first->neighbor ( facet->second ) ) );
-}
-
-// Real& Tesselation::Volume(unsigned int id)
-// {
-// return vertexHandles[id]->info().v();
-// }
-
-} //namespace CGT
=== modified file 'pkg/common/InsertionSortCollider.cpp'
--- pkg/common/InsertionSortCollider.cpp 2012-01-23 14:43:54 +0000
+++ pkg/common/InsertionSortCollider.cpp 2012-01-26 11:19:05 +0000
@@ -68,15 +68,19 @@
vector<Body::id_t> ret;
for( vector<Bounds>::iterator
it=BB[0].vec.begin(),et=BB[0].vec.end(); it < et; ++it)
- {
+ {
if (it->coord > bv.max[0]) break;
if (!it->flags.isMin || !it->flags.hasBB) continue;
int offset = 3*it->id;
- if (!(maxima[offset] < bv.min[0] ||
- minima[offset+1] > bv.max[1] ||
- maxima[offset+1] < bv.min[1] ||
- minima[offset+2] > bv.max[2] ||
- maxima[offset+2] < bv.min[2] ))
+ const shared_ptr<Body>& b=Body::byId(it->id,scene);
+ if(unlikely(!b)) continue;
+ const Real& sweepLength = b->bound->sweepLength;
+ if (!(maxima[offset]-sweepLength < bv.min[0] ||
+ minima[offset]+sweepLength > bv.min[0] ||
+ minima[offset+1]+sweepLength > bv.max[1] ||
+ maxima[offset+1]-sweepLength < bv.min[1] ||
+ minima[offset+2]+sweepLength > bv.max[2] ||
+ maxima[offset+2]-sweepLength < bv.min[2] ))
{
ret.push_back(it->id);
}