[traverse] enhance validity by checking touching (uu or combined turns creating a touch)

in clusters.
This commit is contained in:
Barend Gehrels 2016-04-27 11:39:40 +02:00
parent 5178c4e241
commit df9a97dea8
6 changed files with 29 additions and 26 deletions

View File

@ -354,7 +354,7 @@ struct traversal
inline bool select_from_cluster(signed_size_type& turn_index, inline bool select_from_cluster(signed_size_type& turn_index,
int& op_index, signed_size_type start_turn_index, int& op_index, signed_size_type start_turn_index,
sbs_type const& sbs, bool allow_pass_rank) const sbs_type const& sbs, bool is_touching) const
{ {
bool const is_union = OperationType == operation_union; bool const is_union = OperationType == operation_union;
bool const is_intersection = OperationType == operation_intersection; bool const is_intersection = OperationType == operation_intersection;
@ -380,7 +380,7 @@ struct traversal
return false; return false;
} }
if (! allow_pass_rank && ranked_op.visited.finalized()) if (! is_touching && ranked_op.visited.finalized())
{ {
// Skip this one, go to next // Skip this one, go to next
min_rank = ranked_point.main_rank; min_rank = ranked_point.main_rank;
@ -419,7 +419,7 @@ struct traversal
result = true; result = true;
selected_rank = ranked_point.main_rank; selected_rank = ranked_point.main_rank;
} }
else if (! allow_pass_rank) else if (! is_touching)
{ {
return result; return result;
} }
@ -429,7 +429,8 @@ struct traversal
} }
inline bool select_turn_from_cluster(signed_size_type& turn_index, inline bool select_turn_from_cluster(signed_size_type& turn_index,
int& op_index, signed_size_type start_turn_index, int& op_index, bool& is_touching,
signed_size_type start_turn_index,
segment_identifier const& previous_seg_id) const segment_identifier const& previous_seg_id) const
{ {
bool const is_union = OperationType == operation_union; bool const is_union = OperationType == operation_union;
@ -517,14 +518,14 @@ struct traversal
} }
} }
bool allow = false; is_touching = open_count > 1;
if (open_count > 1) if (is_touching)
{ {
sbs.reverse(); sbs.reverse();
allow = true;
} }
return select_from_cluster(turn_index, op_index, start_turn_index, sbs, allow); return select_from_cluster(turn_index, op_index, start_turn_index, sbs,
is_touching);
} }
inline void change_index_for_self_turn(signed_size_type& to_vertex_index, inline void change_index_for_self_turn(signed_size_type& to_vertex_index,
@ -624,6 +625,7 @@ struct traversal
bool select_turn(signed_size_type start_turn_index, bool select_turn(signed_size_type start_turn_index,
signed_size_type& turn_index, signed_size_type& turn_index,
int& op_index, int& op_index,
bool& is_touching,
int previous_op_index, int previous_op_index,
signed_size_type previous_turn_index, signed_size_type previous_turn_index,
segment_identifier const& previous_seg_id, segment_identifier const& previous_seg_id,
@ -631,7 +633,7 @@ struct traversal
{ {
if (m_turns[turn_index].cluster_id >= 0) if (m_turns[turn_index].cluster_id >= 0)
{ {
if (! select_turn_from_cluster(turn_index, op_index, if (! select_turn_from_cluster(turn_index, op_index, is_touching,
start_turn_index, previous_seg_id)) start_turn_index, previous_seg_id))
{ {
return false; return false;

View File

@ -119,7 +119,9 @@ struct traversal_ring_creator
m_visitor.visit_traverse(m_turns, previous_turn, previous_op, "Start"); m_visitor.visit_traverse(m_turns, previous_turn, previous_op, "Start");
} }
bool is_touching = false;
if (! m_trav.select_turn(start_turn_index, turn_index, op_index, if (! m_trav.select_turn(start_turn_index, turn_index, op_index,
is_touching,
previous_op_index, previous_turn_index, previous_seg_id, previous_op_index, previous_turn_index, previous_seg_id,
is_start)) is_start))
{ {

View File

@ -66,6 +66,7 @@ struct traversal_switch_detector
int start_op_index, int start_op_index,
signed_size_type& turn_index, signed_size_type& turn_index,
int& op_index, int& op_index,
bool& is_touching,
bool is_start) bool is_start)
{ {
int const previous_op_index = op_index; int const previous_op_index = op_index;
@ -99,6 +100,7 @@ struct traversal_switch_detector
} }
if (! m_trav.select_turn(start_turn_index, turn_index, op_index, if (! m_trav.select_turn(start_turn_index, turn_index, op_index,
is_touching,
previous_op_index, previous_turn_index, previous_seg_id, previous_op_index, previous_turn_index, previous_seg_id,
is_start)) is_start))
{ {
@ -137,9 +139,10 @@ struct traversal_switch_detector
signed_size_type current_turn_index = start_turn_index; signed_size_type current_turn_index = start_turn_index;
int current_op_index = start_op_index; int current_op_index = start_op_index;
bool is_touching = false;
traverse_error_type error = travel_to_next_turn(start_turn_index, traverse_error_type error = travel_to_next_turn(start_turn_index,
start_op_index, start_op_index,
current_turn_index, current_op_index, current_turn_index, current_op_index, is_touching,
true); true);
if (error != traverse_error_none) if (error != traverse_error_none)
@ -152,7 +155,7 @@ struct traversal_switch_detector
// SWITCH // SWITCH
{ {
turn_type const& turn = m_turns[current_turn_index]; turn_type const& turn = m_turns[current_turn_index];
if (turn.both(operation_union)) if (is_touching || turn.both(operation_union))
{ {
#if defined(BOOST_GEOMETRY_DEBUG_TRAVERSAL_SWITCH_DETECTOR) #if defined(BOOST_GEOMETRY_DEBUG_TRAVERSAL_SWITCH_DETECTOR)
std::cout << "FOUND OTHER UU TURN RIGHT AFTER START " std::cout << "FOUND OTHER UU TURN RIGHT AFTER START "
@ -186,7 +189,7 @@ struct traversal_switch_detector
// Below three reasons to stop. // Below three reasons to stop.
error = travel_to_next_turn(start_turn_index, start_op_index, error = travel_to_next_turn(start_turn_index, start_op_index,
current_turn_index, current_op_index, current_turn_index, current_op_index, is_touching,
false); false);
if (error != traverse_error_none) if (error != traverse_error_none)
@ -197,7 +200,7 @@ struct traversal_switch_detector
// SWITCH // SWITCH
{ {
turn_type const& turn = m_turns[current_turn_index]; turn_type const& turn = m_turns[current_turn_index];
if (turn.both(operation_union)) if (is_touching || turn.both(operation_union))
{ {
if (current_turn_index == start_turn_index) if (current_turn_index == start_turn_index)
{ {

View File

@ -511,7 +511,7 @@ void test_specific()
ticket_11676[0], ticket_11676[1], ticket_11676[0], ticket_11676[1],
1, 18, 2537992.5, 1, 18, 2537992.5,
2, 11, 294963.5, 2, 11, 294963.5,
1, -1, 2537992.5 + 294963.5, 2, -1, 2537992.5 + 294963.5,
settings); settings);
} }
} }

View File

@ -188,7 +188,7 @@ void test_areal()
case_recursive_boxes_3[0], case_recursive_boxes_3[1], case_recursive_boxes_3[0], case_recursive_boxes_3[1],
24, -1, 21.5, 24, -1, 21.5,
25, -1, 22.5, 25, -1, 22.5,
36, -1, 44.0); 37, -1, 44.0);
// 4, input is not valid // 4, input is not valid
@ -202,7 +202,7 @@ void test_areal()
case_recursive_boxes_6[0], case_recursive_boxes_6[1], case_recursive_boxes_6[0], case_recursive_boxes_6[1],
6, -1, 3.5, 6, -1, 3.5,
3, -1, 1.5, 3, -1, 1.5,
7, -1, 5.0); 8, -1, 5.0);
test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_7", test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_7",
case_recursive_boxes_7[0], case_recursive_boxes_7[1], case_recursive_boxes_7[0], case_recursive_boxes_7[1],
@ -220,7 +220,7 @@ void test_areal()
case_recursive_boxes_9[0], case_recursive_boxes_9[1], case_recursive_boxes_9[0], case_recursive_boxes_9[1],
3, -1, 1.5, 3, -1, 1.5,
4, -1, 2.5, 4, -1, 2.5,
5, -1, 4.0); 6, -1, 4.0);
test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_10", test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_10",
case_recursive_boxes_10[0], case_recursive_boxes_10[1], case_recursive_boxes_10[0], case_recursive_boxes_10[1],

View File

@ -147,8 +147,7 @@ void test_areal()
2, 0, 16, 48); 2, 0, 16, 48);
test_one<Polygon, MultiPolygon, MultiPolygon>("case_113_multi", test_one<Polygon, MultiPolygon, MultiPolygon>("case_113_multi",
case_113_multi[0], case_113_multi[1], case_113_multi[0], case_113_multi[1],
1, 0, 13, 162.5, 2, 0, 13, 162.5);
ignore_validity);
test_one<Polygon, MultiPolygon, MultiPolygon>("case_114_multi", test_one<Polygon, MultiPolygon, MultiPolygon>("case_114_multi",
case_114_multi[0], case_114_multi[1], case_114_multi[0], case_114_multi[1],
1, 1, 13, 187.5); 1, 1, 13, 187.5);
@ -185,7 +184,7 @@ void test_areal()
1, 0, 14, 100.0); // Area from SQL Server 1, 0, 14, 100.0); // Area from SQL Server
test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_3", test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_3",
case_recursive_boxes_3[0], case_recursive_boxes_3[1], case_recursive_boxes_3[0], case_recursive_boxes_3[1],
16, 0, 159, 56.5, 17, 0, 159, 56.5,
ignore_validity); // Area from SQL Server ignore_validity); // Area from SQL Server
test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_4", test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_4",
@ -223,19 +222,16 @@ void test_areal()
1, 0, -1, 8.0); 1, 0, -1, 8.0);
test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_12", test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_12",
case_recursive_boxes_12[0], case_recursive_boxes_12[1], case_recursive_boxes_12[0], case_recursive_boxes_12[1],
5, 0, -1, 6.0, 6, 0, -1, 6.0);
ignore_validity);
test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_13", test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_13",
case_recursive_boxes_13[0], case_recursive_boxes_13[1], case_recursive_boxes_13[0], case_recursive_boxes_13[1],
3, 0, -1, 10.25); 3, 0, -1, 10.25);
test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_14", test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_14",
case_recursive_boxes_14[0], case_recursive_boxes_14[1], case_recursive_boxes_14[0], case_recursive_boxes_14[1],
4, 0, -1, 4.5, 5, 0, -1, 4.5);
ignore_validity);
test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_15", test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_15",
case_recursive_boxes_15[0], case_recursive_boxes_15[1], case_recursive_boxes_15[0], case_recursive_boxes_15[1],
2, 0, -1, 6.0, 3, 0, -1, 6.0);
ignore_validity);
test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_16", test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_16",
case_recursive_boxes_16[0], case_recursive_boxes_16[1], case_recursive_boxes_16[0], case_recursive_boxes_16[1],
1, 1, -1, 22.0, 1, 1, -1, 22.0,