mirror of https://github.com/CGAL/cgal
improve rotational sweep by using non geometric compare for edges in edx
This commit is contained in:
parent
28956c949b
commit
b716cab8b7
|
|
@ -25,6 +25,7 @@
|
||||||
#include <CGAL/Visibility_2/visibility_utils.h>
|
#include <CGAL/Visibility_2/visibility_utils.h>
|
||||||
#include <CGAL/Arrangement_2.h>
|
#include <CGAL/Arrangement_2.h>
|
||||||
#include <CGAL/bounding_box.h>
|
#include <CGAL/bounding_box.h>
|
||||||
|
#include <boost/unordered_map.hpp>
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
|
|
@ -73,10 +74,11 @@ private:
|
||||||
if (e1 == e2)
|
if (e1 == e2)
|
||||||
return false;
|
return false;
|
||||||
else {
|
else {
|
||||||
if (e1->source() == e2->source())
|
return &(*e1)<&(*e2);
|
||||||
return Visibility_2::compare_xy_2(geom_traits, e1->target()->point(), e2->target()->point()) == SMALLER;
|
// if (e1->source() == e2->source())
|
||||||
else
|
// return Visibility_2::compare_xy_2(geom_traits, e1->target()->point(), e2->target()->point()) == SMALLER;
|
||||||
return Visibility_2::compare_xy_2(geom_traits, e1->source()->point(), e2->source()->point()) == SMALLER;
|
// else
|
||||||
|
// return Visibility_2::compare_xy_2(geom_traits, e1->source()->point(), e2->source()->point()) == SMALLER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -90,16 +92,29 @@ private:
|
||||||
if (v1 == v2)
|
if (v1 == v2)
|
||||||
return false;
|
return false;
|
||||||
else
|
else
|
||||||
return Visibility_2::compare_xy_2(geom_traits, v1->point(), v2->point()) == SMALLER;
|
// I know this is dirty but it speeds up by 25%. Michael
|
||||||
|
return &(*v1)<&(*v2);
|
||||||
|
// return Visibility_2::compare_xy_2(geom_traits, v1->point(), v2->point()) == SMALLER;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Using hash_map or edx causes a seg fault, did not have the time to see why. Michael
|
||||||
|
// class Hash_edge: public std::unary_function<VH,typename boost::hash<const typename Arrangement_2::X_monotone_curve_2*>::result_type> {
|
||||||
|
// public:
|
||||||
|
// typename boost::hash<const typename Arrangement_2::X_monotone_curve_2*>::result_type
|
||||||
|
// operator() (const EH e1) const {
|
||||||
|
// return boost::hash<const typename Arrangement_2::X_monotone_curve_2*>()(&(e1->curve()));
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
|
||||||
|
|
||||||
const Geometry_traits_2 *geom_traits;
|
const Geometry_traits_2 *geom_traits;
|
||||||
const Arrangement_2 *p_arr;
|
const Arrangement_2 *p_arr;
|
||||||
Point_2 q; //query point
|
Point_2 q; //query point
|
||||||
Points polygon; //visibility polygon
|
Points polygon; //visibility polygon
|
||||||
std::map<VH, EHs, Less_vertex> incident_edges; //the edges that are
|
std::map<VH, EHs, Less_vertex> incident_edges; //the edges that are
|
||||||
std::map<EH, int, Less_edge> edx; //index of active edges in the heap
|
std::map<EH, int, Less_edge> edx; //index of active edges in the heap
|
||||||
|
// boost::unordered_map<EH,int,Hash_edge> edx; //index of active edges in the heap
|
||||||
EHs active_edges; //a heap of edges that intersect the current vision ray.
|
EHs active_edges; //a heap of edges that intersect the current vision ray.
|
||||||
VHs vs; //angular sorted vertices
|
VHs vs; //angular sorted vertices
|
||||||
EHs bad_edges; //edges that pass the query point
|
EHs bad_edges; //edges that pass the query point
|
||||||
|
|
@ -321,7 +336,8 @@ private:
|
||||||
polygon.clear();
|
polygon.clear();
|
||||||
active_edges.clear();
|
active_edges.clear();
|
||||||
incident_edges = std::map<VH, EHs, Less_vertex>(Less_vertex(geom_traits));
|
incident_edges = std::map<VH, EHs, Less_vertex>(Less_vertex(geom_traits));
|
||||||
edx = std::map<EH, int, Less_edge>(Less_edge(geom_traits));
|
|
||||||
|
edx = std::map<EH, int, Less_edge>(Less_edge(geom_traits));
|
||||||
|
|
||||||
EHs relevant_edges; //all edges that can affect the visibility of query point.
|
EHs relevant_edges; //all edges that can affect the visibility of query point.
|
||||||
Arrangement_2 bbox;
|
Arrangement_2 bbox;
|
||||||
|
|
|
||||||
|
|
@ -544,37 +544,6 @@ void create_arrangement_from_file(_Arrangement_2 &arr, std::ifstream& input) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void convert_poly_to_env_file() {
|
|
||||||
|
|
||||||
std::ofstream norway;
|
|
||||||
norway.open("norway.env");
|
|
||||||
std::ifstream input;
|
|
||||||
input.open("norway.poly");
|
|
||||||
|
|
||||||
if (input && norway) {
|
|
||||||
std::string line;
|
|
||||||
while (!input.eof()) {
|
|
||||||
std::getline(input, line);
|
|
||||||
std::vector<std::string> vertices;
|
|
||||||
line.erase(line.find_last_not_of(" \n\r\t")+1);
|
|
||||||
|
|
||||||
while (line != "POLYGON" && !input.eof()) {
|
|
||||||
vertices.push_back(line);
|
|
||||||
std::getline(input, line);
|
|
||||||
line.erase(line.find_last_not_of(" \n\r\t")+1);
|
|
||||||
}
|
|
||||||
if (vertices.size() != 0) {
|
|
||||||
norway << vertices.size() << std::endl;
|
|
||||||
for (int j = 0 ; j < vertices.size() ; j++) {
|
|
||||||
norway << vertices[j] << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
std::cout<<"Can't open the file. Check the file name.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Arrangement_2>
|
template <class _Arrangement_2>
|
||||||
void create_arrangement_from_env_file(_Arrangement_2 &arr, std::ifstream& input) {
|
void create_arrangement_from_env_file(_Arrangement_2 &arr, std::ifstream& input) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue