mirror of https://github.com/CGAL/cgal
turn int to std::size_t when it is possible
This commit is contained in:
parent
172c6d4592
commit
61c91a1971
|
|
@ -286,7 +286,7 @@ void Polyhedron_demo_mesh_segmentation_plugin::check_and_set_ids(Polyhedron* pol
|
||||||
Polyhedron::Facet_iterator a_facet = polyhedron->facets_begin();
|
Polyhedron::Facet_iterator a_facet = polyhedron->facets_begin();
|
||||||
Polyhedron::Facet_iterator another_facet = ++polyhedron->facets_begin();
|
Polyhedron::Facet_iterator another_facet = ++polyhedron->facets_begin();
|
||||||
if(a_facet->id() != another_facet->id()) { return; } // ids are OK
|
if(a_facet->id() != another_facet->id()) { return; } // ids are OK
|
||||||
int facet_id = 0;
|
std::size_t facet_id = 0;
|
||||||
for(Polyhedron::Facet_iterator facet_it = polyhedron->facets_begin();
|
for(Polyhedron::Facet_iterator facet_it = polyhedron->facets_begin();
|
||||||
facet_it != polyhedron->facets_end(); ++facet_it, ++facet_id)
|
facet_it != polyhedron->facets_end(); ++facet_it, ++facet_id)
|
||||||
{
|
{
|
||||||
|
|
@ -302,7 +302,7 @@ void Polyhedron_demo_mesh_segmentation_plugin::colorize_sdf(
|
||||||
{
|
{
|
||||||
Polyhedron* polyhedron = item->polyhedron();
|
Polyhedron* polyhedron = item->polyhedron();
|
||||||
color_vector.clear();
|
color_vector.clear();
|
||||||
int patch_id = 0;
|
std::size_t patch_id = 0;
|
||||||
for(Polyhedron::Facet_iterator facet_it = polyhedron->facets_begin();
|
for(Polyhedron::Facet_iterator facet_it = polyhedron->facets_begin();
|
||||||
facet_it != polyhedron->facets_end(); ++facet_it, ++patch_id)
|
facet_it != polyhedron->facets_end(); ++facet_it, ++patch_id)
|
||||||
{
|
{
|
||||||
|
|
@ -326,15 +326,15 @@ void Polyhedron_demo_mesh_segmentation_plugin::colorize_segmentation(
|
||||||
{
|
{
|
||||||
Polyhedron* polyhedron = item->polyhedron();
|
Polyhedron* polyhedron = item->polyhedron();
|
||||||
color_vector.clear();
|
color_vector.clear();
|
||||||
int max_segment = 0;
|
std::size_t max_segment = 0;
|
||||||
for(Polyhedron::Facet_iterator facet_it = polyhedron->facets_begin();
|
for(Polyhedron::Facet_iterator facet_it = polyhedron->facets_begin();
|
||||||
facet_it != polyhedron->facets_end(); ++facet_it)
|
facet_it != polyhedron->facets_end(); ++facet_it)
|
||||||
{
|
{
|
||||||
int segment_id = segment_ids[facet_it];
|
std::size_t segment_id = segment_ids[facet_it];
|
||||||
facet_it->set_patch_id(segment_id);
|
facet_it->set_patch_id(segment_id);
|
||||||
max_segment = (std::max)(max_segment, segment_id);
|
max_segment = (std::max)(max_segment, segment_id);
|
||||||
}
|
}
|
||||||
for(int i = 0; i <= max_segment; ++i)
|
for(std::size_t i = 0; i <= max_segment; ++i)
|
||||||
{
|
{
|
||||||
QColor aColor = color_map_segmentation[(max_segment - i) % color_map_segmentation.size()];
|
QColor aColor = color_map_segmentation[(max_segment - i) % color_map_segmentation.size()];
|
||||||
color_vector.push_back(aColor);
|
color_vector.push_back(aColor);
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ int main()
|
||||||
|
|
||||||
// It is possible to compute the raw SDF values and post-process them using
|
// It is possible to compute the raw SDF values and post-process them using
|
||||||
// the following lines:
|
// the following lines:
|
||||||
// const int number_of_rays = 25; // cast 25 rays per facet
|
// const std::size_t number_of_rays = 25; // cast 25 rays per facet
|
||||||
// const double cone_angle = 2.0 / 3.0 * CGAL_PI; // set cone opening-angle
|
// const double cone_angle = 2.0 / 3.0 * CGAL_PI; // set cone opening-angle
|
||||||
// CGAL::sdf_values(mesh, sdf_property_map, cone_angle, number_of_rays, false);
|
// CGAL::sdf_values(mesh, sdf_property_map, cone_angle, number_of_rays, false);
|
||||||
// std::pair<double, double> min_max_sdf =
|
// std::pair<double, double> min_max_sdf =
|
||||||
|
|
|
||||||
|
|
@ -30,13 +30,13 @@ int main()
|
||||||
CGAL::sdf_values(mesh, sdf_property_map);
|
CGAL::sdf_values(mesh, sdf_property_map);
|
||||||
|
|
||||||
// create a property-map for segment-ids
|
// create a property-map for segment-ids
|
||||||
typedef std::map<Polyhedron::Facet_const_handle, int> Facet_int_map;
|
typedef std::map<Polyhedron::Facet_const_handle, std::size_t> Facet_int_map;
|
||||||
Facet_int_map internal_segment_map;
|
Facet_int_map internal_segment_map;
|
||||||
boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);
|
boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);
|
||||||
|
|
||||||
// segment the mesh using default parameters for number of levels, and smoothing lambda
|
// segment the mesh using default parameters for number of levels, and smoothing lambda
|
||||||
// Any other scalar values can be used instead of using SDF values computed using the CGAL function
|
// Any other scalar values can be used instead of using SDF values computed using the CGAL function
|
||||||
int number_of_segments = CGAL::segmentation_from_sdf_values(mesh, sdf_property_map, segment_property_map);
|
std::size_t number_of_segments = CGAL::segmentation_from_sdf_values(mesh, sdf_property_map, segment_property_map);
|
||||||
|
|
||||||
std::cout << "Number of segments: " << number_of_segments << std::endl;
|
std::cout << "Number of segments: " << number_of_segments << std::endl;
|
||||||
// print segment-ids
|
// print segment-ids
|
||||||
|
|
@ -47,7 +47,7 @@ int main()
|
||||||
}
|
}
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
||||||
const int number_of_clusters = 4; // use 4 clusters in soft clustering
|
const std::size_t number_of_clusters = 4; // use 4 clusters in soft clustering
|
||||||
const double smoothing_lambda = 0.3; // importance of surface features, suggested to be in-between [0,1]
|
const double smoothing_lambda = 0.3; // importance of surface features, suggested to be in-between [0,1]
|
||||||
|
|
||||||
// Note that we can use the same SDF values (sdf_property_map) over and over again for segmentation.
|
// Note that we can use the same SDF values (sdf_property_map) over and over again for segmentation.
|
||||||
|
|
|
||||||
|
|
@ -22,12 +22,12 @@ int main()
|
||||||
}
|
}
|
||||||
|
|
||||||
// create a property-map for segment-ids
|
// create a property-map for segment-ids
|
||||||
typedef std::map<Polyhedron::Facet_const_handle, int> Facet_int_map;
|
typedef std::map<Polyhedron::Facet_const_handle, std::size_t> Facet_int_map;
|
||||||
Facet_int_map internal_segment_map;
|
Facet_int_map internal_segment_map;
|
||||||
boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);
|
boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);
|
||||||
|
|
||||||
// calculate SDF values and segment the mesh using default parameters.
|
// calculate SDF values and segment the mesh using default parameters.
|
||||||
int number_of_segments = CGAL::segmentation_via_sdf_values(mesh, segment_property_map);
|
std::size_t number_of_segments = CGAL::segmentation_via_sdf_values(mesh, segment_property_map);
|
||||||
|
|
||||||
std::cout << "Number of segments: " << number_of_segments << std::endl;
|
std::cout << "Number of segments: " << number_of_segments << std::endl;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ int main()
|
||||||
}
|
}
|
||||||
|
|
||||||
// assign id field for each facet
|
// assign id field for each facet
|
||||||
int facet_id = 0;
|
std::size_t facet_id = 0;
|
||||||
for(Polyhedron::Facet_iterator facet_it = mesh.facets_begin();
|
for(Polyhedron::Facet_iterator facet_it = mesh.facets_begin();
|
||||||
facet_it != mesh.facets_end(); ++facet_it, ++facet_id) {
|
facet_it != mesh.facets_end(); ++facet_it, ++facet_id) {
|
||||||
facet_it->id() = facet_id;
|
facet_it->id() = facet_id;
|
||||||
|
|
@ -65,8 +65,8 @@ int main()
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
||||||
// create a property-map for segment-ids
|
// create a property-map for segment-ids
|
||||||
std::vector<int> segment_ids(mesh.size_of_facets());
|
std::vector<std::size_t> segment_ids(mesh.size_of_facets());
|
||||||
Facet_with_id_pmap<int> segment_property_map(segment_ids);
|
Facet_with_id_pmap<std::size_t> segment_property_map(segment_ids);
|
||||||
|
|
||||||
CGAL::segmentation_from_sdf_values(mesh, sdf_property_map, segment_property_map);
|
CGAL::segmentation_from_sdf_values(mesh, sdf_property_map, segment_property_map);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -165,10 +165,11 @@ public:
|
||||||
* and as output it returns final labeling of vertices (i.e. assigned cluster-id to each facet)
|
* and as output it returns final labeling of vertices (i.e. assigned cluster-id to each facet)
|
||||||
* @return result of energy function
|
* @return result of energy function
|
||||||
*/
|
*/
|
||||||
double operator()(const std::vector<std::pair<int, int> >& edges,
|
double operator()(const std::vector<std::pair<std::size_t, std::size_t> >&
|
||||||
|
edges,
|
||||||
const std::vector<double>& edge_weights,
|
const std::vector<double>& edge_weights,
|
||||||
const std::vector<std::vector<double> >& probability_matrix,
|
const std::vector<std::vector<double> >& probability_matrix,
|
||||||
std::vector<int>& labels) const {
|
std::vector<std::size_t>& labels) const {
|
||||||
const double tolerance = 1e-10;
|
const double tolerance = 1e-10;
|
||||||
|
|
||||||
double min_cut = (std::numeric_limits<double>::max)();
|
double min_cut = (std::numeric_limits<double>::max)();
|
||||||
|
|
@ -185,7 +186,7 @@ public:
|
||||||
bool success;
|
bool success;
|
||||||
do {
|
do {
|
||||||
success = false;
|
success = false;
|
||||||
int alpha = 0;
|
std::size_t alpha = 0;
|
||||||
|
|
||||||
for(std::vector<std::vector<double> >::const_iterator it =
|
for(std::vector<std::vector<double> >::const_iterator it =
|
||||||
probability_matrix.begin();
|
probability_matrix.begin();
|
||||||
|
|
@ -217,12 +218,12 @@ public:
|
||||||
// For E-Smooth
|
// For E-Smooth
|
||||||
// add edge between every vertex,
|
// add edge between every vertex,
|
||||||
std::vector<double>::const_iterator weight_it = edge_weights.begin();
|
std::vector<double>::const_iterator weight_it = edge_weights.begin();
|
||||||
for(std::vector<std::pair<int, int> >::const_iterator edge_it = edges.begin();
|
for(std::vector<std::pair<std::size_t, std::size_t> >::const_iterator edge_it =
|
||||||
edge_it != edges.end();
|
edges.begin(); edge_it != edges.end();
|
||||||
++edge_it, ++weight_it) {
|
++edge_it, ++weight_it) {
|
||||||
Vertex_descriptor v1 = inserted_vertices[edge_it->first],
|
Vertex_descriptor v1 = inserted_vertices[edge_it->first],
|
||||||
v2 = inserted_vertices[edge_it->second];
|
v2 = inserted_vertices[edge_it->second];
|
||||||
int label_1 = labels[edge_it->first], label_2 = labels[edge_it->second];
|
std::size_t label_1 = labels[edge_it->first], label_2 = labels[edge_it->second];
|
||||||
if(label_1 == label_2) {
|
if(label_1 == label_2) {
|
||||||
if(label_1 != alpha) {
|
if(label_1 != alpha) {
|
||||||
add_edge_and_reverse(v1, v2, *weight_it, *weight_it, graph);
|
add_edge_and_reverse(v1, v2, *weight_it, *weight_it, graph);
|
||||||
|
|
@ -315,8 +316,8 @@ private:
|
||||||
typedef Traits::edge_iterator Edge_iterator;
|
typedef Traits::edge_iterator Edge_iterator;
|
||||||
|
|
||||||
void
|
void
|
||||||
add_edge_and_reverse(int v1 , int v2, double w1, double w2,
|
add_edge_and_reverse(std::size_t v1 , std::size_t v2, double w1, double w2,
|
||||||
std::vector<std::pair<int, int> >& edge_map,
|
std::vector<std::pair<std::size_t, std::size_t> >& edge_map,
|
||||||
std::vector<EdgeP>& edge_weights) const {
|
std::vector<EdgeP>& edge_weights) const {
|
||||||
edge_map.push_back(std::make_pair(v1, v2));
|
edge_map.push_back(std::make_pair(v1, v2));
|
||||||
EdgeP p1;
|
EdgeP p1;
|
||||||
|
|
@ -339,10 +340,11 @@ public:
|
||||||
* and as output it returns final labeling of vertices (i.e. assigned cluster-id to each facet)
|
* and as output it returns final labeling of vertices (i.e. assigned cluster-id to each facet)
|
||||||
* @return result of energy function
|
* @return result of energy function
|
||||||
*/
|
*/
|
||||||
double operator()(const std::vector<std::pair<int, int> >& edges,
|
double operator()(const std::vector<std::pair<std::size_t, std::size_t> >&
|
||||||
|
edges,
|
||||||
const std::vector<double>& edge_weights,
|
const std::vector<double>& edge_weights,
|
||||||
const std::vector<std::vector<double> >& probability_matrix,
|
const std::vector<std::vector<double> >& probability_matrix,
|
||||||
std::vector<int>& labels) const {
|
std::vector<std::size_t>& labels) const {
|
||||||
const double tolerance = 1e-10;
|
const double tolerance = 1e-10;
|
||||||
|
|
||||||
double min_cut = (std::numeric_limits<double>::max)();
|
double min_cut = (std::numeric_limits<double>::max)();
|
||||||
|
|
@ -358,19 +360,19 @@ public:
|
||||||
bool success;
|
bool success;
|
||||||
do {
|
do {
|
||||||
success = false;
|
success = false;
|
||||||
int alpha = 0;
|
std::size_t alpha = 0;
|
||||||
|
|
||||||
for(std::vector<std::vector<double> >::const_iterator it =
|
for(std::vector<std::vector<double> >::const_iterator it =
|
||||||
probability_matrix.begin();
|
probability_matrix.begin();
|
||||||
it != probability_matrix.end(); ++it, ++alpha) {
|
it != probability_matrix.end(); ++it, ++alpha) {
|
||||||
std::vector<std::pair<int, int> > edge_map;
|
std::vector<std::pair<std::size_t, std::size_t> > edge_map;
|
||||||
std::vector<EdgeP> edge_map_weights;
|
std::vector<EdgeP> edge_map_weights;
|
||||||
edge_map.reserve(labels.size() *
|
edge_map.reserve(labels.size() *
|
||||||
8); // there is no way to know exact edge count, it is a heuristic value
|
8); // there is no way to know exact edge count, it is a heuristic value
|
||||||
edge_map_weights.reserve(labels.size() * 8);
|
edge_map_weights.reserve(labels.size() * 8);
|
||||||
|
|
||||||
int cluster_source = 0;
|
std::size_t cluster_source = 0;
|
||||||
int cluster_sink = 1;
|
std::size_t cluster_sink = 1;
|
||||||
|
|
||||||
Timer timer;
|
Timer timer;
|
||||||
timer.start();
|
timer.start();
|
||||||
|
|
@ -384,29 +386,29 @@ public:
|
||||||
(std::numeric_limits<double>::max)()
|
(std::numeric_limits<double>::max)()
|
||||||
: probability_matrix[labels[vertex_i]][vertex_i];
|
: probability_matrix[labels[vertex_i]][vertex_i];
|
||||||
|
|
||||||
add_edge_and_reverse(cluster_source, static_cast<int>(vertex_i) + 2,
|
add_edge_and_reverse(cluster_source, vertex_i + 2, source_weight, 0.0, edge_map,
|
||||||
source_weight, 0.0, edge_map, edge_map_weights);
|
edge_map_weights);
|
||||||
add_edge_and_reverse(static_cast<int>(vertex_i) + 2, cluster_sink, sink_weight,
|
add_edge_and_reverse(vertex_i + 2, cluster_sink, sink_weight, 0.0, edge_map,
|
||||||
0.0, edge_map, edge_map_weights);
|
edge_map_weights);
|
||||||
}
|
}
|
||||||
vertex_creation_time += timer.time();
|
vertex_creation_time += timer.time();
|
||||||
timer.reset();
|
timer.reset();
|
||||||
// For E-Smooth
|
// For E-Smooth
|
||||||
// add edge between every vertex,
|
// add edge between every vertex,
|
||||||
int num_vert = static_cast<int>(labels.size()) + 2;
|
std::size_t num_vert = labels.size() + 2;
|
||||||
std::vector<double>::const_iterator weight_it = edge_weights.begin();
|
std::vector<double>::const_iterator weight_it = edge_weights.begin();
|
||||||
for(std::vector<std::pair<int, int> >::const_iterator edge_it = edges.begin();
|
for(std::vector<std::pair<std::size_t, std::size_t> >::const_iterator edge_it =
|
||||||
edge_it != edges.end();
|
edges.begin(); edge_it != edges.end();
|
||||||
++edge_it, ++weight_it) {
|
++edge_it, ++weight_it) {
|
||||||
int v1 = edge_it->first + 2, v2 = edge_it->second + 2;
|
std::size_t v1 = edge_it->first + 2, v2 = edge_it->second + 2;
|
||||||
int label_1 = labels[edge_it->first], label_2 = labels[edge_it->second];
|
std::size_t label_1 = labels[edge_it->first], label_2 = labels[edge_it->second];
|
||||||
if(label_1 == label_2) {
|
if(label_1 == label_2) {
|
||||||
if(label_1 != alpha) {
|
if(label_1 != alpha) {
|
||||||
add_edge_and_reverse(v1, v2, *weight_it, *weight_it, edge_map,
|
add_edge_and_reverse(v1, v2, *weight_it, *weight_it, edge_map,
|
||||||
edge_map_weights);
|
edge_map_weights);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int inbetween = num_vert++;
|
std::size_t inbetween = num_vert++;
|
||||||
|
|
||||||
double w1 = (label_1 == alpha) ? 0 : *weight_it;
|
double w1 = (label_1 == alpha) ? 0 : *weight_it;
|
||||||
double w2 = (label_2 == alpha) ? 0 : *weight_it;
|
double w2 = (label_2 == alpha) ? 0 : *weight_it;
|
||||||
|
|
@ -524,10 +526,11 @@ public:
|
||||||
* and as output it returns final labeling of vertices
|
* and as output it returns final labeling of vertices
|
||||||
* @return result of energy function
|
* @return result of energy function
|
||||||
*/
|
*/
|
||||||
double operator()(const std::vector<std::pair<int, int> >& edges,
|
double operator()(const std::vector<std::pair<std::size_t, std::size_t> >&
|
||||||
|
edges,
|
||||||
const std::vector<double>& edge_weights,
|
const std::vector<double>& edge_weights,
|
||||||
const std::vector<std::vector<double> >& probability_matrix,
|
const std::vector<std::vector<double> >& probability_matrix,
|
||||||
std::vector<int>& labels) const {
|
std::vector<std::size_t>& labels) const {
|
||||||
const double tolerance = 1e-10;
|
const double tolerance = 1e-10;
|
||||||
|
|
||||||
double min_cut = (std::numeric_limits<double>::max)();
|
double min_cut = (std::numeric_limits<double>::max)();
|
||||||
|
|
@ -541,7 +544,7 @@ public:
|
||||||
bool success;
|
bool success;
|
||||||
do {
|
do {
|
||||||
success = false;
|
success = false;
|
||||||
int alpha = 0;
|
std::size_t alpha = 0;
|
||||||
for(std::vector<std::vector<double> >::const_iterator it =
|
for(std::vector<std::vector<double> >::const_iterator it =
|
||||||
probability_matrix.begin();
|
probability_matrix.begin();
|
||||||
it != probability_matrix.end(); ++it, ++alpha) {
|
it != probability_matrix.end(); ++it, ++alpha) {
|
||||||
|
|
@ -567,12 +570,12 @@ public:
|
||||||
// For E-Smooth
|
// For E-Smooth
|
||||||
// add edge between every vertex,
|
// add edge between every vertex,
|
||||||
std::vector<double>::const_iterator weight_it = edge_weights.begin();
|
std::vector<double>::const_iterator weight_it = edge_weights.begin();
|
||||||
for(std::vector<std::pair<int, int> >::const_iterator edge_it = edges.begin();
|
for(std::vector<std::pair<std::size_t, std::size_t> >::const_iterator edge_it =
|
||||||
edge_it != edges.end();
|
edges.begin(); edge_it != edges.end();
|
||||||
++edge_it, ++weight_it) {
|
++edge_it, ++weight_it) {
|
||||||
MaxFlow::Graph::node_id v1 = inserted_vertices[edge_it->first];
|
MaxFlow::Graph::node_id v1 = inserted_vertices[edge_it->first];
|
||||||
MaxFlow::Graph::node_id v2 = inserted_vertices[edge_it->second];
|
MaxFlow::Graph::node_id v2 = inserted_vertices[edge_it->second];
|
||||||
int label_1 = labels[edge_it->first], label_2 = labels[edge_it->second];
|
std::size_t label_1 = labels[edge_it->first], label_2 = labels[edge_it->second];
|
||||||
if(label_1 == label_2) {
|
if(label_1 == label_2) {
|
||||||
if(label_1 != alpha) {
|
if(label_1 != alpha) {
|
||||||
graph.add_edge(v1, v2, *weight_it, *weight_it);
|
graph.add_edge(v1, v2, *weight_it, *weight_it);
|
||||||
|
|
|
||||||
|
|
@ -64,12 +64,12 @@ public:
|
||||||
* - weight (proportional to distance from disk center)
|
* - weight (proportional to distance from disk center)
|
||||||
*/
|
*/
|
||||||
template<class OutputIterator>
|
template<class OutputIterator>
|
||||||
void operator()(int number_of_points,
|
void operator()(std::size_t number_of_points,
|
||||||
OutputIterator out_it) const {
|
OutputIterator out_it) const {
|
||||||
const double golden_ratio = 3.0 - std::sqrt(5.0);
|
const double golden_ratio = 3.0 - std::sqrt(5.0);
|
||||||
|
|
||||||
if(uniform) {
|
if(uniform) {
|
||||||
for(int i = 0; i < number_of_points; ++i) {
|
for(std::size_t i = 0; i < number_of_points; ++i) {
|
||||||
double Q = i * golden_ratio * CGAL_PI;
|
double Q = i * golden_ratio * CGAL_PI;
|
||||||
double R = std::sqrt(static_cast<double>(i) / number_of_points);
|
double R = std::sqrt(static_cast<double>(i) / number_of_points);
|
||||||
double weight = exp(-0.5 * (std::pow(R / CGAL_ANGLE_ST_DEV_DIVIDER, 2)));
|
double weight = exp(-0.5 * (std::pow(R / CGAL_ANGLE_ST_DEV_DIVIDER, 2)));
|
||||||
|
|
@ -79,7 +79,7 @@ public:
|
||||||
const double custom_power =
|
const double custom_power =
|
||||||
1.0; // it determines how much sampling is biased to center
|
1.0; // it determines how much sampling is biased to center
|
||||||
// for uniform result one can use 0.5 (i.e. sqrt)
|
// for uniform result one can use 0.5 (i.e. sqrt)
|
||||||
for(int i = 0; i < number_of_points; ++i) {
|
for(std::size_t i = 0; i < number_of_points; ++i) {
|
||||||
double Q = i * golden_ratio * CGAL_PI;
|
double Q = i * golden_ratio * CGAL_PI;
|
||||||
double R = std::pow(static_cast<double>(i) / number_of_points, custom_power);
|
double R = std::pow(static_cast<double>(i) / number_of_points, custom_power);
|
||||||
// use uniform weigths, since we already give importance to locations that are close to center.
|
// use uniform weigths, since we already give importance to locations that are close to center.
|
||||||
|
|
@ -134,14 +134,14 @@ public:
|
||||||
* Note: returned samples size = \f$ \lfloor \sqrt {number\_of\_points} \rfloor ^ 2 \f$
|
* Note: returned samples size = \f$ \lfloor \sqrt {number\_of\_points} \rfloor ^ 2 \f$
|
||||||
*/
|
*/
|
||||||
template<class OutputIterator>
|
template<class OutputIterator>
|
||||||
void operator()(int number_of_points,
|
void operator()(std::size_t number_of_points,
|
||||||
OutputIterator out_it) const {
|
OutputIterator out_it) const {
|
||||||
const int number_of_points_sqrt = static_cast<int>(std::sqrt(
|
const std::size_t number_of_points_sqrt = static_cast<std::size_t>(std::sqrt(
|
||||||
static_cast<double>(number_of_points)));
|
static_cast<double>(number_of_points)));
|
||||||
// use cone_angle / 3 as one standard deviation while weighting.
|
// use cone_angle / 3 as one standard deviation while weighting.
|
||||||
|
|
||||||
for(int i = 1; i <= number_of_points_sqrt; ++i)
|
for(std::size_t i = 1; i <= number_of_points_sqrt; ++i)
|
||||||
for(int j = 1; j <= number_of_points_sqrt; ++j) {
|
for(std::size_t j = 1; j <= number_of_points_sqrt; ++j) {
|
||||||
double w1 = static_cast<double>(i) / number_of_points_sqrt;
|
double w1 = static_cast<double>(i) / number_of_points_sqrt;
|
||||||
double w2 = static_cast<double>(j) / number_of_points_sqrt;
|
double w2 = static_cast<double>(j) / number_of_points_sqrt;
|
||||||
double R = w1;
|
double R = w1;
|
||||||
|
|
@ -197,15 +197,15 @@ public:
|
||||||
* Note: returned samples size = \f$ \lfloor \sqrt {number\_of\_points} \rfloor ^ 2 \f$
|
* Note: returned samples size = \f$ \lfloor \sqrt {number\_of\_points} \rfloor ^ 2 \f$
|
||||||
*/
|
*/
|
||||||
template<class OutputIterator>
|
template<class OutputIterator>
|
||||||
void operator()(int number_of_points,
|
void operator()(std::size_t number_of_points,
|
||||||
OutputIterator out_it) const {
|
OutputIterator out_it) const {
|
||||||
const int number_of_points_sqrt = static_cast<int>(std::sqrt(
|
const std::size_t number_of_points_sqrt = static_cast<std::size_t>(std::sqrt(
|
||||||
static_cast<double>(number_of_points)));
|
static_cast<double>(number_of_points)));
|
||||||
const double fraction = (number_of_points_sqrt == 1) ? 0.0
|
const double fraction = (number_of_points_sqrt == 1) ? 0.0
|
||||||
: 2.0 / (number_of_points_sqrt -1);
|
: 2.0 / (number_of_points_sqrt -1);
|
||||||
|
|
||||||
for(int i = 0; i < number_of_points_sqrt; ++i)
|
for(std::size_t i = 0; i < number_of_points_sqrt; ++i)
|
||||||
for(int j = 0; j < number_of_points_sqrt; ++j) {
|
for(std::size_t j = 0; j < number_of_points_sqrt; ++j) {
|
||||||
double w1 = -1 + i * fraction;
|
double w1 = -1 + i * fraction;
|
||||||
double w2 = -1 + j * fraction;
|
double w2 = -1 + j * fraction;
|
||||||
double R, Q;
|
double R, Q;
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@ private:
|
||||||
std::vector<std::vector<double> > responsibility_matrix;
|
std::vector<std::vector<double> > responsibility_matrix;
|
||||||
|
|
||||||
double threshold;
|
double threshold;
|
||||||
int maximum_iteration;
|
std::size_t maximum_iteration;
|
||||||
|
|
||||||
Initialization_types init_type;
|
Initialization_types init_type;
|
||||||
|
|
||||||
|
|
@ -116,9 +116,9 @@ public:
|
||||||
Expectation_maximization(std::size_t number_of_centers,
|
Expectation_maximization(std::size_t number_of_centers,
|
||||||
const std::vector<double>& data,
|
const std::vector<double>& data,
|
||||||
Initialization_types init_type = PLUS_INITIALIZATION,
|
Initialization_types init_type = PLUS_INITIALIZATION,
|
||||||
int number_of_runs = CGAL_DEFAULT_NUMBER_OF_RUN,
|
std::size_t number_of_runs = CGAL_DEFAULT_NUMBER_OF_RUN,
|
||||||
double threshold = CGAL_DEFAULT_THRESHOLD,
|
double threshold = CGAL_DEFAULT_THRESHOLD,
|
||||||
int maximum_iteration = CGAL_DEFAULT_MAXIMUM_ITERATION )
|
std::size_t maximum_iteration = CGAL_DEFAULT_MAXIMUM_ITERATION )
|
||||||
:
|
:
|
||||||
final_likelihood(-(std::numeric_limits<double>::max)()), points(data),
|
final_likelihood(-(std::numeric_limits<double>::max)()), points(data),
|
||||||
responsibility_matrix(std::vector<std::vector<double> >(number_of_centers,
|
responsibility_matrix(std::vector<std::vector<double> >(number_of_centers,
|
||||||
|
|
@ -152,12 +152,12 @@ public:
|
||||||
* Fills data_center by the id of the center which has maximum responsibility.
|
* Fills data_center by the id of the center which has maximum responsibility.
|
||||||
* @param[out] data_centers
|
* @param[out] data_centers
|
||||||
*/
|
*/
|
||||||
void fill_with_center_ids(std::vector<int>& data_centers) {
|
void fill_with_center_ids(std::vector<std::size_t>& data_centers) {
|
||||||
data_centers.reserve(points.size());
|
data_centers.reserve(points.size());
|
||||||
for(std::vector<double>::iterator point_it = points.begin();
|
for(std::vector<double>::iterator point_it = points.begin();
|
||||||
point_it != points.end(); ++point_it) {
|
point_it != points.end(); ++point_it) {
|
||||||
double max_likelihood = 0.0;
|
double max_likelihood = 0.0;
|
||||||
int max_center = -1, center_counter = 0;
|
std::size_t max_center = -1, center_counter = 0;
|
||||||
for(std::vector<Gaussian_center>::iterator center_it = centers.begin();
|
for(std::vector<Gaussian_center>::iterator center_it = centers.begin();
|
||||||
center_it != centers.end(); ++center_it, ++center_counter) {
|
center_it != centers.end(); ++center_it, ++center_counter) {
|
||||||
double likelihood = center_it->probability_with_coef(*point_it);
|
double likelihood = center_it->probability_with_coef(*point_it);
|
||||||
|
|
@ -203,16 +203,16 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate deviation
|
// calculate deviation
|
||||||
std::vector<int> member_count(centers.size(), 0);
|
std::vector<std::size_t> member_count(centers.size(), 0);
|
||||||
for(std::vector<double>::iterator it = points.begin(); it!= points.end();
|
for(std::vector<double>::iterator it = points.begin(); it!= points.end();
|
||||||
++it) {
|
++it) {
|
||||||
int closest_center = 0;
|
std::size_t closest_center = 0;
|
||||||
double min_distance = std::abs(centers[0].mean - *it);
|
double min_distance = std::abs(centers[0].mean - *it);
|
||||||
for(std::size_t i = 1; i < centers.size(); ++i) {
|
for(std::size_t i = 1; i < centers.size(); ++i) {
|
||||||
double distance = std::abs(centers[i].mean - *it);
|
double distance = std::abs(centers[i].mean - *it);
|
||||||
if(distance < min_distance) {
|
if(distance < min_distance) {
|
||||||
min_distance = distance;
|
min_distance = distance;
|
||||||
closest_center = static_cast<int>(i);
|
closest_center = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
member_count[closest_center]++;
|
member_count[closest_center]++;
|
||||||
|
|
@ -338,7 +338,7 @@ private:
|
||||||
*/
|
*/
|
||||||
double calculate_clustering() {
|
double calculate_clustering() {
|
||||||
double likelihood = -(std::numeric_limits<double>::max)(), prev_likelihood;
|
double likelihood = -(std::numeric_limits<double>::max)(), prev_likelihood;
|
||||||
int iteration_count = 0;
|
std::size_t iteration_count = 0;
|
||||||
double is_converged = false;
|
double is_converged = false;
|
||||||
while(!is_converged && iteration_count++ < maximum_iteration) {
|
while(!is_converged && iteration_count++ < maximum_iteration) {
|
||||||
prev_likelihood = likelihood;
|
prev_likelihood = likelihood;
|
||||||
|
|
@ -360,7 +360,7 @@ private:
|
||||||
* @see calculate_clustering()
|
* @see calculate_clustering()
|
||||||
*/
|
*/
|
||||||
void calculate_clustering_with_multiple_run(std::size_t number_of_centers,
|
void calculate_clustering_with_multiple_run(std::size_t number_of_centers,
|
||||||
int number_of_run) {
|
std::size_t number_of_run) {
|
||||||
std::vector<Gaussian_center> max_centers;
|
std::vector<Gaussian_center> max_centers;
|
||||||
|
|
||||||
while(number_of_run-- > 0) {
|
while(number_of_run-- > 0) {
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ public:
|
||||||
*/
|
*/
|
||||||
template<class ValuePropertyMap>
|
template<class ValuePropertyMap>
|
||||||
void operator()(const Polyhedron& mesh,
|
void operator()(const Polyhedron& mesh,
|
||||||
int window_size,
|
std::size_t window_size,
|
||||||
ValuePropertyMap values,
|
ValuePropertyMap values,
|
||||||
boost::optional<double> spatial_parameter = boost::optional<double>(),
|
boost::optional<double> spatial_parameter = boost::optional<double>(),
|
||||||
boost::optional<double> range_parameter = boost::optional<double>()
|
boost::optional<double> range_parameter = boost::optional<double>()
|
||||||
|
|
@ -65,7 +65,7 @@ public:
|
||||||
|
|
||||||
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
||||||
facet_it != mesh.facets_end(); ++facet_it) {
|
facet_it != mesh.facets_end(); ++facet_it) {
|
||||||
std::map<Facet_const_handle, int> neighbors;
|
std::map<Facet_const_handle, std::size_t> neighbors;
|
||||||
NeighborSelector()(facet_it, window_size,
|
NeighborSelector()(facet_it, window_size,
|
||||||
neighbors); // gather neighbors in the window
|
neighbors); // gather neighbors in the window
|
||||||
double current_sdf_value = values[facet_it];
|
double current_sdf_value = values[facet_it];
|
||||||
|
|
@ -74,8 +74,8 @@ public:
|
||||||
if(!range_parameter) {
|
if(!range_parameter) {
|
||||||
// calculate deviation for range weighting.
|
// calculate deviation for range weighting.
|
||||||
double deviation = 0.0;
|
double deviation = 0.0;
|
||||||
for(typename std::map<Facet_const_handle, int>::iterator it = neighbors.begin();
|
for(typename std::map<Facet_const_handle, std::size_t>::iterator it =
|
||||||
it != neighbors.end(); ++it) {
|
neighbors.begin(); it != neighbors.end(); ++it) {
|
||||||
deviation += std::pow(values[it->first] - current_sdf_value, 2);
|
deviation += std::pow(values[it->first] - current_sdf_value, 2);
|
||||||
}
|
}
|
||||||
deviation = std::sqrt(deviation / neighbors.size());
|
deviation = std::sqrt(deviation / neighbors.size());
|
||||||
|
|
@ -92,8 +92,8 @@ public:
|
||||||
|
|
||||||
// smooth
|
// smooth
|
||||||
double total_sdf_value = 0.0, total_weight = 0.0;
|
double total_sdf_value = 0.0, total_weight = 0.0;
|
||||||
for(typename std::map<Facet_const_handle, int>::iterator it = neighbors.begin();
|
for(typename std::map<Facet_const_handle, std::size_t>::iterator it =
|
||||||
it != neighbors.end(); ++it) {
|
neighbors.begin(); it != neighbors.end(); ++it) {
|
||||||
double spatial_weight = gaussian_function(it->second, spatial_parameter_actual);
|
double spatial_weight = gaussian_function(it->second, spatial_parameter_actual);
|
||||||
double range_weight = gaussian_function(values[it->first] - current_sdf_value,
|
double range_weight = gaussian_function(values[it->first] - current_sdf_value,
|
||||||
range_parameter_actual);
|
range_parameter_actual);
|
||||||
|
|
@ -135,7 +135,7 @@ public:
|
||||||
*/
|
*/
|
||||||
template<class ValuePropertyMap>
|
template<class ValuePropertyMap>
|
||||||
void operator()(const Polyhedron& mesh,
|
void operator()(const Polyhedron& mesh,
|
||||||
int window_size,
|
std::size_t window_size,
|
||||||
ValuePropertyMap values) const {
|
ValuePropertyMap values) const {
|
||||||
typedef typename Polyhedron::Facet_const_handle Facet_const_handle;
|
typedef typename Polyhedron::Facet_const_handle Facet_const_handle;
|
||||||
typedef typename Polyhedron::Facet_const_iterator Facet_const_iterator;
|
typedef typename Polyhedron::Facet_const_iterator Facet_const_iterator;
|
||||||
|
|
@ -144,14 +144,14 @@ public:
|
||||||
smoothed_values.reserve(mesh.size_of_facets());
|
smoothed_values.reserve(mesh.size_of_facets());
|
||||||
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
||||||
facet_it != mesh.facets_end(); ++facet_it) {
|
facet_it != mesh.facets_end(); ++facet_it) {
|
||||||
std::map<Facet_const_handle, int> neighbors;
|
std::map<Facet_const_handle, std::size_t> neighbors;
|
||||||
NeighborSelector()(facet_it, window_size,
|
NeighborSelector()(facet_it, window_size,
|
||||||
neighbors); // gather neighbors in the window
|
neighbors); // gather neighbors in the window
|
||||||
|
|
||||||
std::vector<double> neighbor_values;
|
std::vector<double> neighbor_values;
|
||||||
neighbor_values.reserve(neighbors.size());
|
neighbor_values.reserve(neighbors.size());
|
||||||
for(typename std::map<Facet_const_handle, int>::iterator it = neighbors.begin();
|
for(typename std::map<Facet_const_handle, std::size_t>::iterator it =
|
||||||
it != neighbors.end(); ++it) {
|
neighbors.begin(); it != neighbors.end(); ++it) {
|
||||||
neighbor_values.push_back(values[it->first]);
|
neighbor_values.push_back(values[it->first]);
|
||||||
}
|
}
|
||||||
// Find median.
|
// Find median.
|
||||||
|
|
@ -183,22 +183,22 @@ struct No_filtering {
|
||||||
*/
|
*/
|
||||||
template<class Polyhedron,class ValuePropertyMap>
|
template<class Polyhedron,class ValuePropertyMap>
|
||||||
void operator()(const Polyhedron& /* mesh */,
|
void operator()(const Polyhedron& /* mesh */,
|
||||||
int /* window_size */,
|
std::size_t /* window_size */,
|
||||||
ValuePropertyMap /* values */) const {
|
ValuePropertyMap /* values */) const {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @brief A filter that applies the filter passed as template parameter several times. */
|
/** @brief A filter that applies the filter passed as template parameter several times. */
|
||||||
template <class Filter, int nb_iterations = 5>
|
template <class Filter, std::size_t nb_iterations = 5>
|
||||||
struct Iterative_filter : public Filter {
|
struct Iterative_filter : public Filter {
|
||||||
/**
|
/**
|
||||||
* empty implementation of required operator.
|
* empty implementation of required operator.
|
||||||
*/
|
*/
|
||||||
template<class Polyhedron,class ValuePropertyMap>
|
template<class Polyhedron,class ValuePropertyMap>
|
||||||
void operator()(const Polyhedron& mesh ,
|
void operator()(const Polyhedron& mesh ,
|
||||||
int window_size ,
|
std::size_t window_size ,
|
||||||
ValuePropertyMap values ) const {
|
ValuePropertyMap values ) const {
|
||||||
for (int i=0; i<nb_iterations; ++i)
|
for (std::size_t i=0; i<nb_iterations; ++i)
|
||||||
Filter::operator()(mesh, window_size, values);
|
Filter::operator()(mesh, window_size, values);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -219,9 +219,9 @@ public:
|
||||||
* @param[out] neighbors visited facets and their distances to root facet
|
* @param[out] neighbors visited facets and their distances to root facet
|
||||||
*/
|
*/
|
||||||
void operator()(Facet_const_handle facet,
|
void operator()(Facet_const_handle facet,
|
||||||
int max_level,
|
std::size_t max_level,
|
||||||
std::map<Facet_const_handle, int>& neighbors) const {
|
std::map<Facet_const_handle, std::size_t>& neighbors) const {
|
||||||
typedef std::pair<Facet_const_handle, int> Facet_level_pair;
|
typedef std::pair<Facet_const_handle, std::size_t> Facet_level_pair;
|
||||||
|
|
||||||
std::queue<Facet_level_pair> facet_queue;
|
std::queue<Facet_level_pair> facet_queue;
|
||||||
facet_queue.push(Facet_level_pair(facet, 0));
|
facet_queue.push(Facet_level_pair(facet, 0));
|
||||||
|
|
@ -272,9 +272,9 @@ public:
|
||||||
* @param[out] neighbors visited facets and their distances to root facet
|
* @param[out] neighbors visited facets and their distances to root facet
|
||||||
*/
|
*/
|
||||||
void operator()(Facet_const_handle facet,
|
void operator()(Facet_const_handle facet,
|
||||||
int max_level,
|
std::size_t max_level,
|
||||||
std::map<Facet_const_handle, int>& neighbors) const {
|
std::map<Facet_const_handle, std::size_t>& neighbors) const {
|
||||||
typedef std::pair<Facet_const_handle, int> Facet_level_pair;
|
typedef std::pair<Facet_const_handle, std::size_t> Facet_level_pair;
|
||||||
|
|
||||||
std::queue<Facet_level_pair> facet_queue;
|
std::queue<Facet_level_pair> facet_queue;
|
||||||
facet_queue.push(Facet_level_pair(facet, 0));
|
facet_queue.push(Facet_level_pair(facet, 0));
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,7 @@ public:
|
||||||
// say, "distance_square" -> [ 0.1, 0.2, 0.3, 0.0, 0.2 ... ]
|
// say, "distance_square" -> [ 0.1, 0.2, 0.3, 0.0, 0.2 ... ]
|
||||||
// then distance_square_cumulative -> [ 0.1, 0.3, 0.6, 0.6, 0.8 ... ]
|
// then distance_square_cumulative -> [ 0.1, 0.3, 0.6, 0.6, 0.8 ... ]
|
||||||
std::size_t initial_index = random.get_int(0,
|
std::size_t initial_index = random.get_int(0,
|
||||||
static_cast<int>(points.size())); // [0, points size)
|
points.size()); // [0, points size)
|
||||||
centers.push_back(points[initial_index]);
|
centers.push_back(points[initial_index]);
|
||||||
|
|
||||||
for(std::size_t i = 1; i < number_of_centers; ++i) {
|
for(std::size_t i = 1; i < number_of_centers; ++i) {
|
||||||
|
|
@ -149,8 +149,8 @@ class K_means_point
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
double data; /**< Location of the point */
|
double data; /**< Location of the point */
|
||||||
int center_id; /**< Closest center to the point */
|
std::size_t center_id; /**< Closest center to the point */
|
||||||
K_means_point(double data, int center_id = -1) : data(data),
|
K_means_point(double data, std::size_t center_id = -1) : data(data),
|
||||||
center_id(center_id) {
|
center_id(center_id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -171,7 +171,7 @@ public:
|
||||||
double mean; /**< Mean of the center */
|
double mean; /**< Mean of the center */
|
||||||
private:
|
private:
|
||||||
double new_mean;
|
double new_mean;
|
||||||
int new_number_of_points;
|
std::size_t new_number_of_points;
|
||||||
bool empty;
|
bool empty;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -231,12 +231,12 @@ public:
|
||||||
inline bool K_means_point::calculate_new_center(std::vector<K_means_center>&
|
inline bool K_means_point::calculate_new_center(std::vector<K_means_center>&
|
||||||
centers)
|
centers)
|
||||||
{
|
{
|
||||||
int new_center_id = 0;
|
std::size_t new_center_id = 0;
|
||||||
double min_distance = std::abs(centers[0].mean - data);
|
double min_distance = std::abs(centers[0].mean - data);
|
||||||
for(std::size_t i = 1; i < centers.size(); ++i) {
|
for(std::size_t i = 1; i < centers.size(); ++i) {
|
||||||
double new_distance = std::abs(centers[i].mean - data);
|
double new_distance = std::abs(centers[i].mean - data);
|
||||||
if(new_distance < min_distance) {
|
if(new_distance < min_distance) {
|
||||||
new_center_id = static_cast<int>(i);
|
new_center_id = i;
|
||||||
min_distance = new_distance;
|
min_distance = new_distance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -264,7 +264,7 @@ public:
|
||||||
private:
|
private:
|
||||||
std::vector<K_means_center> centers;
|
std::vector<K_means_center> centers;
|
||||||
std::vector<K_means_point> points;
|
std::vector<K_means_point> points;
|
||||||
int maximum_iteration;
|
std::size_t maximum_iteration;
|
||||||
|
|
||||||
Initialization_types init_type;
|
Initialization_types init_type;
|
||||||
|
|
||||||
|
|
@ -287,8 +287,8 @@ public:
|
||||||
K_means_clustering(std::size_t number_of_centers,
|
K_means_clustering(std::size_t number_of_centers,
|
||||||
const std::vector<double>& data,
|
const std::vector<double>& data,
|
||||||
Initialization_types init_type = PLUS_INITIALIZATION,
|
Initialization_types init_type = PLUS_INITIALIZATION,
|
||||||
int number_of_run = CGAL_DEFAULT_NUMBER_OF_RUN,
|
std::size_t number_of_run = CGAL_DEFAULT_NUMBER_OF_RUN,
|
||||||
int maximum_iteration = CGAL_DEFAULT_MAXIMUM_ITERATION)
|
std::size_t maximum_iteration = CGAL_DEFAULT_MAXIMUM_ITERATION)
|
||||||
:
|
:
|
||||||
points(data.begin(), data.end()),
|
points(data.begin(), data.end()),
|
||||||
maximum_iteration(maximum_iteration),
|
maximum_iteration(maximum_iteration),
|
||||||
|
|
@ -305,7 +305,7 @@ public:
|
||||||
* Fills data_center by the id of the closest center for each point.
|
* Fills data_center by the id of the closest center for each point.
|
||||||
* @param[out] data_centers
|
* @param[out] data_centers
|
||||||
*/
|
*/
|
||||||
void fill_with_center_ids(std::vector<int>& data_centers) {
|
void fill_with_center_ids(std::vector<std::size_t>& data_centers) {
|
||||||
data_centers.reserve(points.size());
|
data_centers.reserve(points.size());
|
||||||
for(std::vector<K_means_point>::iterator point_it = points.begin();
|
for(std::vector<K_means_point>::iterator point_it = points.begin();
|
||||||
point_it != points.end(); ++point_it) {
|
point_it != points.end(); ++point_it) {
|
||||||
|
|
@ -367,7 +367,7 @@ private:
|
||||||
* Iterates until convergence occurs (i.e. no point changes its center) or maximum iteration limit is reached.
|
* Iterates until convergence occurs (i.e. no point changes its center) or maximum iteration limit is reached.
|
||||||
*/
|
*/
|
||||||
void calculate_clustering() {
|
void calculate_clustering() {
|
||||||
int iteration_count = 0;
|
std::size_t iteration_count = 0;
|
||||||
bool any_center_changed = true;
|
bool any_center_changed = true;
|
||||||
while(any_center_changed && iteration_count++ < maximum_iteration) {
|
while(any_center_changed && iteration_count++ < maximum_iteration) {
|
||||||
any_center_changed = iterate();
|
any_center_changed = iterate();
|
||||||
|
|
@ -382,7 +382,7 @@ private:
|
||||||
* @see calculate_clustering(), within_cluster_sum_of_squares()
|
* @see calculate_clustering(), within_cluster_sum_of_squares()
|
||||||
*/
|
*/
|
||||||
void calculate_clustering_with_multiple_run(std::size_t number_of_centers,
|
void calculate_clustering_with_multiple_run(std::size_t number_of_centers,
|
||||||
int number_of_run) {
|
std::size_t number_of_run) {
|
||||||
std::vector<K_means_center> min_centers;
|
std::vector<K_means_center> min_centers;
|
||||||
double error = (std::numeric_limits<double>::max)();
|
double error = (std::numeric_limits<double>::max)();
|
||||||
while(number_of_run-- > 0) {
|
while(number_of_run-- > 0) {
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ public:
|
||||||
InputIterator facet_begin,
|
InputIterator facet_begin,
|
||||||
InputIterator facet_end,
|
InputIterator facet_end,
|
||||||
double cone_angle,
|
double cone_angle,
|
||||||
int number_of_rays,
|
std::size_t number_of_rays,
|
||||||
FacetValueMap sdf_values,
|
FacetValueMap sdf_values,
|
||||||
DiskSampling disk_sampler) const {
|
DiskSampling disk_sampler) const {
|
||||||
Disk_samples_list disk_samples;
|
Disk_samples_list disk_samples;
|
||||||
|
|
@ -208,7 +208,7 @@ public:
|
||||||
InputIterator facet_begin,
|
InputIterator facet_begin,
|
||||||
InputIterator facet_end,
|
InputIterator facet_end,
|
||||||
double cone_angle,
|
double cone_angle,
|
||||||
int number_of_rays,
|
std::size_t number_of_rays,
|
||||||
FacetValueMap sdf_values) const {
|
FacetValueMap sdf_values) const {
|
||||||
calculate_sdf_values(facet_begin, facet_end, cone_angle, number_of_rays,
|
calculate_sdf_values(facet_begin, facet_end, cone_angle, number_of_rays,
|
||||||
sdf_values, Default_sampler());
|
sdf_values, Default_sampler());
|
||||||
|
|
@ -228,7 +228,7 @@ public:
|
||||||
SkipPrimitiveFunctor skip,
|
SkipPrimitiveFunctor skip,
|
||||||
FirstIntersectionVisitor visitor,
|
FirstIntersectionVisitor visitor,
|
||||||
double cone_angle,
|
double cone_angle,
|
||||||
int number_of_rays,
|
std::size_t number_of_rays,
|
||||||
bool accept_if_acute) const {
|
bool accept_if_acute) const {
|
||||||
return calculate_sdf_value_of_point(center, normal, skip, visitor, cone_angle,
|
return calculate_sdf_value_of_point(center, normal, skip, visitor, cone_angle,
|
||||||
number_of_rays, accept_if_acute,
|
number_of_rays, accept_if_acute,
|
||||||
|
|
@ -245,7 +245,7 @@ public:
|
||||||
SkipPrimitiveFunctor skip,
|
SkipPrimitiveFunctor skip,
|
||||||
FirstIntersectionVisitor visitor,
|
FirstIntersectionVisitor visitor,
|
||||||
double cone_angle,
|
double cone_angle,
|
||||||
int number_of_rays,
|
std::size_t number_of_rays,
|
||||||
bool accept_if_acute,
|
bool accept_if_acute,
|
||||||
DiskSampling disk_sampler) const {
|
DiskSampling disk_sampler) const {
|
||||||
Disk_samples_list disk_samples;
|
Disk_samples_list disk_samples;
|
||||||
|
|
@ -466,7 +466,7 @@ private:
|
||||||
std::vector<std::pair<double, double> >& ray_distances) const {
|
std::vector<std::pair<double, double> >& ray_distances) const {
|
||||||
// pair first -> distance, second -> weight
|
// pair first -> distance, second -> weight
|
||||||
|
|
||||||
const int accepted_ray_count = static_cast<int>(ray_distances.size());
|
const std::size_t accepted_ray_count = ray_distances.size();
|
||||||
if(accepted_ray_count == 0) {
|
if(accepted_ray_count == 0) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
} else if(accepted_ray_count == 1) {
|
} else if(accepted_ray_count == 1) {
|
||||||
|
|
@ -474,7 +474,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate median sdf */
|
/* Calculate median sdf */
|
||||||
const int half_ray_count = accepted_ray_count / 2;
|
const std::size_t half_ray_count = accepted_ray_count / 2;
|
||||||
std::nth_element(ray_distances.begin(), ray_distances.begin() + half_ray_count,
|
std::nth_element(ray_distances.begin(), ray_distances.begin() + half_ray_count,
|
||||||
ray_distances.end());
|
ray_distances.end());
|
||||||
double median_sdf = ray_distances[half_ray_count].first;
|
double median_sdf = ray_distances[half_ray_count].first;
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ public:
|
||||||
typename Facet::Halfedge_around_facet_const_circulator facet_circulator =
|
typename Facet::Halfedge_around_facet_const_circulator facet_circulator =
|
||||||
facet_it->facet_begin();
|
facet_it->facet_begin();
|
||||||
double total_neighbor_sdf = 0.0;
|
double total_neighbor_sdf = 0.0;
|
||||||
int nb_valid_neighbors = 0;
|
std::size_t nb_valid_neighbors = 0;
|
||||||
do {
|
do {
|
||||||
if(!facet_circulator->opposite()->is_border()) {
|
if(!facet_circulator->opposite()->is_border()) {
|
||||||
double neighbor_sdf = sdf_values[facet_circulator->opposite()->facet()];
|
double neighbor_sdf = sdf_values[facet_circulator->opposite()->facet()];
|
||||||
|
|
@ -152,9 +152,9 @@ public:
|
||||||
* - 8000-18000 -> 3
|
* - 8000-18000 -> 3
|
||||||
* - ...
|
* - ...
|
||||||
*/
|
*/
|
||||||
int get_window_size(const Polyhedron& mesh) {
|
std::size_t get_window_size(const Polyhedron& mesh) {
|
||||||
double facet_sqrt = std::sqrt(mesh.size_of_facets() / 2000.0);
|
double facet_sqrt = std::sqrt(mesh.size_of_facets() / 2000.0);
|
||||||
return static_cast<int>(facet_sqrt) + 1;
|
return static_cast<std::size_t>(facet_sqrt) + 1;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -227,7 +227,7 @@ public:
|
||||||
// Use these two functions together
|
// Use these two functions together
|
||||||
template <class SDFPropertyMap>
|
template <class SDFPropertyMap>
|
||||||
std::pair<double, double>
|
std::pair<double, double>
|
||||||
calculate_sdf_values(double cone_angle, int number_of_rays,
|
calculate_sdf_values(double cone_angle, std::size_t number_of_rays,
|
||||||
SDFPropertyMap sdf_pmap, bool postprocess_req) {
|
SDFPropertyMap sdf_pmap, bool postprocess_req) {
|
||||||
// calculate sdf values
|
// calculate sdf values
|
||||||
SDF_calculation_class sdf_calculator(mesh, false, true, traits);
|
SDF_calculation_class sdf_calculator(mesh, false, true, traits);
|
||||||
|
|
@ -241,7 +241,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class FacetSegmentMap, class SDFPropertyMap>
|
template <class FacetSegmentMap, class SDFPropertyMap>
|
||||||
int partition(std::size_t number_of_centers, double smoothing_lambda,
|
std::size_t partition(std::size_t number_of_centers, double smoothing_lambda,
|
||||||
SDFPropertyMap sdf_pmap, FacetSegmentMap segment_pmap,
|
SDFPropertyMap sdf_pmap, FacetSegmentMap segment_pmap,
|
||||||
bool clusters_to_segments) {
|
bool clusters_to_segments) {
|
||||||
smoothing_lambda = (std::max)(0.0, smoothing_lambda); // min zero
|
smoothing_lambda = (std::max)(0.0, smoothing_lambda); // min zero
|
||||||
|
|
@ -256,7 +256,7 @@ public:
|
||||||
Expectation_maximization fitter(number_of_centers, sdf_values,
|
Expectation_maximization fitter(number_of_centers, sdf_values,
|
||||||
Expectation_maximization::K_MEANS_INITIALIZATION, 1);
|
Expectation_maximization::K_MEANS_INITIALIZATION, 1);
|
||||||
|
|
||||||
std::vector<int> labels;
|
std::vector<std::size_t> labels;
|
||||||
fitter.fill_with_center_ids(labels);
|
fitter.fill_with_center_ids(labels);
|
||||||
|
|
||||||
std::vector<std::vector<double> > probability_matrix;
|
std::vector<std::vector<double> > probability_matrix;
|
||||||
|
|
@ -264,14 +264,14 @@ public:
|
||||||
log_normalize_probability_matrix(probability_matrix);
|
log_normalize_probability_matrix(probability_matrix);
|
||||||
|
|
||||||
// calculating edge weights
|
// calculating edge weights
|
||||||
std::vector<std::pair<int, int> > edges;
|
std::vector<std::pair<std::size_t, std::size_t> > edges;
|
||||||
std::vector<double> edge_weights;
|
std::vector<double> edge_weights;
|
||||||
calculate_and_log_normalize_dihedral_angles(smoothing_lambda, edges,
|
calculate_and_log_normalize_dihedral_angles(smoothing_lambda, edges,
|
||||||
edge_weights);
|
edge_weights);
|
||||||
|
|
||||||
// apply graph cut
|
// apply graph cut
|
||||||
GraphCut()(edges, edge_weights, probability_matrix, labels);
|
GraphCut()(edges, edge_weights, probability_matrix, labels);
|
||||||
std::vector<int>::iterator label_it = labels.begin();
|
std::vector<std::size_t>::iterator label_it = labels.begin();
|
||||||
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
||||||
facet_it != mesh.facets_end();
|
facet_it != mesh.facets_end();
|
||||||
++facet_it, ++label_it) {
|
++facet_it, ++label_it) {
|
||||||
|
|
@ -279,7 +279,7 @@ public:
|
||||||
}
|
}
|
||||||
if(clusters_to_segments) {
|
if(clusters_to_segments) {
|
||||||
// assign a segment id for each facet
|
// assign a segment id for each facet
|
||||||
int number_of_segments = assign_segments(number_of_centers, sdf_pmap,
|
std::size_t number_of_segments = assign_segments(number_of_centers, sdf_pmap,
|
||||||
segment_pmap);
|
segment_pmap);
|
||||||
return number_of_segments;
|
return number_of_segments;
|
||||||
}
|
}
|
||||||
|
|
@ -361,14 +361,14 @@ private:
|
||||||
* @param[out] edge_weights calculated weight for each edge in @a edges
|
* @param[out] edge_weights calculated weight for each edge in @a edges
|
||||||
*/
|
*/
|
||||||
void calculate_and_log_normalize_dihedral_angles(double smoothing_lambda,
|
void calculate_and_log_normalize_dihedral_angles(double smoothing_lambda,
|
||||||
std::vector<std::pair<int, int> >& edges,
|
std::vector<std::pair<std::size_t, std::size_t> >& edges,
|
||||||
std::vector<double>& edge_weights) const {
|
std::vector<double>& edge_weights) const {
|
||||||
// associate each facet with an id
|
// associate each facet with an id
|
||||||
// important note: ids should be compatible with iteration order of facets:
|
// important note: ids should be compatible with iteration order of facets:
|
||||||
// [0 <- facet_begin(),...., size_of_facets() -1 <- facet_end()]
|
// [0 <- facet_begin(),...., size_of_facets() -1 <- facet_end()]
|
||||||
// Why ? it is send to graph cut algorithm where other data associated with facets are also sorted according to iteration order.
|
// Why ? it is send to graph cut algorithm where other data associated with facets are also sorted according to iteration order.
|
||||||
std::map<Facet_const_handle, int> facet_index_map;
|
std::map<Facet_const_handle, std::size_t> facet_index_map;
|
||||||
int facet_index = 0;
|
std::size_t facet_index = 0;
|
||||||
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
||||||
facet_it != mesh.facets_end();
|
facet_it != mesh.facets_end();
|
||||||
++facet_it, ++facet_index) {
|
++facet_it, ++facet_index) {
|
||||||
|
|
@ -376,14 +376,14 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
const double epsilon = 5e-6;
|
const double epsilon = 5e-6;
|
||||||
// edges and their weights. pair<int, int> stores facet-id pairs (see above) (may be using boost::tuple can be more suitable)
|
// edges and their weights. pair<std::size_t, std::size_t> stores facet-id pairs (see above) (may be using boost::tuple can be more suitable)
|
||||||
for(Edge_const_iterator edge_it = mesh.edges_begin();
|
for(Edge_const_iterator edge_it = mesh.edges_begin();
|
||||||
edge_it != mesh.edges_end(); ++edge_it) {
|
edge_it != mesh.edges_end(); ++edge_it) {
|
||||||
if(edge_it->is_border_edge()) {
|
if(edge_it->is_border_edge()) {
|
||||||
continue; // if edge does not contain two neighbor facets then do not include it in graph-cut
|
continue; // if edge does not contain two neighbor facets then do not include it in graph-cut
|
||||||
}
|
}
|
||||||
const int index_f1 = facet_index_map[edge_it->facet()];
|
const std::size_t index_f1 = facet_index_map[edge_it->facet()];
|
||||||
const int index_f2 = facet_index_map[edge_it->opposite()->facet()];
|
const std::size_t index_f2 = facet_index_map[edge_it->opposite()->facet()];
|
||||||
edges.push_back(std::make_pair(index_f1, index_f2));
|
edges.push_back(std::make_pair(index_f1, index_f2));
|
||||||
|
|
||||||
double angle = calculate_dihedral_angle_of_edge(edge_it);
|
double angle = calculate_dihedral_angle_of_edge(edge_it);
|
||||||
|
|
@ -418,15 +418,15 @@ private:
|
||||||
*
|
*
|
||||||
* @param number_of_clusters cluster-ids in @a segments should be between [0, number_of_clusters -1]
|
* @param number_of_clusters cluster-ids in @a segments should be between [0, number_of_clusters -1]
|
||||||
* @param sdf_values `ReadablePropertyMap` with `Polyhedron::Facet_const_handle` as key and `double` as value type
|
* @param sdf_values `ReadablePropertyMap` with `Polyhedron::Facet_const_handle` as key and `double` as value type
|
||||||
* @param[in, out] segments `ReadWritePropertyMap` with `Polyhedron::Facet_const_handle` as key and `int` as value type.
|
* @param[in, out] segments `ReadWritePropertyMap` with `Polyhedron::Facet_const_handle` as key and `std::size_t` as value type.
|
||||||
* @return number of segments
|
* @return number of segments
|
||||||
*/
|
*/
|
||||||
template<class SegmentPropertyMap, class SDFProperyMap>
|
template<class SegmentPropertyMap, class SDFProperyMap>
|
||||||
int assign_segments(int number_of_clusters, SDFProperyMap sdf_values,
|
std::size_t assign_segments(std::size_t number_of_clusters,
|
||||||
SegmentPropertyMap segments) {
|
SDFProperyMap sdf_values, SegmentPropertyMap segments) {
|
||||||
// assign a segment-id to each facet
|
// assign a segment-id to each facet
|
||||||
int segment_id = number_of_clusters;
|
std::size_t segment_id = number_of_clusters;
|
||||||
std::vector<std::pair<int, double> > segments_with_average_sdf_values;
|
std::vector<std::pair<std::size_t, double> > segments_with_average_sdf_values;
|
||||||
|
|
||||||
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
||||||
facet_it != mesh.facets_end(); ++facet_it) {
|
facet_it != mesh.facets_end(); ++facet_it) {
|
||||||
|
|
@ -443,21 +443,21 @@ private:
|
||||||
// sort segments according to their average sdf value
|
// sort segments according to their average sdf value
|
||||||
sort(segments_with_average_sdf_values.begin(),
|
sort(segments_with_average_sdf_values.begin(),
|
||||||
segments_with_average_sdf_values.end(),
|
segments_with_average_sdf_values.end(),
|
||||||
Sort_pairs_with_second<std::pair<int, double> >());
|
Sort_pairs_with_second<std::pair<std::size_t, double> >());
|
||||||
// map each segment-id to its new sorted index
|
// map each segment-id to its new sorted index
|
||||||
std::vector<int> segment_id_to_sorted_id_map(
|
std::vector<std::size_t> segment_id_to_sorted_id_map(
|
||||||
segments_with_average_sdf_values.size());
|
segments_with_average_sdf_values.size());
|
||||||
for(std::size_t index = 0; index < segments_with_average_sdf_values.size();
|
for(std::size_t index = 0; index < segments_with_average_sdf_values.size();
|
||||||
++index) {
|
++index) {
|
||||||
int segment_id = segments_with_average_sdf_values[index].first -
|
std::size_t segment_id = segments_with_average_sdf_values[index].first -
|
||||||
number_of_clusters;
|
number_of_clusters;
|
||||||
segment_id_to_sorted_id_map[segment_id] = static_cast<int>(index);
|
segment_id_to_sorted_id_map[segment_id] = index;
|
||||||
}
|
}
|
||||||
// make one-pass on facets. First make segment-id zero based by subtracting number_of_clusters
|
// make one-pass on facets. First make segment-id zero based by subtracting number_of_clusters
|
||||||
// . Then place its sorted index to pmap
|
// . Then place its sorted index to pmap
|
||||||
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
for(Facet_const_iterator facet_it = mesh.facets_begin();
|
||||||
facet_it != mesh.facets_end(); ++facet_it) {
|
facet_it != mesh.facets_end(); ++facet_it) {
|
||||||
int segment_id = segments[facet_it] - number_of_clusters;
|
std::size_t segment_id = segments[facet_it] - number_of_clusters;
|
||||||
segments[facet_it] = segment_id_to_sorted_id_map[segment_id];
|
segments[facet_it] = segment_id_to_sorted_id_map[segment_id];
|
||||||
}
|
}
|
||||||
return segment_id - number_of_clusters;
|
return segment_id - number_of_clusters;
|
||||||
|
|
@ -469,21 +469,21 @@ private:
|
||||||
* @param facet root facet
|
* @param facet root facet
|
||||||
* @param segment_id segment-id of root facet
|
* @param segment_id segment-id of root facet
|
||||||
* @param sdf_values `ReadablePropertyMap` with `Polyhedron::Facet_const_handle` as key and `double` as value type
|
* @param sdf_values `ReadablePropertyMap` with `Polyhedron::Facet_const_handle` as key and `double` as value type
|
||||||
* @param[in, out] segments `ReadWritePropertyMap` with `Polyhedron::Facet_const_handle` as key and `int` as value type.
|
* @param[in, out] segments `ReadWritePropertyMap` with `Polyhedron::Facet_const_handle` as key and `std::size_t` as value type.
|
||||||
* @return average sdf value for segment
|
* @return average sdf value for segment
|
||||||
*/
|
*/
|
||||||
template<class SegmentPropertyMap, class SDFProperyMap>
|
template<class SegmentPropertyMap, class SDFProperyMap>
|
||||||
double
|
double
|
||||||
breadth_first_traversal(Facet_const_handle root, int segment_id,
|
breadth_first_traversal(Facet_const_handle root, std::size_t segment_id,
|
||||||
SDFProperyMap sdf_values, SegmentPropertyMap segments) {
|
SDFProperyMap sdf_values, SegmentPropertyMap segments) {
|
||||||
std::queue<Facet_const_handle> facet_queue;
|
std::queue<Facet_const_handle> facet_queue;
|
||||||
facet_queue.push(root);
|
facet_queue.push(root);
|
||||||
|
|
||||||
int prev_segment_id = segments[root];
|
std::size_t prev_segment_id = segments[root];
|
||||||
segments[root] = segment_id;
|
segments[root] = segment_id;
|
||||||
|
|
||||||
double total_sdf_value = sdf_values[root];
|
double total_sdf_value = sdf_values[root];
|
||||||
int visited_facet_count = 1;
|
std::size_t visited_facet_count = 1;
|
||||||
|
|
||||||
while(!facet_queue.empty()) {
|
while(!facet_queue.empty()) {
|
||||||
Facet_const_handle facet = facet_queue.front();
|
Facet_const_handle facet = facet_queue.front();
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ std::pair<double, double>
|
||||||
sdf_values( const Polyhedron& polyhedron,
|
sdf_values( const Polyhedron& polyhedron,
|
||||||
SDFPropertyMap sdf_values_map,
|
SDFPropertyMap sdf_values_map,
|
||||||
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
||||||
int number_of_rays = 25,
|
std::size_t number_of_rays = 25,
|
||||||
bool postprocess = true,
|
bool postprocess = true,
|
||||||
GeomTraits traits = GeomTraits())
|
GeomTraits traits = GeomTraits())
|
||||||
{
|
{
|
||||||
|
|
@ -66,7 +66,7 @@ std::pair<double, double>
|
||||||
sdf_values( const Polyhedron& polyhedron,
|
sdf_values( const Polyhedron& polyhedron,
|
||||||
SDFPropertyMap sdf_values_map,
|
SDFPropertyMap sdf_values_map,
|
||||||
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
||||||
int number_of_rays = 25,
|
std::size_t number_of_rays = 25,
|
||||||
bool postprocess = true,
|
bool postprocess = true,
|
||||||
GeomTraits traits = GeomTraits())
|
GeomTraits traits = GeomTraits())
|
||||||
{
|
{
|
||||||
|
|
@ -131,7 +131,7 @@ sdf_values_postprocessing(const Polyhedron& polyhedron,
|
||||||
*
|
*
|
||||||
* @tparam Polyhedron a %CGAL polyhedron
|
* @tparam Polyhedron a %CGAL polyhedron
|
||||||
* @tparam SDFPropertyMap a `ReadablePropertyMap` with `Polyhedron::Facet_const_handle` as key and `double` as value type
|
* @tparam SDFPropertyMap a `ReadablePropertyMap` with `Polyhedron::Facet_const_handle` as key and `double` as value type
|
||||||
* @tparam SegmentPropertyMap a `ReadWritePropertyMap` with `Polyhedron::Facet_const_handle` as key and `int` as value type
|
* @tparam SegmentPropertyMap a `ReadWritePropertyMap` with `Polyhedron::Facet_const_handle` as key and `std::size_t` as value type
|
||||||
* @tparam GeomTraits a model of SegmentationGeomTraits
|
* @tparam GeomTraits a model of SegmentationGeomTraits
|
||||||
*
|
*
|
||||||
* @param polyhedron surface mesh corresponding to the SDF values
|
* @param polyhedron surface mesh corresponding to the SDF values
|
||||||
|
|
@ -150,11 +150,11 @@ template <class Polyhedron, class SDFPropertyMap, class SegmentPropertyMap,
|
||||||
= typename Polyhedron::Traits
|
= typename Polyhedron::Traits
|
||||||
#endif
|
#endif
|
||||||
>
|
>
|
||||||
int
|
std::size_t
|
||||||
segmentation_from_sdf_values( const Polyhedron& polyhedron,
|
segmentation_from_sdf_values( const Polyhedron& polyhedron,
|
||||||
SDFPropertyMap sdf_values_map,
|
SDFPropertyMap sdf_values_map,
|
||||||
SegmentPropertyMap segment_ids,
|
SegmentPropertyMap segment_ids,
|
||||||
int number_of_clusters = 5,
|
std::size_t number_of_clusters = 5,
|
||||||
double smoothing_lambda = 0.26,
|
double smoothing_lambda = 0.26,
|
||||||
bool output_cluster_ids = false,
|
bool output_cluster_ids = false,
|
||||||
GeomTraits traits = GeomTraits())
|
GeomTraits traits = GeomTraits())
|
||||||
|
|
@ -172,12 +172,12 @@ template < bool Fast_sdf_calculation_mode, class Polyhedron,
|
||||||
= typename Polyhedron::Traits
|
= typename Polyhedron::Traits
|
||||||
#endif
|
#endif
|
||||||
>
|
>
|
||||||
int
|
std::size_t
|
||||||
segmentation_via_sdf_values(const Polyhedron& polyhedron,
|
segmentation_via_sdf_values(const Polyhedron& polyhedron,
|
||||||
SegmentPropertyMap segment_ids,
|
SegmentPropertyMap segment_ids,
|
||||||
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
||||||
int number_of_rays = 25,
|
std::size_t number_of_rays = 25,
|
||||||
int number_of_clusters = 5,
|
std::size_t number_of_clusters = 5,
|
||||||
double smoothing_lambda = 0.26,
|
double smoothing_lambda = 0.26,
|
||||||
bool output_cluster_ids = false,
|
bool output_cluster_ids = false,
|
||||||
GeomTraits traits = GeomTraits())
|
GeomTraits traits = GeomTraits())
|
||||||
|
|
@ -214,7 +214,7 @@ segmentation_via_sdf_values(const Polyhedron& polyhedron,
|
||||||
* @pre @a number_of_clusters > 0
|
* @pre @a number_of_clusters > 0
|
||||||
*
|
*
|
||||||
* @tparam Polyhedron a %CGAL polyhedron
|
* @tparam Polyhedron a %CGAL polyhedron
|
||||||
* @tparam SegmentPropertyMap a `ReadWritePropertyMap` with `Polyhedron::Facet_const_handle` as key and `int` as value type
|
* @tparam SegmentPropertyMap a `ReadWritePropertyMap` with `Polyhedron::Facet_const_handle` as key and `std::size_t` as value type
|
||||||
* @tparam GeomTraits a model of SegmentationGeomTraits
|
* @tparam GeomTraits a model of SegmentationGeomTraits
|
||||||
*
|
*
|
||||||
* @param polyhedron surface mesh on which SDF values are computed
|
* @param polyhedron surface mesh on which SDF values are computed
|
||||||
|
|
@ -233,12 +233,12 @@ template < class Polyhedron, class SegmentPropertyMap, class GeomTraits
|
||||||
= typename Polyhedron::Traits
|
= typename Polyhedron::Traits
|
||||||
#endif
|
#endif
|
||||||
>
|
>
|
||||||
int
|
std::size_t
|
||||||
segmentation_via_sdf_values(const Polyhedron& polyhedron,
|
segmentation_via_sdf_values(const Polyhedron& polyhedron,
|
||||||
SegmentPropertyMap segment_ids,
|
SegmentPropertyMap segment_ids,
|
||||||
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
||||||
int number_of_rays = 25,
|
std::size_t number_of_rays = 25,
|
||||||
int number_of_clusters = 5,
|
std::size_t number_of_clusters = 5,
|
||||||
double smoothing_lambda = 0.26,
|
double smoothing_lambda = 0.26,
|
||||||
bool output_cluster_ids = false,
|
bool output_cluster_ids = false,
|
||||||
GeomTraits traits = GeomTraits())
|
GeomTraits traits = GeomTraits())
|
||||||
|
|
@ -255,7 +255,7 @@ std::pair<double, double>
|
||||||
sdf_values(const Polyhedron& polyhedron,
|
sdf_values(const Polyhedron& polyhedron,
|
||||||
SDFPropertyMap sdf_values_map,
|
SDFPropertyMap sdf_values_map,
|
||||||
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
||||||
int number_of_rays = 25,
|
std::size_t number_of_rays = 25,
|
||||||
bool postprocess = true,
|
bool postprocess = true,
|
||||||
typename Polyhedron::Traits traits = typename Polyhedron::Traits())
|
typename Polyhedron::Traits traits = typename Polyhedron::Traits())
|
||||||
{
|
{
|
||||||
|
|
@ -268,7 +268,7 @@ std::pair<double, double>
|
||||||
sdf_values( const Polyhedron& polyhedron,
|
sdf_values( const Polyhedron& polyhedron,
|
||||||
SDFPropertyMap sdf_values_map,
|
SDFPropertyMap sdf_values_map,
|
||||||
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
||||||
int number_of_rays = 25,
|
std::size_t number_of_rays = 25,
|
||||||
bool postprocess = true,
|
bool postprocess = true,
|
||||||
typename Polyhedron::Traits traits = typename Polyhedron::Traits())
|
typename Polyhedron::Traits traits = typename Polyhedron::Traits())
|
||||||
{
|
{
|
||||||
|
|
@ -277,11 +277,11 @@ sdf_values( const Polyhedron& polyhedron,
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Polyhedron, class SDFPropertyMap, class SegmentPropertyMap>
|
template <class Polyhedron, class SDFPropertyMap, class SegmentPropertyMap>
|
||||||
int
|
std::size_t
|
||||||
segmentation_from_sdf_values(const Polyhedron& polyhedron,
|
segmentation_from_sdf_values(const Polyhedron& polyhedron,
|
||||||
SDFPropertyMap sdf_values_map,
|
SDFPropertyMap sdf_values_map,
|
||||||
SegmentPropertyMap segment_ids,
|
SegmentPropertyMap segment_ids,
|
||||||
int number_of_clusters = 5,
|
std::size_t number_of_clusters = 5,
|
||||||
double smoothing_lambda = 0.26,
|
double smoothing_lambda = 0.26,
|
||||||
bool output_cluster_ids = false,
|
bool output_cluster_ids = false,
|
||||||
typename Polyhedron::Traits traits = typename Polyhedron::Traits())
|
typename Polyhedron::Traits traits = typename Polyhedron::Traits())
|
||||||
|
|
@ -292,12 +292,12 @@ segmentation_from_sdf_values(const Polyhedron& polyhedron,
|
||||||
}
|
}
|
||||||
|
|
||||||
template <bool Fast_sdf_calculation_mode, class Polyhedron, class SegmentPropertyMap>
|
template <bool Fast_sdf_calculation_mode, class Polyhedron, class SegmentPropertyMap>
|
||||||
int
|
std::size_t
|
||||||
segmentation_via_sdf_values(const Polyhedron& polyhedron,
|
segmentation_via_sdf_values(const Polyhedron& polyhedron,
|
||||||
SegmentPropertyMap segment_ids,
|
SegmentPropertyMap segment_ids,
|
||||||
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
||||||
int number_of_rays = 25,
|
std::size_t number_of_rays = 25,
|
||||||
int number_of_clusters = 5,
|
std::size_t number_of_clusters = 5,
|
||||||
double smoothing_lambda = 0.26,
|
double smoothing_lambda = 0.26,
|
||||||
bool output_cluster_ids = false,
|
bool output_cluster_ids = false,
|
||||||
typename Polyhedron::Traits traits = typename Polyhedron::Traits())
|
typename Polyhedron::Traits traits = typename Polyhedron::Traits())
|
||||||
|
|
@ -308,12 +308,12 @@ segmentation_via_sdf_values(const Polyhedron& polyhedron,
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Polyhedron, class SegmentPropertyMap>
|
template <class Polyhedron, class SegmentPropertyMap>
|
||||||
int
|
std::size_t
|
||||||
segmentation_via_sdf_values(const Polyhedron& polyhedron,
|
segmentation_via_sdf_values(const Polyhedron& polyhedron,
|
||||||
SegmentPropertyMap segment_ids,
|
SegmentPropertyMap segment_ids,
|
||||||
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
double cone_angle = 2.0 / 3.0 * CGAL_PI,
|
||||||
int number_of_rays = 25,
|
std::size_t number_of_rays = 25,
|
||||||
int number_of_clusters = 5,
|
std::size_t number_of_clusters = 5,
|
||||||
double smoothing_lambda = 0.26,
|
double smoothing_lambda = 0.26,
|
||||||
bool output_cluster_ids = false,
|
bool output_cluster_ids = false,
|
||||||
typename Polyhedron::Traits traits = typename Polyhedron::Traits())
|
typename Polyhedron::Traits traits = typename Polyhedron::Traits())
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ typedef boost::tuple<double, double, double> boost_tuple;
|
||||||
|
|
||||||
void print(const std::vector<boost_tuple>& samples)
|
void print(const std::vector<boost_tuple>& samples)
|
||||||
{
|
{
|
||||||
const int map_size = 31;
|
const std::size_t map_size = 31;
|
||||||
const int map_size_2 = 45;
|
const std::size_t map_size_2 = 45;
|
||||||
std::vector<std::vector<bool> > sample_map(map_size, std::vector<bool>(map_size_2, false));
|
std::vector<std::vector<bool> > sample_map(map_size, std::vector<bool>(map_size_2, false));
|
||||||
|
|
||||||
for(std::vector<boost_tuple>::const_iterator sample_it = samples.begin();
|
for(std::vector<boost_tuple>::const_iterator sample_it = samples.begin();
|
||||||
|
|
@ -18,13 +18,13 @@ void print(const std::vector<boost_tuple>& samples)
|
||||||
double y = (sample_it->get<1>() +1)/2;
|
double y = (sample_it->get<1>() +1)/2;
|
||||||
x *= (map_size-1);
|
x *= (map_size-1);
|
||||||
y *= (map_size_2-1);
|
y *= (map_size_2-1);
|
||||||
int x_c = static_cast<int>(x + 0.49);
|
std::size_t x_c = static_cast<std::size_t>(x + 0.49);
|
||||||
int y_c = static_cast<int>(y + 0.49);
|
std::size_t y_c = static_cast<std::size_t>(y + 0.49);
|
||||||
sample_map[x_c][y_c] = true;
|
sample_map[x_c][y_c] = true;
|
||||||
}
|
}
|
||||||
for(int i = 0; i < map_size; ++i)
|
for(std::size_t i = 0; i < map_size; ++i)
|
||||||
{
|
{
|
||||||
for(int j = 0; j < map_size_2; ++j)
|
for(std::size_t j = 0; j < map_size_2; ++j)
|
||||||
{
|
{
|
||||||
if(sample_map[i][j]){ std::cout << "*"; }
|
if(sample_map[i][j]){ std::cout << "*"; }
|
||||||
else { std::cout << " "; }
|
else { std::cout << " "; }
|
||||||
|
|
|
||||||
|
|
@ -29,16 +29,16 @@ int main(void)
|
||||||
{
|
{
|
||||||
boost::variate_generator<boost::mt19937&, boost::normal_distribution<double> > var_nor(engine, *it);
|
boost::variate_generator<boost::mt19937&, boost::normal_distribution<double> > var_nor(engine, *it);
|
||||||
|
|
||||||
for(int i = 0; i < 300; ++i) { data.push_back(var_nor()); }
|
for(std::size_t i = 0; i < 300; ++i) { data.push_back(var_nor()); }
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate closest center (using above gauissians) for each generated points
|
// calculate closest center (using above gauissians) for each generated points
|
||||||
// we will compare it with gmm fitting results
|
// we will compare it with gmm fitting results
|
||||||
// also we might want to compute mixing coef for each center and select centers according to mixing_coef * prob(data)
|
// also we might want to compute mixing coef for each center and select centers according to mixing_coef * prob(data)
|
||||||
std::vector<int> data_centers;
|
std::vector<std::size_t> data_centers;
|
||||||
for(std::vector<double>::iterator it = data.begin(); it != data.end(); ++it)
|
for(std::vector<double>::iterator it = data.begin(); it != data.end(); ++it)
|
||||||
{
|
{
|
||||||
int center_id = -1, center_counter = 0;;
|
std::size_t center_id = -1, center_counter = 0;;
|
||||||
double min_distance = (std::numeric_limits<double>::max)();
|
double min_distance = (std::numeric_limits<double>::max)();
|
||||||
for(std::vector< boost::normal_distribution<double> >::iterator dis_it = distributions.begin();
|
for(std::vector< boost::normal_distribution<double> >::iterator dis_it = distributions.begin();
|
||||||
dis_it != distributions.end(); ++dis_it, ++center_counter)
|
dis_it != distributions.end(); ++dis_it, ++center_counter)
|
||||||
|
|
@ -60,8 +60,8 @@ int main(void)
|
||||||
gmm_fitters.push_back(E_M(distributions.size(), data, E_M::RANDOM_INITIALIZATION));
|
gmm_fitters.push_back(E_M(distributions.size(), data, E_M::RANDOM_INITIALIZATION));
|
||||||
gmm_fitters.push_back(E_M(distributions.size(), data, E_M::K_MEANS_INITIALIZATION));
|
gmm_fitters.push_back(E_M(distributions.size(), data, E_M::K_MEANS_INITIALIZATION));
|
||||||
|
|
||||||
std::vector< std::vector<int> > calculated_centers(gmm_fitters.size());
|
std::vector< std::vector<std::size_t> > calculated_centers(gmm_fitters.size());
|
||||||
std::vector< std::vector<int> >::iterator calc_centers_it = calculated_centers.begin();
|
std::vector< std::vector<std::size_t> >::iterator calc_centers_it = calculated_centers.begin();
|
||||||
for(std::vector<E_M>::iterator it = gmm_fitters.begin(); it != gmm_fitters.end(); ++it, ++calc_centers_it)
|
for(std::vector<E_M>::iterator it = gmm_fitters.begin(); it != gmm_fitters.end(); ++it, ++calc_centers_it)
|
||||||
{
|
{
|
||||||
it->fill_with_center_ids(*calc_centers_it);
|
it->fill_with_center_ids(*calc_centers_it);
|
||||||
|
|
@ -69,12 +69,12 @@ int main(void)
|
||||||
|
|
||||||
std::cout << "Compare results of EM with 'expected' (but be aware, it is not optimal result in terms of likelihood)" << std::endl;
|
std::cout << "Compare results of EM with 'expected' (but be aware, it is not optimal result in terms of likelihood)" << std::endl;
|
||||||
std::cout << "Another words a clustering which has higher likelihood can result in worse score in here" << std::endl;
|
std::cout << "Another words a clustering which has higher likelihood can result in worse score in here" << std::endl;
|
||||||
for(std::vector< std::vector<int> >::iterator calc_centers_it = calculated_centers.begin();
|
for(std::vector< std::vector<std::size_t> >::iterator calc_centers_it = calculated_centers.begin();
|
||||||
calc_centers_it != calculated_centers.end(); ++calc_centers_it)
|
calc_centers_it != calculated_centers.end(); ++calc_centers_it)
|
||||||
{
|
{
|
||||||
int true_count = 0;
|
std::size_t true_count = 0;
|
||||||
std::vector<int>::iterator calculated_it = calc_centers_it->begin();
|
std::vector<std::size_t>::iterator calculated_it = calc_centers_it->begin();
|
||||||
for(std::vector<int>::iterator it = data_centers.begin(); it != data_centers.end(); ++it, ++calculated_it)
|
for(std::vector<std::size_t>::iterator it = data_centers.begin(); it != data_centers.end(); ++it, ++calculated_it)
|
||||||
{
|
{
|
||||||
if( (*it) == (*calculated_it) ) { ++true_count; }
|
if( (*it) == (*calculated_it) ) { ++true_count; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,10 +39,10 @@ int main(void)
|
||||||
std::cout << "Calculation time (fast traversal off): *** " << timer.time() << std::endl;
|
std::cout << "Calculation time (fast traversal off): *** " << timer.time() << std::endl;
|
||||||
|
|
||||||
timer.reset();
|
timer.reset();
|
||||||
typedef std::map<Polyhedron::Facet_const_handle, int> Facet_int_map;
|
typedef std::map<Polyhedron::Facet_const_handle, std::size_t> Facet_int_map;
|
||||||
Facet_int_map internal_segment_map;
|
Facet_int_map internal_segment_map;
|
||||||
// calculate SDF values and segment the mesh using default parameters.
|
// calculate SDF values and segment the mesh using default parameters.
|
||||||
int number_of_segments = CGAL::segmentation_via_sdf_values(mesh,
|
std::size_t number_of_segments = CGAL::segmentation_via_sdf_values(mesh,
|
||||||
boost::associative_property_map<Facet_int_map>(internal_segment_map));
|
boost::associative_property_map<Facet_int_map>(internal_segment_map));
|
||||||
std::cout << "Number of segments: " << number_of_segments << std::endl;
|
std::cout << "Number of segments: " << number_of_segments << std::endl;
|
||||||
std::cout << "Calculation time (fast traversal on): *** " << timer.time() << std::endl;
|
std::cout << "Calculation time (fast traversal on): *** " << timer.time() << std::endl;
|
||||||
|
|
|
||||||
|
|
@ -30,15 +30,15 @@ int main(void)
|
||||||
{
|
{
|
||||||
boost::variate_generator<boost::mt19937&, boost::normal_distribution<double> > var_nor(engine, *it);
|
boost::variate_generator<boost::mt19937&, boost::normal_distribution<double> > var_nor(engine, *it);
|
||||||
|
|
||||||
for(int i = 0; i < 300; ++i) { data.push_back(var_nor()); }
|
for(std::size_t i = 0; i < 300; ++i) { data.push_back(var_nor()); }
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate closest center (using above gauissians) for each generated points
|
// calculate closest center (using above gauissians) for each generated points
|
||||||
// we will compare it with k-means results
|
// we will compare it with k-means results
|
||||||
std::vector<int> data_centers;
|
std::vector<std::size_t> data_centers;
|
||||||
for(std::vector<double>::iterator it = data.begin(); it != data.end(); ++it)
|
for(std::vector<double>::iterator it = data.begin(); it != data.end(); ++it)
|
||||||
{
|
{
|
||||||
int center_id = -1, center_counter = 0;;
|
std::size_t center_id = -1, center_counter = 0;;
|
||||||
double min_distance = (std::numeric_limits<double>::max)();
|
double min_distance = (std::numeric_limits<double>::max)();
|
||||||
for(std::vector< boost::normal_distribution<double> >::iterator dis_it = distributions.begin();
|
for(std::vector< boost::normal_distribution<double> >::iterator dis_it = distributions.begin();
|
||||||
dis_it != distributions.end(); ++dis_it, ++center_counter)
|
dis_it != distributions.end(); ++dis_it, ++center_counter)
|
||||||
|
|
@ -59,8 +59,8 @@ int main(void)
|
||||||
k_means.push_back(K_means(distributions.size(), data, K_means::PLUS_INITIALIZATION));
|
k_means.push_back(K_means(distributions.size(), data, K_means::PLUS_INITIALIZATION));
|
||||||
k_means.push_back(K_means(distributions.size(), data, K_means::RANDOM_INITIALIZATION));
|
k_means.push_back(K_means(distributions.size(), data, K_means::RANDOM_INITIALIZATION));
|
||||||
|
|
||||||
std::vector< std::vector<int> > calculated_centers(k_means.size());
|
std::vector< std::vector<std::size_t> > calculated_centers(k_means.size());
|
||||||
std::vector< std::vector<int> >::iterator calc_centers_it = calculated_centers.begin();
|
std::vector< std::vector<std::size_t> >::iterator calc_centers_it = calculated_centers.begin();
|
||||||
for(std::vector<K_means>::iterator it = k_means.begin(); it != k_means.end(); ++it, ++calc_centers_it)
|
for(std::vector<K_means>::iterator it = k_means.begin(); it != k_means.end(); ++it, ++calc_centers_it)
|
||||||
{
|
{
|
||||||
it->fill_with_center_ids(*calc_centers_it);
|
it->fill_with_center_ids(*calc_centers_it);
|
||||||
|
|
@ -68,12 +68,12 @@ int main(void)
|
||||||
|
|
||||||
std::cout << "Compare results of k-means with 'expected' (but be aware, it is not optimal result in terms of within-cluster error)" << std::endl;
|
std::cout << "Compare results of k-means with 'expected' (but be aware, it is not optimal result in terms of within-cluster error)" << std::endl;
|
||||||
std::cout << "Another words a clustering which has smaller within-cluster error can result in worse score in here" << std::endl;
|
std::cout << "Another words a clustering which has smaller within-cluster error can result in worse score in here" << std::endl;
|
||||||
for(std::vector< std::vector<int> >::iterator calc_centers_it = calculated_centers.begin();
|
for(std::vector< std::vector<std::size_t> >::iterator calc_centers_it = calculated_centers.begin();
|
||||||
calc_centers_it != calculated_centers.end(); ++calc_centers_it)
|
calc_centers_it != calculated_centers.end(); ++calc_centers_it)
|
||||||
{
|
{
|
||||||
int true_count = 0;
|
std::size_t true_count = 0;
|
||||||
std::vector<int>::iterator calculated_it = calc_centers_it->begin();
|
std::vector<std::size_t>::iterator calculated_it = calc_centers_it->begin();
|
||||||
for(std::vector<int>::iterator it = data_centers.begin(); it != data_centers.end(); ++it, ++calculated_it)
|
for(std::vector<std::size_t>::iterator it = data_centers.begin(); it != data_centers.end(); ++it, ++calculated_it)
|
||||||
{
|
{
|
||||||
if( (*it) == (*calculated_it) ) { ++true_count; }
|
if( (*it) == (*calculated_it) ) { ++true_count; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,26 +9,26 @@ typedef CGAL::internal::K_means_clustering K_means;
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
for(int init_type = 0; init_type < 2; ++init_type)
|
for(std::size_t init_type = 0; init_type < 2; ++init_type)
|
||||||
{
|
{
|
||||||
K_means::Initialization_types init_type_enum = init_type == 0 ? K_means::RANDOM_INITIALIZATION :
|
K_means::Initialization_types init_type_enum = init_type == 0 ? K_means::RANDOM_INITIALIZATION :
|
||||||
K_means::PLUS_INITIALIZATION;
|
K_means::PLUS_INITIALIZATION;
|
||||||
// Test case: number of points equals to number of clusters
|
// Test case: number of points equals to number of clusters
|
||||||
// and all points are unique
|
// and all points are unique
|
||||||
for(int center_size = 1; center_size < 100; ++center_size)
|
for(std::size_t center_size = 1; center_size < 100; ++center_size)
|
||||||
{
|
{
|
||||||
// unique point generate
|
// unique point generate
|
||||||
std::vector<double> points;
|
std::vector<double> points;
|
||||||
for(int i = 0; i < center_size; ++i) {
|
for(std::size_t i = 0; i < center_size; ++i) {
|
||||||
points.push_back(i);
|
points.push_back(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// test kmeans, expected result: each point has its own cluster
|
// test kmeans, expected result: each point has its own cluster
|
||||||
K_means kmeans(center_size, points, init_type_enum);
|
K_means kmeans(center_size, points, init_type_enum);
|
||||||
std::vector<int> center_ids;
|
std::vector<std::size_t> center_ids;
|
||||||
kmeans.fill_with_center_ids(center_ids);
|
kmeans.fill_with_center_ids(center_ids);
|
||||||
|
|
||||||
for(int i = 0; i < center_size -1; ++i) {
|
for(std::size_t i = 0; i < center_size -1; ++i) {
|
||||||
if(center_ids[i] >= center_ids[i +1]) // center ids are ordered according to mean
|
if(center_ids[i] >= center_ids[i +1]) // center ids are ordered according to mean
|
||||||
{ // and since points are generated ascendingly ...
|
{ // and since points are generated ascendingly ...
|
||||||
std::string init_type_s = init_type_enum == K_means::RANDOM_INITIALIZATION ? "Random " :
|
std::string init_type_s = init_type_enum == K_means::RANDOM_INITIALIZATION ? "Random " :
|
||||||
|
|
|
||||||
|
|
@ -28,11 +28,11 @@ int main(void)
|
||||||
std::pair<double, double> min_max_sdf = CGAL::sdf_values(mesh, sdf_property_map);
|
std::pair<double, double> min_max_sdf = CGAL::sdf_values(mesh, sdf_property_map);
|
||||||
std::cout << "minimum sdf: " << min_max_sdf.first << " maximum sdf: " << min_max_sdf.second << std::endl;
|
std::cout << "minimum sdf: " << min_max_sdf.first << " maximum sdf: " << min_max_sdf.second << std::endl;
|
||||||
|
|
||||||
typedef std::map<Polyhedron::Facet_const_handle, int> Facet_int_map;
|
typedef std::map<Polyhedron::Facet_const_handle, std::size_t> Facet_int_map;
|
||||||
Facet_int_map internal_segment_map;
|
Facet_int_map internal_segment_map;
|
||||||
boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);
|
boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);
|
||||||
|
|
||||||
int nb_segments = CGAL::segmentation_from_sdf_values(
|
std::size_t nb_segments = CGAL::segmentation_from_sdf_values(
|
||||||
mesh, sdf_property_map, segment_property_map);
|
mesh, sdf_property_map, segment_property_map);
|
||||||
|
|
||||||
if(nb_segments != 3)
|
if(nb_segments != 3)
|
||||||
|
|
|
||||||
|
|
@ -30,11 +30,11 @@ int main(void)
|
||||||
std::pair<double, double> min_max_sdf = CGAL::sdf_values(mesh, sdf_property_map);
|
std::pair<double, double> min_max_sdf = CGAL::sdf_values(mesh, sdf_property_map);
|
||||||
std::cout << "minimum sdf: " << min_max_sdf.first << " maximum sdf: " << min_max_sdf.second << std::endl;
|
std::cout << "minimum sdf: " << min_max_sdf.first << " maximum sdf: " << min_max_sdf.second << std::endl;
|
||||||
|
|
||||||
typedef std::map<Polyhedron::Facet_const_handle, int> Facet_int_map;
|
typedef std::map<Polyhedron::Facet_const_handle, std::size_t> Facet_int_map;
|
||||||
Facet_int_map internal_segment_map;
|
Facet_int_map internal_segment_map;
|
||||||
boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);
|
boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);
|
||||||
|
|
||||||
int nb_segments = CGAL::segmentation_from_sdf_values(
|
std::size_t nb_segments = CGAL::segmentation_from_sdf_values(
|
||||||
mesh, sdf_property_map, segment_property_map);
|
mesh, sdf_property_map, segment_property_map);
|
||||||
|
|
||||||
if(nb_segments != 3)
|
if(nb_segments != 3)
|
||||||
|
|
|
||||||
|
|
@ -22,12 +22,12 @@ int main()
|
||||||
}
|
}
|
||||||
|
|
||||||
// create a property-map for segment-ids
|
// create a property-map for segment-ids
|
||||||
typedef std::map<Polyhedron::Facet_const_handle, int> Facet_int_map;
|
typedef std::map<Polyhedron::Facet_const_handle, std::size_t> Facet_int_map;
|
||||||
Facet_int_map internal_segment_map;
|
Facet_int_map internal_segment_map;
|
||||||
boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);
|
boost::associative_property_map<Facet_int_map> segment_property_map(internal_segment_map);
|
||||||
|
|
||||||
// calculate SDF values and segment the mesh using default parameters.
|
// calculate SDF values and segment the mesh using default parameters.
|
||||||
int number_of_segments = CGAL::segmentation_via_sdf_values(mesh, segment_property_map);
|
std::size_t number_of_segments = CGAL::segmentation_via_sdf_values(mesh, segment_property_map);
|
||||||
|
|
||||||
std::cout << "Number of segments: " << number_of_segments << std::endl;
|
std::cout << "Number of segments: " << number_of_segments << std::endl;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue