void raw_print_tiles_impl(std::ostream& out, Point_iter points_begin, Point_iter points_end, double z_scale, bool color) { static log4cplus::Logger logger = log4cplus::Logger::getInstance("raw_print_tiles_impl"); // out << std::setprecision(12); typedef typename iterator_traits<Point_iter>::value_type Point_type; typedef boost::unordered_map<Point_type, size_t> Vertex_map; Vertex_map vertices; size_t next_idx = 0; size_t num_points = 0; stringstream ss; // ss << std::setprecision(24); for (Point_iter it = points_begin; it != points_end; ++it) { const Point_type& t = *it; if (vertices.find(t) == vertices.end()) { // // debug // if (abs(it->x() - 5.2767) < 0.0001) { // LOG4CPLUS_WARN(logger, "looking for this? " << it->x() << // " " << it->y() << " " << (it->z()+0.5) * z_scale << // " " << it->point().id()); // } // // /debug Color c = get_color(t); vertices[t] = next_idx++; ss << t.x() << " " << t.y() << " " << (t.z()+0.5) * z_scale; if (color) ss << " " << c.r() << " " << c.g() << " " << c.b(); ss << endl; } ++num_points; } size_t num_verts = vertices.size(); num_points /= 3; out << num_verts << " " << num_points << endl; out << ss.str(); size_t n = 0; for (Point_iter it = points_begin; it != points_end; ++it) { out << vertices[*it] << " "; if ((++n) % 3 == 0) out << endl; } }
void Vertex_visibility_graph_2<Traits>::handle(Tree_iterator p, Tree_iterator q, const Polygon& polygon, Vertex_map& vertex_map) { #ifdef CGAL_VISIBILITY_GRAPH_DEBUG std::cout << "Handling edge from " << (*p).x() << " " << (*p).y() << " to " << (*q).x() << " " << (*q).y() << std::endl; #endif Vertex_map_iterator p_it = vertex_map.find(*p); Vertex_map_iterator q_it = vertex_map.find(*q); CGAL_assertion (p_it != vertex_map.end()); CGAL_assertion (q_it != vertex_map.end()); #ifdef CGAL_VISIBILITY_GRAPH_DEBUG std::cout << "p currently sees : "; if ((*p_it).second.second != polygon.end()) std::cout << *((*p_it).second.second) << endl; else std::cout << " NADA" << endl; #endif // if p and q are adjacent if (are_adjacent(polygon, (*p_it).second.first, (*q_it).second.first)) { #ifdef CGAL_VISIBILITY_GRAPH_DEBUG cout << "are adjacent" << endl; #endif insert_edge(Point_pair(*p,*q)); update_visibility(p_it, q_it, polygon, 1); } else { bool interior_at_p = diagonal_in_interior(polygon, (*p_it).second.first, (*q_it).second.first); bool interior_at_q = diagonal_in_interior(polygon, (*q_it).second.first, (*p_it).second.first); // line of site is through the interior of the polygon if (interior_at_p && interior_at_q) { #ifdef CGAL_VISIBILITY_GRAPH_DEBUG cout << "both interior" << endl; #endif // if p sees something and q is visible only through collinear // points then update p's visibility if one of the points adjacent // to q is above the line unless p's current visibility point // obscures the view. if ((*p_it).second.second != polygon.end() && are_strictly_ordered_along_line_2((*p_it).first, *(*p_it).second.second, (*q_it).first)) { update_collinear_visibility(p_it, q_it, polygon); } // p current sees nothing or q is visible to p else if ((*p_it).second.second == polygon.end() || point_is_visible(polygon, (*q_it).second.first, p_it)) { insert_edge(Point_pair(*p,*q)); update_visibility(p_it, q_it, polygon, 0); } } else if (!interior_at_p && !interior_at_q) // both points exterior { #ifdef CGAL_VISIBILITY_GRAPH_DEBUG cout << "both exterior" << endl; #endif // p currently sees nothing or q is visible to p if ((*p_it).second.second == polygon.end() || point_is_visible(polygon, (*q_it).second.first, p_it)) { (*p_it).second.second = (*q_it).second.first; } } } #ifdef CGAL_VISIBILITY_GRAPH_DEBUG std::cout << "p now sees : "; if ((*p_it).second.second != polygon.end()) std::cout << *((*p_it).second.second) << endl; else std::cout << " NADA" << endl; #endif }
void Vertex_visibility_graph_2<Traits>::initialize_vertex_map( const Polygon& polygon, Vertex_map& vertex_map) { typedef typename Vertex_map::value_type Map_pair; // Create an event list that is a list of circulators for the polygon Iterator_list<Polygon_const_iterator> iterator_list(polygon.begin(), polygon.end()); // Sort the event list (iterators to points) from left to right // (using less_xy) #ifdef CGAL_CFG_RWSTD_NO_MEMBER_TEMPLATES iterator_list.sort(&Self::compare); #else iterator_list.sort(Indirect_less_xy_2<Traits>()); #endif // Create an ordered list of edge endpoints (iterators), initially empty typedef std::set< Point_pair, Segment_less_yx_2 > Ordered_edge_set; typedef typename Ordered_edge_set::iterator Ordered_edge_set_iterator; Ordered_edge_set ordered_edges; Ordered_edge_set_iterator edge_it; Vertex_map_iterator vm_it; Vertex_map_iterator vis_it; Polygon_const_iterator event_it; Polygon_const_iterator next_endpt; Polygon_const_iterator prev_endpt; // initialize the map by associating iterators and points and indicating // that no points can see anything. for (Polygon_const_iterator it = polygon.begin();it != polygon.end();it++) { vertex_map.insert(Map_pair(*it, Iterator_pair(it, polygon.end()))); } // now go through the events in sorted order. while (!iterator_list.empty()) { event_it = iterator_list.front(); #ifdef CGAL_VISIBILITY_GRAPH_DEBUG std::cout << "event = " << *event_it << std::endl; #endif next_endpt = event_it; next_endpt++; if (next_endpt == polygon.end()) next_endpt = polygon.begin(); iterator_list.pop_front(); // the first edge that is not less than (below) this edge, so ... edge_it = ordered_edges.lower_bound(Point_pair(*event_it,*next_endpt)); // ...if there is no edge below this one then nothing is visible, // otherwise.... if (edge_it != ordered_edges.begin()) { edge_it--; // ...the first visible edge is the previous edge // find the event point in the vertex map vm_it = vertex_map.find(*event_it); // Find the entry for the edge's first endpoint in the vertex map. vis_it = vertex_map.find((*edge_it).first); #ifdef CGAL_VISIBILITY_GRAPH_DEBUG std::cout << "the potential visibility point is " << (*vis_it).first << endl; #endif // an edge that ends at this event point cannot be below this // endpoint if (!is_next_to(polygon, (*vis_it).second.first, event_it)) { #ifdef CGAL_VISIBILITY_GRAPH_DEBUG cout << "the edge beginning at " << *(*vis_it).second.first << " is visible" << endl; #endif // set the visibility iterator for this point to the iterator // corresponding to the edge endpoint that is to the left of // the vertical line if (less_xy_2((*vis_it).first, (*vm_it).first)) { Polygon_const_iterator next_vtx = (*vis_it).second.first; next_vtx++; if (next_vtx == polygon.end()) next_vtx = polygon.begin(); (*vm_it).second.second = next_vtx; } else (*vm_it).second.second = (*vis_it).second.first; } // skip over the edge that ends at this event point. If there // is another edge above this event's edge then it is visible. // since it can't also end at the event point. else if (edge_it != ordered_edges.begin() && --edge_it != ordered_edges.begin()) { vis_it = vertex_map.find((*edge_it).first); #ifdef CGAL_VISIBILITY_GRAPH_DEBUG std::cout << "the edge beginning at " << *(*vis_it).second.first << " is visible" << endl; #endif // set the visibility iterator for this point to the iterator // corresponding to the edge endpoint that is to the left of // the vertical line if (less_xy_2((*vis_it).first, (*vm_it).first)) { Polygon_const_iterator next_vtx = (*vis_it).second.first; next_vtx++; if (next_vtx == polygon.end()) next_vtx = polygon.begin(); (*vm_it).second.second = next_vtx; } else (*vm_it).second.second = (*vis_it).second.first; } #ifdef CGAL_VISIBILITY_GRAPH_DEBUG else std::cout << "nothing is visible " << endl; #endif } #ifdef CGAL_VISIBILITY_GRAPH_DEBUG else cout << "nothing is visible " << endl; #endif prev_endpt = event_it; if (prev_endpt == polygon.begin()) prev_endpt = polygon.end(); prev_endpt--; // if the other endpoint of the next edge is to the right of the // sweep line, then insert this edge if (less_xy_2(*event_it, *next_endpt)) { ordered_edges.insert(Point_pair(*event_it,*next_endpt)); #ifdef CGAL_VISIBILITY_GRAPH_DEBUG cout << "inserting edge from " << *event_it << " to " << *next_endpt << endl; #endif } else // other endpoint not to the right, so erase it { ordered_edges.erase(Point_pair(*event_it,*next_endpt)); #ifdef CGAL_VISIBILITY_GRAPH_DEBUG std::cout << "erasing edge from " << *event_it << " to " << *next_endpt << endl; #endif } // if the other endpoint of the previous edge is to the right of the // sweep line, insert it if (less_xy_2(*event_it, *prev_endpt)) { ordered_edges.insert(Point_pair(*prev_endpt,*event_it)); #ifdef CGAL_VISIBILITY_GRAPH_DEBUG cout << "inserting edge from " << *prev_endpt << " to " << *event_it << endl; #endif } else // other endpoint is not to the right, so erase it { ordered_edges.erase(Point_pair(*prev_endpt,*event_it)); #ifdef CGAL_VISIBILITY_GRAPH_DEBUG std::cout << "erasing edge from " << *prev_endpt << " to " << *event_it << endl; #endif } } }