Skip to content

Commit 7dec87b

Browse files
committed
improve geometry processing
1 parent 34a4617 commit 7dec87b

25 files changed

+1698
-1930
lines changed

IfcPlusPlus/src/external/Carve/src/include/carve/geom3d.hpp

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,47 @@ bool fitPlane(iter_t begin, iter_t end, adapt_t adapt, Plane& plane) {
7171
} else {
7272
const size_t N = p.size();
7373

74-
n = cross(p[N - 1] - C, p[0] - C);
75-
if (n < Vector::ZERO()) {
76-
n.negate();
77-
}
78-
for (size_t i = 1; i < p.size(); ++i) {
79-
Vector v = cross(p[i] - C, p[i - 1] - C);
80-
if (v < Vector::ZERO()) {
81-
v.negate();
82-
}
83-
n += v;
84-
}
74+
// original carve algorithm does not always work:
75+
//n = cross(p[N - 1] - C, p[0] - C);
76+
//if (n < Vector::ZERO()) {
77+
// n.negate();
78+
//}
79+
//for (size_t i = 1; i < p.size(); ++i) {
80+
// Vector v = cross(p[i] - C, p[i - 1] - C);
81+
// if (v < Vector::ZERO()) {
82+
// v.negate();
83+
// }
84+
// n += v;
85+
//}
86+
87+
88+
n = carve::geom::VECTOR( 0, 0, 0 );
89+
bool last_loop = false;
90+
for( std::vector<Vector >::const_iterator it = p.begin();; )
91+
{
92+
const Vector& vertex_current = ( *it );
93+
++it;
94+
if( it == p.end() )
95+
{
96+
it = p.begin();
97+
last_loop = true;
98+
}
99+
const Vector& vertex_next = ( *it );
100+
n[0] += ( vertex_current.y - vertex_next.y )*( vertex_current.z + vertex_next.z );
101+
n[1] += ( vertex_current.z - vertex_next.z )*( vertex_current.x + vertex_next.x );
102+
n[2] += ( vertex_current.x - vertex_next.x )*( vertex_current.y + vertex_next.y );
103+
if( last_loop )
104+
{
105+
break;
106+
}
107+
}
108+
//n.normalize();
109+
85110
}
86111

87112
double l = n.length();
88113

89-
if (l == 0.0) {
114+
if (std::abs(l) < CARVE_EPSILON*0.001 ) {
90115
n.x = 1.0;
91116
n.y = 0.0;
92117
n.z = 0.0;
@@ -97,11 +122,17 @@ bool fitPlane(iter_t begin, iter_t end, adapt_t adapt, Plane& plane) {
97122
plane.N = n;
98123
plane.d = -dot(n, C);
99124

100-
#if defined(CARVE_DEBUG)
101-
if (p.size() > 3) {
102-
std::cerr << "N-gon with " << p.size() << " vertices: fitted distance:";
103-
for (size_t i = 0; i < p.size(); ++i) {
104-
std::cerr << " {" << p[i] << "} " << distance(plane, p[i]);
125+
#if defined(_DEBUG)
126+
if (p.size() > 3)
127+
{
128+
//std::cerr << "N-gon with " << p.size() << " vertices: fitted distance:";
129+
for (size_t i = 0; i < p.size(); ++i)
130+
{
131+
double distanceFromPlane = distance(plane, p[i]);
132+
if( std::abs(distanceFromPlane) > CARVE_EPSILON )
133+
{
134+
std::cerr << " {" << p[i] << "} " << distanceFromPlane;
135+
}
105136
}
106137
std::cerr << std::endl;
107138
}

IfcPlusPlus/src/external/Carve/src/lib/mesh.cpp

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -426,12 +426,19 @@ namespace carve {
426426

427427
edge_map_t::iterator edgeiter;
428428
edgeiter = complex_edges.find(vpair_t(vert, next));
429-
std::copy((*edgeiter).second.begin(), (*edgeiter).second.end(),
430-
std::back_inserter(efwd));
429+
if( edgeiter == complex_edges.end() )
430+
{
431+
return;
432+
}
433+
std::copy((*edgeiter).second.begin(), (*edgeiter).second.end(), std::back_inserter(efwd));
431434

432435
edgeiter = complex_edges.find(vpair_t(next, vert));
433-
std::copy((*edgeiter).second.begin(), (*edgeiter).second.end(),
434-
std::back_inserter(erev));
436+
if( edgeiter == complex_edges.end() )
437+
{
438+
return;
439+
}
440+
441+
std::copy((*edgeiter).second.begin(), (*edgeiter).second.end(), std::back_inserter(erev));
435442

436443
path.push_back(vert);
437444

@@ -696,8 +703,24 @@ namespace carve {
696703
j != (*e2i).second.end(); ++j ) {
697704
open_groups.insert(faceGroupID(*j));
698705
}
706+
707+
bool eraseSecond = true;
708+
if( e2i == e2i )
709+
{
710+
eraseSecond == false;
711+
//eraseSecond = false;
712+
}
699713
complex_edges.erase(e1i);
700-
complex_edges.erase(e2i);
714+
if( eraseSecond )
715+
{
716+
edge_map_t::iterator e2i_check = complex_edges.find(e2);
717+
if( e2i_check != complex_edges.end() )
718+
719+
//if( e2i != complex_edges.end() )
720+
{
721+
complex_edges.erase(e2i_check);
722+
}
723+
}
701724
}
702725
}
703726
}

0 commit comments

Comments
 (0)