diff --git a/Surface_modeling/include/CGAL/Deform_mesh.h b/Surface_modeling/include/CGAL/Deform_mesh.h index 16f13072f89..5c3fb30cc80 100644 --- a/Surface_modeling/include/CGAL/Deform_mesh.h +++ b/Surface_modeling/include/CGAL/Deform_mesh.h @@ -46,7 +46,7 @@ namespace CGAL { * * @pre @a polyhedron.is_pure_triangle() * @tparam Polyhedron a model of HalfedgeGraph - * @tparam SparseLinearAlgebraTraitsWithPreFactor_d sparse linear solver for square symmetric sparse linear systems + * @tparam SparseLinearAlgebraTraitsWithPreFactor_d sparse linear solver for square sparse linear systems * @tparam VertexIndexMap a `ReadWritePropertyMap` with vertex_descriptor as key and `unsigned int` as value type * @tparam EdgeIndexMap a `ReadWritePropertyMap` with edge_descriptor as key and `unsigned int` as value type * @tparam WeightCalculator how to document this (should I provide a concept, like in SegmentationGeomTraits ?) */ @@ -218,7 +218,7 @@ public: // or Handle_group handle_group = insert_handle(begin, end); \endcode - * @tparam InputIterator is a input iterator type which points to vertex descriptors + * @tparam InputIterator input iterator type which points to vertex descriptors * @param begin iterators spesifying the range of vertices i.e. [begin, end) * @param end iterators spesifying the range of vertices i.e. [begin, end) * It simply corresponds to: @@ -235,7 +235,7 @@ public: /** * Insert vertices in the range to provided handle group - * @tparam InputIterator is a input iterator type which points to vertex descriptors + * @tparam InputIterator input iterator type which points to vertex descriptors * @param handle_group group to be inserted in * @param begin iterators spesifying the range of vertices [begin, end) * @param end iterators spesifying the range of vertices [begin, end) @@ -279,7 +279,7 @@ public: /** * Insert vertices in the range to region of interest - * @tparam InputIterator is a input iterator type which points to vertex descriptors + * @tparam InputIterator input iterator type which points to vertex descriptors * @param begin iterators spesifying the range of vertices [begin, end) * @param end iterators spesifying the range of vertices [begin, end) */ @@ -337,9 +337,8 @@ public: } } -//#ifdef CGAL_DEFORM_ROTATION template - void operator()(Handle_group handle_group, const Quaternion& quat) + void rotate(Handle_group handle_group, const Quaternion& quat) { Point rotation_center; for(typename Handle_container::iterator it = handle_group->begin(); @@ -361,26 +360,46 @@ public: } } + /** + * Rotate the handle group around rotation center by quaternion + * @tparam Quaternion quaternion type which defines a multiplication operator with Vect as quad * vector + * @tparam Vect vector type 3 param constructable and has operator[] ... + */ template - void operator()(Handle_group handle_group, const Point& rotation_center, const Quaternion& quat, const Vect& translation) + void rotate(Handle_group handle_group, const Point& rotation_center, const Quaternion& quat, const Vect& translation) { for(typename Handle_container::iterator it = handle_group->begin(); it != handle_group->end(); ++it) { size_t v_index = get(vertex_index_map, *it); - std::cout << "----------------------------------------------" << std::endl; - std::cout << "center: " << rotation_center << std::endl; - std::cout << "original: " << original[v_index] << std::endl; + Point p = CGAL::ORIGIN + ( original[v_index] - rotation_center); - std::cout << "not rot: " << p << std::endl; Vect v = quat * Vect(p.x(),p.y(),p.z()); p = Point(v[0], v[1], v[2]) + ( rotation_center - CGAL::ORIGIN); - std::cout << "not rot: " << p << std::endl; p = p + Vector(translation[0],translation[1],translation[2]); + solution[v_index] = p; } } -//#endif // CGAL_DEFORM_ROTATION + + /** + * Assign positions in the range as target positions for the vertices in the handle group + * @tparam InputIterator input iterator type which points to Polyhedron::Traits::Point_3 + * @param handle_group group of target vertices + * @param begin iterators spesifying the range of positions [begin, end) + * @param end iterators spesifying the range of positions [begin, end) + */ + template + void assign(Handle_group handle_group, InputIterator begin, InputIterator end) + { + for(typename Handle_container::iterator it = handle_group->begin(); + (it != handle_group->end()) && (begin != end); + ++it, ++begin) + { + size_t v_index = get(vertex_index_map, *it); + solution[v_index] = *begin; + } + } /** * Reset position of deformed vertices to their original positions (i.e. positions at the time of last preprocess() call)