File: shape_deformation.cpp

package info (click to toggle)
cgal 6.1.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 144,952 kB
  • sloc: cpp: 811,597; ansic: 208,576; sh: 493; python: 411; makefile: 286; javascript: 174
file content (65 lines) | stat: -rw-r--r-- 2,581 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Barycentric_coordinates_2/Delaunay_domain_2.h>
#include <CGAL/Barycentric_coordinates_2/Harmonic_coordinates_2.h>

// Typedefs.
using Kernel      = CGAL::Exact_predicates_inexact_constructions_kernel;
using FT          = Kernel::FT;
using Point_2     = Kernel::Point_2;
using Point_range = std::vector<Point_2>;

using Domain =
  CGAL::Barycentric_coordinates::Delaunay_domain_2<Point_range, Kernel>;
using Harmonic_coordinates_2 =
  CGAL::Barycentric_coordinates::Harmonic_coordinates_2<Point_range, Domain, Kernel>;

int main() {

  // Construct the source and target shapes.
  // The number of vertices in both shapes must be equal.
  const std::vector<Point_2> source_shape = {
    Point_2(1, 0), Point_2(2, 0), Point_2(3, 3), Point_2(4, 0), Point_2(5, 0),
    Point_2(4, 3), Point_2(4, 5), Point_2(5, 4), Point_2(5, 5), Point_2(4, 6),
    Point_2(2, 6), Point_2(1, 5), Point_2(1, 4), Point_2(2, 5), Point_2(2, 3)
  };
  const std::vector<Point_2> target_shape = {
    Point_2(2, 0), Point_2(3, 0), Point_2(3, 3), Point_2(3, 0), Point_2(4, 0),
    Point_2(4, 3), Point_2(4, 5), Point_2(5, 6), Point_2(5, 7), Point_2(4, 6),
    Point_2(2, 6), Point_2(1, 7), Point_2(1, 6), Point_2(2, 5), Point_2(2, 3)
  };
  assert(target_shape.size() == source_shape.size());

  // Use seeds to mark the interior part of the source shape.
  const std::vector<Point_2> seeds = { Point_2(3, 5) };

  // Construct a Delaunay domain.
  const FT max_edge_length = FT(1) / FT(3);
  Domain domain(source_shape);
  domain.create(max_edge_length, seeds);

  // Use it to store coordinates.
  std::vector< std::vector<FT> > coordinates;
  coordinates.reserve(domain.number_of_vertices());

  // Compute harmonic coordinates at the vertices of the
  // discretized interior domain of the source shape.
  Harmonic_coordinates_2 harmonic_coordinates_2(source_shape, domain);
  harmonic_coordinates_2.compute();
  harmonic_coordinates_2(std::back_inserter(coordinates));

  // Deform the source domain into the target domain.
  // We output only the first 20 results.
  std::cout << std::endl << "shape deformation: " << std::endl << std::endl;

  for (std::size_t k = 0; k < 20; ++k) {
    FT x = FT(0), y = FT(0);
    for (std::size_t i = 0; i < coordinates[k].size(); ++i) {
      x += coordinates[k][i] * target_shape[i].x();
      y += coordinates[k][i] * target_shape[i].y();
    }
    std::cout << "deformed domain vertex: (" << x << ", " << y << ")" << std::endl;
  }
  std::cout << std::endl;

  return EXIT_SUCCESS;
}