This example shows how to create/evaluate several types of curves and curve fitting/interpolation methods in Easy3D.
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#include <easy3d/viewer/viewer.h>
28#include <easy3d/core/curve.h>
29#include <easy3d/core/spline_curve_fitting.h>
30#include <easy3d/core/spline_curve_interpolation.h>
31#include <easy3d/renderer/drawable_lines_2D.h>
32#include <easy3d/util/initializer.h>
33
39
41
42void create_drawable(
Viewer& viewer,
const std::vector<vec2>& curve_points,
const vec3& color) {
43 std::vector<unsigned int> indices;
44 for (unsigned int i = 0; i < curve_points.size() - 1; ++i) {
45 indices.push_back(i);
46 indices.push_back(i + 1);
47 }
48
50 drawable->update_vertex_buffer(curve_points, viewer.width(), viewer.height());
51 drawable->update_element_buffer(indices);
52 drawable->set_uniform_coloring(
vec4(color, 1.0f));
53 viewer.add_drawable(drawable);
54}
55
56void add_Bezier(
Viewer& viewer,
const std::vector<vec2>& control_points,
int bezier_steps,
const vec3& color) {
58 const auto curve_points =
curve.generate(control_points, bezier_steps);
59 create_drawable(viewer, curve_points, color);
60}
61
62void add_BSpline(
Viewer& viewer,
const std::vector<vec2>& control_points,
int bezier_steps,
const vec3& color) {
64 const auto curve_points =
curve.generate(control_points, bezier_steps);
65 create_drawable(viewer, curve_points, color);
66}
67
68void add_CatmullRom(
Viewer& viewer,
const std::vector<vec2>& control_points,
int bezier_steps,
const vec3& color) {
70 const auto curve_points =
curve.generate(control_points, bezier_steps);
71 create_drawable(viewer, curve_points, color);
72}
73
74
75int main(int argc, char** argv) {
76
78
79
80
81 Viewer viewer(EXAMPLE_TITLE);
82
83
84 std::vector<vec2> points = {
91 };
92 create_drawable(viewer, points,
vec3(0, 0, 0));
93
94 const int resolution = 100;
95
96 add_Bezier(viewer, points, resolution,
vec3(1, 0, 0));
97 add_BSpline(viewer, points, resolution,
vec3(0, 1, 0));
98 add_CatmullRom(viewer, points, resolution,
vec3(0, 0, 1));
99
100 {
101
102 const int order = 3;
104 Fitter fitter(order, Fitter::eOPEN_UNIFORM);
105 fitter.set_ctrl_points(points);
106 std::vector<vec2> curve_points;
107 for(int i = 0; i < resolution; ++i) {
108 const vec2 p = fitter.eval_f(
static_cast<float>(i) /
static_cast<float>(resolution - 1) );
109 curve_points.push_back(p);
110 }
111 create_drawable(viewer, curve_points,
vec3(0, 1, 1));
112 }
113
114 {
115
117 Interpolator interpolator;
118 interpolator.
set_boundary(Interpolator::second_deriv, 0, Interpolator::second_deriv, 0);
119 interpolator.set_points(points);
120 std::vector<vec2> curve_points;
121 for (int i = 0; i < resolution; ++i) {
122 const vec2 p = interpolator.eval_f(
static_cast<float>(i) /
static_cast<float>(resolution - 1));
123 curve_points.push_back(p);
124 }
125 create_drawable(viewer, curve_points,
vec3(1, 0, 1));
126 }
127
128
129 return viewer.run();
130}
Class for BSpline curve fitting.
Definition curve.h:293
Class for Bezier curve fitting.
Definition curve.h:238
Class for CatmullRom curve interpolation.
Definition curve.h:368
The drawable for rendering a set of line segments in the screen space.
Definition drawable_lines_2D.h:43
Spline curve fitting for arbitrary dimensions.
Definition spline_curve_fitting.h:65
Cubic spline curve interpolation for arbitrary dimensions.
Definition spline_curve_interpolation.h:64
void set_boundary(BoundaryType left, T left_value, BoundaryType right, T right_value)
Definition spline_curve_interpolation.h:137
The built-in Easy3D viewer.
Definition viewer.h:63
Algorithms for evaluating curves.
Definition collider.cpp:182
Vec< 3, float > vec3
A 3D point/vector of float type.
Definition types.h:44
void initialize(bool info_to_stdout, bool use_log_file, bool use_setting_file, const std::string &resource_dir)
Initialization of Easy3D.
Definition initializer.cpp:39
Vec< 4, float > vec4
A 4D point/vector of float type.
Definition types.h:46
Vec< 2, float > vec2
A 2D point/vector of float type.
Definition types.h:42