turn int to std::size_t when it is possible

This commit is contained in:
Sébastien Loriot 2013-12-13 15:10:31 +01:00
parent 172c6d4592
commit 61c91a1971
21 changed files with 200 additions and 197 deletions

View File

@ -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);

View File

@ -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 =

View File

@ -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.

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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) {

View File

@ -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));

View File

@ -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) {

View File

@ -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;

View File

@ -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();

View File

@ -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())

View File

@ -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 << " "; }

View File

@ -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; }
} }

View File

@ -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;

View File

@ -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; }
} }

View File

@ -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 " :

View File

@ -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)

View File

@ -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)

View File

@ -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;