This example shows how to create/evaluate several types of curves and curve fitting/interpolation methods in Easy3D.
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>
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) {
46 indices.push_back(i + 1);
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);
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);
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);
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);
75int main(
int argc,
char** argv) {
81 Viewer viewer(EXAMPLE_TITLE);
84 std::vector<vec2> points = {
92 create_drawable(viewer, points,
vec3(0, 0, 0));
94 const int resolution = 100;
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));
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);
111 create_drawable(viewer, curve_points,
vec3(0, 1, 1));
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);
125 create_drawable(viewer, curve_points,
vec3(1, 0, 1));
Class for BSpline curve fitting.
Definition curve.h:293
std::vector< Point_t > generate(const std::vector< Point_t > &control_points, size_t num_samples) const override
Generates a curve based on the given control points.
Definition curve.h:307
Class for Bezier curve fitting.
Definition curve.h:238
std::vector< Point_t > generate(const std::vector< Point_t > &control_points, size_t num_samples) const override
Generates a curve based on the given control points.
Definition curve.h:252
Class for CatmullRom curve interpolation.
Definition curve.h:368
std::vector< Point_t > generate(const std::vector< Point_t > &control_points, size_t num_samples) const override
Generates a curve based on the given control points.
Definition curve.h:382
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
Definition collider.cpp:182
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