Blender  V3.3
Bezier.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
8 #include "Bezier.h"
9 #include "FitCurve.h"
10 
11 using namespace std;
12 
13 namespace Freestyle {
14 
15 BezierCurveSegment::~BezierCurveSegment() = default;
16 
17 void BezierCurveSegment::AddControlPoint(const Vec2d &iPoint)
18 {
19  _ControlPolygon.push_back(iPoint);
20  if (_ControlPolygon.size() == 4) {
21  Build();
22  }
23 }
24 
25 void BezierCurveSegment::Build()
26 {
27  if (_ControlPolygon.size() != 4) {
28  return;
29  }
30 
31  // Compute the rightmost part of the matrix:
32  vector<Vec2d>::const_iterator p0, p1, p2, p3;
33  p0 = _ControlPolygon.begin();
34  p1 = p0;
35  ++p1;
36  p2 = p1;
37  ++p2;
38  p3 = p2;
39  ++p3;
40  float x[4], y[4];
41 
42  x[0] = -p0->x() + 3 * p1->x() - 3 * p2->x() + p3->x();
43  x[1] = 3 * p0->x() - 6 * p1->x() + 3 * p2->x();
44  x[2] = -3 * p0->x() + 3 * p1->x();
45  x[3] = p0->x();
46 
47  y[0] = -p0->y() + 3 * p1->y() - 3 * p2->y() + p3->y();
48  y[1] = 3 * p0->y() - 6 * p1->y() + 3 * p2->y();
49  y[2] = -3 * p0->y() + 3 * p1->y();
50  y[3] = p0->y();
51 
52  int nvertices = 12;
53  float increment = 1.0 / (float)nvertices;
54  float t = 0.0f;
55  for (int i = 0; i <= nvertices; ++i) {
56  _Vertices.emplace_back((x[3] + t * (x[2] + t * (x[1] + t * x[0]))),
57  (y[3] + t * (y[2] + t * (y[1] + t * y[0]))));
58  t += increment;
59  }
60 }
61 
63 {
64  _currentSegment = new BezierCurveSegment;
65 }
66 
67 BezierCurve::BezierCurve(vector<Vec2d> &iPoints, double error)
68 {
69  FitCurveWrapper fitcurve;
70  _currentSegment = new BezierCurveSegment;
71  vector<Vec2d> curve;
72 
73  fitcurve.FitCurve(iPoints, curve, error);
74  int i = 0;
75  vector<Vec2d>::iterator v, vend;
76  for (v = curve.begin(), vend = curve.end(); v != vend; ++v) {
77  if ((i == 0) || (i % 4 != 0)) {
78  AddControlPoint(*v);
79  }
80  ++i;
81  }
82 }
83 
84 BezierCurve::~BezierCurve()
85 {
86  if (!_Segments.empty()) {
87  vector<BezierCurveSegment *>::iterator v, vend;
88  for (v = _Segments.begin(), vend = _Segments.end(); v != vend; ++v) {
89  delete *v;
90  }
91  }
92  delete _currentSegment;
93 }
94 
95 void BezierCurve::AddControlPoint(const Vec2d &iPoint)
96 {
97  _ControlPolygon.push_back(iPoint);
98  _currentSegment->AddControlPoint(iPoint);
99  if (_currentSegment->size() == 4) {
100  _Segments.push_back(_currentSegment);
101  _currentSegment = new BezierCurveSegment;
102  _currentSegment->AddControlPoint(iPoint);
103  }
104 }
105 
106 } /* namespace Freestyle */
typedef float(TangentPoint)[2]
Class to define a Bezier curve of order 4.
An Algorithm for Automatically Fitting Digitized Curves by Philip J. Schneider,.
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
ATTR_WARN_UNUSED_RESULT const BMVert * v
void AddControlPoint(const Vec2d &iPoint)
Definition: Bezier.cpp:17
void FitCurve(std::vector< Vec2d > &data, std::vector< Vec2d > &oCurve, double error)
Definition: FitCurve.cpp:463
Curve curve
static void error(const char *str)
Definition: meshlaplacian.c:51
inherits from class Rep
Definition: AppCanvas.cpp:18
Vector2 * BezierCurve
Definition: FitCurve.cpp:19