star-enclosures-3d

Extract enclosures from 3D geometry
git clone git://git.meso-star.fr/star-enclosures-3d.git
Log | Files | Refs | README | LICENSE

commit 358b00c1371eda630adef5897c6a8e4fad42a183
parent 4bb8948d0893a77fe836788c36e48740791f86c3
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 16 Feb 2018 15:30:35 +0100

Bugfix: mutiple bugs in analyze.

When selecting the starting point for inter-component raytracing.

Diffstat:
Msrc/senc_scene_analyze.c | 39+++++++++++++++++++++++++++++----------
1 file changed, 29 insertions(+), 10 deletions(-)

diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c @@ -151,7 +151,7 @@ find_component_Zmax * This is mandatory to select the correct side when both sides of a triangle * are candidate. */ if(cc->max_vrtx[2] > trg_tmp->max_z) - return; + continue; d3_sub(edge0, vertices[trg_in->vertice_id[1]].vec, vertices[trg_in->vertice_id[0]].vec); @@ -189,6 +189,7 @@ find_component_Zmax ASSERT(trg_tmp->max_z_vrtx_id < 3); ASSERT(trg_in->vertice_id[trg_tmp->max_z_vrtx_id] < scn->nverts); cc->max_z_vrtx_id = trg_in->vertice_id[trg_tmp->max_z_vrtx_id]; + ASSERT(trg_tmp->max_z == vertices[cc->max_z_vrtx_id].pos.z); d3_set(cc->max_vrtx, vertices[cc->max_z_vrtx_id].vec); } } @@ -812,13 +813,13 @@ link_neighbours edge_count = (edge_id_t)tmp; FOR_EACH(e, 0, edge_count) { - double edge[3], common_edge[3], basis[9], norm, mz; + double edge[3], common_edge[3], basis[9], norm, mz, mz_edge; vrtx_id_t v0, v1, v2; struct edge_neighbourhood* neighbourhood = darray_neighbourhood_data_get(neighbourhood_by_edge) + e; struct darray_neighbour* neighbour_list = &neighbourhood->neighbours; side_id_t i, neighbour_count; - char mz_vid; + char mz_vid, mz_vid_edge; tmp = darray_neighbour_size_get(neighbour_list); ASSERT(tmp <= SIDE_MAX__); neighbour_count = (side_id_t)tmp; @@ -827,11 +828,11 @@ link_neighbours v1 = neighbourhood->edge.vrtx1; d3_sub(common_edge, vertices[v1].vec, vertices[v0].vec); if(vertices[v0].pos.z > vertices[v1].pos.z) { - mz = vertices[v0].pos.z; - mz_vid = 0; + mz_edge = vertices[v0].pos.z; + mz_vid_edge = 0; } else { - mz = vertices[v1].pos.z; - mz_vid = 1; + mz_edge = vertices[v1].pos.z; + mz_vid_edge = 1; } norm = d3_normalize(common_edge, common_edge); ASSERT(norm); @@ -842,20 +843,38 @@ link_neighbours = darray_neighbour_data_get(neighbour_list) + i; struct triangle_in *trg_in = triangles_in + neighbour_info->trg_id; struct triangle_tmp *neighbour = triangles_tmp + neighbour_info->trg_id; + char actual_vid; v2 = trg_in->vertice_id[(neighbour_info->edge_rank + 2) % 3]; - if(vertices[v2].pos.z > mz) { + if(vertices[v2].pos.z > mz_edge) { mz = vertices[v2].pos.z; mz_vid = 2; + } else { + mz = mz_edge; + mz_vid = mz_vid_edge; + } + /* Compute the actual vertex id + * as vertices are not in the v0 v1 v2 order in the actual triangle */ + if (mz_vid == 2) { + actual_vid = (2 + neighbour_info->edge_rank) % 3; + } + else { + int is_r = neighbour->reversed_edge[neighbour_info->edge_rank]; + ASSERT(mz_vid == 0 || mz_vid == 1); + actual_vid = ((is_r ? 1 - mz_vid : mz_vid) + neighbour_info->edge_rank) % 3; } + + ASSERT(neighbour->max_z <= mz); neighbour->max_z = mz; - neighbour->max_z_vrtx_id = mz_vid; + ASSERT(0 <= actual_vid && actual_vid <= 2); + neighbour->max_z_vrtx_id = actual_vid; /* Compute rotation angle around common edge */ d3_sub(edge, vertices[v2].vec, vertices[v0].vec); d33_muld3(edge, basis, edge); ASSERT(d3_len(edge) && (edge[0] || edge[1])); neighbour_info->angle = atan2(edge[1], edge[0]); if(neighbour_info->angle < 0) neighbour_info->angle += 2 * PI; - ASSERT(0 <= neighbour_info->angle && neighbour_info->angle < 2 * PI); + /* Due to catastrophic cancelation, -eps+2pi translates to 2pi */ + ASSERT(0 <= neighbour_info->angle && neighbour_info->angle <= 2 * PI); } /* Sort triangles by rotation angle */ qsort(darray_neighbour_data_get(neighbour_list), neighbour_count,