Code & comment review.

This commit is contained in:
Ílker Yaz 2012-08-30 18:18:40 +00:00
parent 7064d52d63
commit ab6b5ebb57
6 changed files with 58 additions and 56 deletions

View File

@ -23,7 +23,7 @@
#include <vector>
#define CGAL_USE_BOYKOV_KOLMOGOROV_MAXFLOW_SOFTWARE
//#define CGAL_USE_BOYKOV_KOLMOGOROV_MAXFLOW_SOFTWARE
#ifdef CGAL_USE_BOYKOV_KOLMOGOROV_MAXFLOW_SOFTWARE
#include <CGAL/internal/auxiliary/graph.h>
@ -109,7 +109,7 @@ private:
* @param v2 second vertex
* @param w1 weight for edge from v1 to v2 (v1->v2)
* @param w2 weight for edge from v2 to v1 (v2->v1)
* @graph to be added
* @param graph to be added
* @return pair of added edges, first: v1->v2 and second: v2->v1
*/
boost::tuple<Edge_descriptor, Edge_descriptor>
@ -141,6 +141,7 @@ public:
* @param probability_matrix contains responsibility of the center on the vertex probability[center][vertex]
* @param[in, out] labels as input it contains initial labeling of vertices (i.e. a center-id between [0, number of centers -1]),
* and as output it returns final labeling of vertices
* @return result of energy function
*/
double operator()(const std::vector<std::pair<int, int> >& edges,
const std::vector<double>& edge_weights,
@ -273,7 +274,7 @@ private:
* @param v2 second vertex
* @param w1 weight for edge from v1 to v2 (v1->v2)
* @param w2 weight for edge from v2 to v1 (v2->v1)
* @graph to be added
* @param graph to be added
* @return pair of added edges, first: v1->v2 and second: v2->v1
*/
boost::tuple<Edge_descriptor, Edge_descriptor>
@ -305,6 +306,7 @@ public:
* @param probability_matrix contains responsibility of the center on the vertex probability[center][vertex]
* @param[in, out] labels as input it contains initial labeling of vertices (i.e. a center-id between [0, number of centers -1]),
* and as output it returns final labeling of vertices
* @return result of energy function
*/
double operator()(const std::vector<std::pair<int, int> >& edges,
const std::vector<double>& edge_weights,
@ -404,6 +406,7 @@ public:
* @param probability_matrix contains responsibility of the center on the vertex probability[center][vertex]
* @param[in, out] labels as input it contains initial labeling of vertices (i.e. a center-id between [0, number of centers -1]),
* and as output it returns final labeling of vertices
* @return result of energy function
*/
double operator()(const std::vector<std::pair<int, int> >& edges,
const std::vector<double>& edge_weights,

View File

@ -42,6 +42,7 @@ namespace internal
* @brief Uses Vogel's method to sample points from unit-disk.
*
* @tparam Tuple should have a constructor which takes 3 double parameters.
* @tparam uniform indicates how sampling occurs (uniform or biased to center)
* @see Disk_samplers.h, SDF_calculation
*/
template<class Tuple, bool uniform = false>
@ -53,10 +54,9 @@ public:
* @param number_of_points number of points to be picked
* @param cone_angle opening angle of cone (might be necessary for weighting)
* @param[out] out_it sampled points from disk, each point is tuple of:
* - first = coordinate-x
* - second = coordinate-y
* - third = weight (proportional to angle between cone-normal)
* @param uniform if false custom power will be used and sampled points will be biased to center
* - coordinate-x
* - coordinate-y
* - weight (proportional to angle between cone-normal)
*/
template<class OutputIterator>
void operator()(int number_of_points,
@ -127,12 +127,11 @@ public:
* @param number_of_points number of points to be picked
* @param cone_angle opening angle of cone (might be necessary for weighting)
* @param[out] out_it sampled points from disk, each point is tuple of:
* - first = coordinate-x
* - second = coordinate-y
* - third = weight (proportional to angle between cone-normal)
* - coordinate-x
* - coordinate-y
* - weight (proportional to angle between cone-normal)
*
* 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>
void operator()(int number_of_points,
@ -194,12 +193,11 @@ public:
* @param number_of_points number of points to be picked
* @param cone_angle opening angle of cone (might be necessary for weighting)
* @param[out] out_it sampled points from disk, each point is tuple of:
* - first = coordinate-x
* - second = coordinate-y
* - third = weight (proportional to angle between cone-normal)
* - coordinate-x
* - coordinate-y
* - weight (proportional to angle between cone-normal)
*
* 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>
void operator()(int number_of_points,

View File

@ -5,7 +5,7 @@
* @file Filters.h
* @brief This file contains 2 filtering methods, which can be used as a template parameter for CGAL::internal::Surface_mesh_segmentation.
*
* Also filtering methods can be used by their-own for smoothing associated values to `CGAL Polyhedron`.
* Also filtering methods can be used by their-own for smoothing associated values with `CGAL Polyhedron` facets.
*/
#include <vector>
#include <map>

View File

@ -142,8 +142,7 @@ public:
data_centers.reserve(points.size());
for(std::vector<K_means_point>::iterator point_it = points.begin();
point_it != points.end(); ++point_it) {
point_it->calculate_new_center(
centers); // just refind closest center (incase order of centers are changed etc)
point_it->calculate_new_center(centers); // find closest center
data_centers.push_back(point_it->center_id);
}
}
@ -274,18 +273,16 @@ private:
min_centers = centers;
}
}
// By saving points (min_points) also, we can get rid of this part
// But since centers are already converged this step will require one iteration
// If it stopped since maximum_iteration is reached then this step will take some time
// Note that current center-ids in points are not valid.
// But they are recalculated when asked (in fill_with_center_ids())
centers = min_centers;
calculate_clustering();
}
/**
* Sum of squared distances between each point and the closest center to it.
*/
double within_cluster_sum_of_squares() const {
double sum = 0;
double sum = 0.0;
for(std::vector<K_means_point>::const_iterator point_it = points.begin();
point_it != points.end(); ++point_it) {
sum += std::pow(centers[point_it->center_id].mean - point_it->data, 2);

View File

@ -22,24 +22,26 @@ namespace internal
/**
* @brief Responsible for calculating Shape Diameter Function over surface of the mesh.
* @see Disk_samplers.h
*
* @tparam Polyhedron a CGAL polyhedron
* @tparam GeomTraits a model of SegmentationGeomTraits
* @tparam DiskSampling chosen sampling method from Disk_samplers.h
*/
template <
class Polyhedron,
class SegmentationGeomTraits,
class GeomTraits,
class DiskSampling = Vogel_disk_sampling<boost::tuple<double, double, double> >
>
class SDF_calculation
{
//type definitions
private:
typedef SegmentationGeomTraits SGT;
typedef typename SGT::Vector_3 Vector;
typedef typename SGT::Point_3 Point;
typedef typename SGT::Ray_3 Ray;
typedef typename SGT::Plane_3 Plane;
typedef typename SGT::Segment_3 Segment;
typedef typename GeomTraits::Vector_3 Vector;
typedef typename GeomTraits::Point_3 Point;
typedef typename GeomTraits::Ray_3 Ray;
typedef typename GeomTraits::Plane_3 Plane;
typedef typename GeomTraits::Segment_3 Segment;
typedef typename Polyhedron::Traits Kernel;
typedef typename Polyhedron::Facet Facet;
@ -49,8 +51,9 @@ private:
typedef typename Polyhedron::Facet_const_handle Facet_const_handle;
typedef AABB_const_polyhedron_triangle_primitive<SGT, Polyhedron> Primitive;
typedef typename CGAL::AABB_tree<AABB_traits<SGT, Primitive> > Tree;
typedef AABB_const_polyhedron_triangle_primitive<GeomTraits, Polyhedron>
Primitive;
typedef typename CGAL::AABB_tree<AABB_traits<GeomTraits, Primitive> > Tree;
typedef typename Tree::Object_and_primitive_id
Object_and_primitive_id;
typedef typename Tree::Primitive_id
@ -69,20 +72,20 @@ private:
bool use_minimum_segment;
double multiplier_for_segment;
SGT traits;
GeomTraits traits;
typename SGT::Angle_3 angle_functor;
typename SGT::Construct_scaled_vector_3 scale_functor;
typename SGT::Construct_sum_of_vectors_3 sum_functor;
typename SGT::Construct_normal_3 normal_functor;
typename SGT::Construct_unit_normal_3 unit_normal_functor;
typename SGT::Construct_translated_point_3 translated_point_functor;
typename SGT::Construct_centroid_3 centroid_functor;
typename GeomTraits::Angle_3 angle_functor;
typename GeomTraits::Construct_scaled_vector_3 scale_functor;
typename GeomTraits::Construct_sum_of_vectors_3 sum_functor;
typename GeomTraits::Construct_normal_3 normal_functor;
typename GeomTraits::Construct_unit_normal_3 unit_normal_functor;
typename GeomTraits::Construct_translated_point_3 translated_point_functor;
typename GeomTraits::Construct_centroid_3 centroid_functor;
public:
/**
* Assign default values to member variables.
*/
SDF_calculation(SGT traits)
SDF_calculation(GeomTraits traits)
: traits(traits), use_minimum_segment(false), multiplier_for_segment(1),
angle_functor(traits.angle_3_object()),
scale_functor(traits.construct_scaled_vector_3_object()),
@ -95,7 +98,6 @@ public:
/**
* Calculates SDF values for each facet, and stores them in @a sdf_values. Note that sdf values are neither smoothed nor normalized.
* @pre parameter @a mesh should consist of triangles.
* @param mesh `CGAL Polyhedron` on which SDF values are computed
* @param cone_angle opening angle for cone, expressed in radians
* @param number_of_rays number of rays picked from cone for each facet
@ -134,7 +136,6 @@ private:
*/
double calculate_sdf_value_of_facet(Facet_const_handle& facet, const Tree& tree,
const Disk_samples_list& samples) const {
//ofstream output("rays.txt", ios::app);
const Point& p1 = facet->halfedge()->vertex()->point();
const Point& p2 = facet->halfedge()->next()->vertex()->point();
const Point& p3 = facet->halfedge()->prev()->vertex()->point();
@ -171,9 +172,7 @@ private:
Vector disk_vector = sum_functor(scale_functor(v1, sample_it->get<0>()),
scale_functor(v2, sample_it->get<1>()));
Vector ray_direction = sum_functor(normal, disk_vector);
//output << center << std::endl;
//std::cout << center << std::endl;
//output << ray_direction << std::endl;
#ifdef SHOOT_ONLY_RAYS
Ray ray(center, ray_direction);
boost::tie(is_intersected, intersection_is_acute,
@ -215,6 +214,7 @@ private:
continue;
}
if(use_minimum_segment) {
if(min_distance <
*segment_distance) { // update segment_distance (minimum / maximum)

View File

@ -30,17 +30,22 @@ namespace internal
* It is a connector class which uses:
* - SDF_calculation for calculating sdf values
* - Expectation_maximization for soft clustering
* - An implementation of alpha-expansion graph cut for hard clustering (Alpha_expansion_graph_cut.h)
* - An implementation of alpha-expansion graph cut for hard clustering
*
* Other than being a connector, it is also responsable for preprocess and postprocess on intermadiate data, which are:
* - log-normalizing probabilities received from soft clustering
* - log-normalizing and calculating dihedral-angle based weights for edges
* - smoothing and log-normalizing sdf values received from sdf calculation (Filters.h)
* - assigning segment-id for each facet after hard clustering
*
* @tparam Polyhedron a CGAL polyhedron
* @tparam GeomTraits a model of SegmentationGeomTraits
* @tparam GraphCut chosen graph-cut implementation from Alpha_expansion_graph_cut.h
* @tparam Filter chosen filtering method from Filters.h
*/
template <
class Polyhedron,
class SegmentationGeomTraits,
class GeomTraits,
#ifdef CGAL_USE_BOYKOV_KOLMOGOROV_MAXFLOW_SOFTWARE
class GraphCut = Alpha_expansion_graph_cut_boykov_kolmogorov,
#else
@ -56,7 +61,7 @@ public:
private:
//typedef typename Polyhedron::Traits Kernel;
typedef typename SegmentationGeomTraits::Point_3 Point;
typedef typename GeomTraits::Point_3 Point;
typedef typename Polyhedron::Facet Facet;
@ -66,20 +71,19 @@ private:
typedef typename Polyhedron::Facet_const_iterator Facet_const_iterator;
typedef typename Polyhedron::Vertex_const_iterator Vertex_const_iterator;
typedef SDF_calculation<Polyhedron, SegmentationGeomTraits>
SDF_calculation_class;
typedef SDF_calculation<Polyhedron, GeomTraits> SDF_calculation_class;
// member variables
private:
const Polyhedron& mesh;
SegmentationGeomTraits traits;
GeomTraits traits;
// member functions
public:
/**
* @pre @a polyhedron.is_pure_triangle()
* @param mesh `CGAL Polyhedron` on which other functions operate.
*/
Surface_mesh_segmentation(const Polyhedron& mesh, SegmentationGeomTraits traits)
Surface_mesh_segmentation(const Polyhedron& mesh, GeomTraits traits)
: mesh(mesh), traits(traits) {
CGAL_precondition(mesh.is_pure_triangle());
}