Triangles: Memory optimization

This commit is contained in:
Matthias Koefferlein 2023-08-19 01:55:04 +02:00
parent ae3588ab16
commit c6b7908499
3 changed files with 26 additions and 11 deletions

View File

@ -30,6 +30,7 @@
#include "dbEdge.h"
#include "tlObjectCollection.h"
#include "tlList.h"
namespace db
{
@ -428,7 +429,7 @@ struct TriangleEdgeLessFunc
* @brief A class representing a triangle
*/
class DB_PUBLIC Triangle
: public tl::Object
: public tl::list_node<Triangle>, public tl::Object
{
public:
Triangle ();

View File

@ -42,7 +42,7 @@ Triangles::Triangles ()
Triangles::~Triangles ()
{
while (! mp_triangles.empty ()) {
remove (mp_triangles.front ());
remove (mp_triangles.begin ().operator-> ());
}
}
@ -63,10 +63,20 @@ Triangles::create_vertex (const db::DPoint &pt)
db::TriangleEdge *
Triangles::create_edge (db::Vertex *v1, db::Vertex *v2)
{
m_edges_heap.push_back (db::TriangleEdge (v1, v2));
m_edges_heap.back ().link ();
m_edges_heap.back ().set_id (++m_id);
return &m_edges_heap.back ();
db::TriangleEdge *edge = 0;
if (! m_returned_edges.empty ()) {
edge = m_returned_edges.back ();
m_returned_edges.pop_back ();
*edge = db::TriangleEdge (v1, v2);
} else {
m_edges_heap.push_back (db::TriangleEdge (v1, v2));
edge = &m_edges_heap.back ();
}
edge->link ();
edge->set_id (++m_id);
return edge;
}
db::Triangle *
@ -90,8 +100,10 @@ Triangles::remove (db::Triangle *tri)
// clean up edges we do no longer need
for (int i = 0; i < 3; ++i) {
if (edges [i] && edges [i]->left () == 0 && edges [i]->right () == 0) {
edges [i]->unlink ();
db::TriangleEdge *e = edges [i];
if (e && e->left () == 0 && e->right () == 0 && e->v1 ()) {
e->unlink ();
m_returned_edges.push_back (e);
}
}
}
@ -392,7 +404,7 @@ Triangles::find_closest_edge (const db::DPoint &p, db::Vertex *vstart, bool insi
// A sample heuristics that takes a sqrt(N) sample from the
// vertexes to find a good starting point
vstart = mp_triangles.front ()->vertex (0);
vstart = mp_triangles.begin ()->vertex (0);
double dmin = vstart->distance (p);
while (ls * ls < m) {
@ -1381,6 +1393,7 @@ Triangles::clear ()
m_edges_heap.clear ();
mp_triangles.clear ();
m_vertex_heap.clear ();
m_returned_edges.clear ();
m_is_constrained = false;
m_level = 0;
m_id = 0;

View File

@ -77,7 +77,7 @@ public:
int base_verbosity;
};
typedef tl::shared_collection<db::Triangle> triangles_type;
typedef tl::list<db::Triangle> triangles_type;
typedef triangles_type::const_iterator triangle_iterator;
Triangles ();
@ -252,8 +252,9 @@ public:
std::vector<db::Vertex *> find_inside_circle (const db::DPoint &center, double radius) const;
private:
tl::shared_collection<db::Triangle> mp_triangles;
tl::list<db::Triangle> mp_triangles;
tl::stable_vector<db::TriangleEdge> m_edges_heap;
std::vector<db::TriangleEdge *> m_returned_edges;
tl::stable_vector<db::Vertex> m_vertex_heap;
bool m_is_constrained;
size_t m_level;