Merge branch 'stl_boundary_only_hashtable' into 'master'

only use hashtable in stlboundary

See merge request jschoeberl/netgen!242
This commit is contained in:
Joachim Schöberl 2019-09-22 15:53:01 +00:00
commit e9f57e28b6
2 changed files with 34 additions and 36 deletions

View File

@ -852,20 +852,25 @@ STLBoundary :: STLBoundary (STLGeometry * ageometry)
void STLBoundary :: AddOrDelSegment(const STLBoundarySeg & seg) void STLBoundary :: AddOrDelSegment(const STLBoundarySeg & seg)
{ {
bool found = false; INDEX_2 op(seg.I1(), seg.I2());
for (int i = 1; i <= boundary.Size(); i++) if(boundary_ht.Used(op))
{ boundary_ht.Delete(op);
if (found) { boundary.Elem(i-1) = boundary.Get(i); }
if (boundary.Get(i) == seg) { found = true; }
}
if (!found)
{
boundary.Append(seg);
}
else else
{ boundary_ht[op] = seg;
boundary.SetSize(boundary.Size()-1); // bool found = false;
} // for (int i = 1; i <= boundary.Size(); i++)
// {
// if (found) { boundary.Elem(i-1) = boundary.Get(i); }
// if (boundary.Get(i) == seg) { found = true; }
// }
// if (!found)
// {
// boundary.Append(seg);
// }
// else
// {
// boundary.SetSize(boundary.Size()-1);
// }
} }
void STLBoundary ::AddTriangle(const STLTriangle & t) void STLBoundary ::AddTriangle(const STLTriangle & t)
@ -1009,18 +1014,7 @@ void STLBoundary ::AddTriangle(const STLTriangle & t)
{ {
STLBoundarySeg bseg(seg[0], seg[1], geometry->GetPoints(), chart); STLBoundarySeg bseg(seg[0], seg[1], geometry->GetPoints(), chart);
bseg.SetSmoothEdge (geometry->IsSmoothEdge (seg[0],seg[1])); bseg.SetSmoothEdge (geometry->IsSmoothEdge (seg[0],seg[1]));
AddOrDelSegment(bseg);
INDEX_2 op(seg[1], seg[0]);
if (boundary_ht.Used(op))
{
// cout << "delete " << op << endl;
boundary_ht.Delete(op);
}
else
{
// cout << "insert " << seg << endl;
boundary_ht[seg] = bseg;
}
} }
/* /*
// cout << "bounds = " << boundary << endl; // cout << "bounds = " << boundary << endl;
@ -1106,12 +1100,8 @@ bool STLBoundary :: TestSeg(const Point<3>& p1, const Point<3> & p2, const Vec<3
Point<3> c = Center (p1, p2); Point<3> c = Center (p1, p2);
double dist1 = Dist (c, p1); double dist1 = Dist (c, p1);
int nseg = NOSegments(); for (const auto& [index, seg] : boundary_ht)
for (j = 1; j <= nseg; j++)
{ {
const STLBoundarySeg & seg = GetSegment(j);
if (seg.IsSmoothEdge()) if (seg.IsSmoothEdge())
continue; continue;

View File

@ -187,23 +187,31 @@ class STLBoundary
private: private:
STLGeometry * geometry; STLGeometry * geometry;
const STLChart * chart; const STLChart * chart;
NgArray<STLBoundarySeg> boundary; // NgArray<STLBoundarySeg> boundary;
ClosedHashTable<INDEX_2, STLBoundarySeg> boundary_ht; ClosedHashTable<INDEX_2, STLBoundarySeg> boundary_ht;
BoxTree<2,INDEX_2> * searchtree = nullptr; BoxTree<2,INDEX_2> * searchtree = nullptr;
public: public:
STLBoundary(STLGeometry * ageometry); STLBoundary(STLGeometry * ageometry);
~STLBoundary() { delete searchtree; } ~STLBoundary() { delete searchtree; }
void Clear() {boundary.SetSize(0); boundary_ht = ClosedHashTable<INDEX_2,STLBoundarySeg>(); } void Clear() {/* boundary.SetSize(0)*/; boundary_ht = ClosedHashTable<INDEX_2,STLBoundarySeg>(); }
void SetChart (const STLChart * achart) { chart = achart; } void SetChart (const STLChart * achart) { chart = achart; }
//don't check, if already exists! //don't check, if already exists!
void AddNewSegment(const STLBoundarySeg & seg) {boundary.Append(seg);}; void AddNewSegment(const STLBoundarySeg & seg)
{
// boundary.Append(seg);
INDEX_2 op(seg.I1(), seg.I2());
boundary_ht[op] = seg;
};
//check if segment exists //check if segment exists
void AddOrDelSegment(const STLBoundarySeg & seg); void AddOrDelSegment(const STLBoundarySeg & seg);
//addordelsegment for all 3 triangle segments! //addordelsegment for all 3 triangle segments!
void AddTriangle(const STLTriangle & t); void AddTriangle(const STLTriangle & t);
int NOSegments() {return boundary.Size();}; int NOSegments() {
const STLBoundarySeg & GetSegment(int i) {return boundary.Get(i);} return boundary_ht.Size();
// return boundary.Size();
};
// const STLBoundarySeg & GetSegment(int i) {return boundary.Get(i);}
void BuildSearchTree(); void BuildSearchTree();
void DeleteSearchTree(); void DeleteSearchTree();