Skip to content

Commit

Permalink
Improved signed distance.
Browse files Browse the repository at this point in the history
  • Loading branch information
Ricardo Serrano committed May 31, 2017
1 parent 4e5f0c5 commit 1e5609c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
8 changes: 5 additions & 3 deletions geomodelr/cpp/model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ double Model::signed_distance_bounded( const wstring& unit, const point3& pt ) c
double sdist = this->signed_distance( unit, pt );
bool outside = false;
double odist = 0.0;
// double idist = -std::numeric_limits<double>::infinity(); In the future, fix distance below too.
double idist = -std::numeric_limits<double>::infinity(); // In the future, fix distance below too.

double x = gx(pt);
double y = gy(pt);
Expand All @@ -220,14 +220,16 @@ double Model::signed_distance_bounded( const wstring& unit, const point3& pt ) c
if ( dists[i] >= 0 ) {
outside = true;
odist += dists[i]*dists[i];
} else {
idist = std::max(idist, dists[i]);
}
}

if ( outside ) {
return std::max(sdist, std::sqrt(odist));
}
return sdist;
return std::max(sdist, idist);
}


vector<Model::Possible> Model::all_closest( size_t a_idx, const point2& pt_a, const point2& pt_b ) const {
vector<Model::Possible> possible = this->get_candidates(a_idx, pt_a, pt_b, always_true);
Expand Down
16 changes: 11 additions & 5 deletions geomodelr/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ def edges_triangles( triangles ):
edgs_tris[e] = [i]
return edgs_tris

def check_edges( triangles ):
edgs_tris = edges_triangles( triangles )
bedgs = [ (e, v) for e, v in edgs_tris.iteritems() if len(v) != 2 ]
return bedgs

def fix_step( vertices, triangles ):
tree = cKDTree(vertices)
pairs = tree.query_pairs(1e-9)
Expand All @@ -77,16 +82,13 @@ def fix_step( vertices, triangles ):
renum[p[0]] = p[1]

if len(to_remove) == 0:
check_things_out( vertices, triangles, pairs )
assert len(check_edges( triangles )) == 0
return None

to_remove = set(to_remove)
triangles = [ tuple([ n if not n in renum else renum[n] for n in t ]) for i, t in enumerate(triangles) if not i in to_remove ]

edgs_tris = edges_triangles( triangles )
bedgs = [ (e, v) for e, v in edgs_tris.iteritems() if len(v) != 2 ]

assert len(bedgs) == 0
assert len(check_edges(triangles)) == 0

idx = 0
newverts = []
Expand All @@ -101,6 +103,9 @@ def fix_step( vertices, triangles ):
return newverts, triangles

def fix_solid( vertices, triangles ):
bedgs = check_edges(triangles)

assert len(check_edges(triangles)) == 0
while True:
res = fix_step( vertices, triangles )
if res is None:
Expand Down Expand Up @@ -165,6 +170,7 @@ def save_unit( name, model, unit, grid_divisions ):
for i, f in enumerate(simplices):
for j in range(3):
m.vectors[i][j] = vertices[f[j]]

m.save(name)

def generate_simple_grid(query_func, bbox, grid_divisions):
Expand Down

0 comments on commit 1e5609c

Please sign in to comment.