LibreCAD
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
geospline.cpp
Go to the documentation of this file.
1 #include "geospline.h"
2 
3 using namespace lc;
4 using namespace geo;
5 
6 const std::vector<Coordinate> &Spline::controlPoints() const {
7  return _controlPoints;
8 }
9 
10 bool Spline::closed() const {
11  return _closed;
12 }
13 
14 short Spline::degree() const {
15  return _degree;
16 }
17 
18 const std::vector<double> &Spline::knotPoints() const {
19  return _knotPoints;
20 }
21 
22 const std::vector<Coordinate> &Spline::fitPoints() const {
23  return _fitPoints;
24 }
25 
26 
27 double Spline::startTanX() const {
28  return _sTanX;
29 }
30 
31 double Spline::startTanY() const {
32  return _sTanY;
33 }
34 
35 double Spline::startTanZ() const {
36  return _sTanZ;
37 
38 }
39 
40 double Spline::endTanX() const {
41  return _eTanX;
42 }
43 
44 double Spline::endTanY() const {
45  return _eTanY;
46 }
47 
48 double Spline::endTanZ() const {
49  return _eTanZ;
50 }
51 
52 double Spline::nX() const {
53  return _nX;
54 }
55 double Spline::nY() const {
56  return _nY;
57 }
58 double Spline::nZ() const {
59  return _nZ;
60 }
62  return _flags;
63 }
64 double Spline::fitTolerance() const {
65  return _fitTolerance;
66 }
67 
69  /* TODO implement
70  * fix compiler warning
71  */
72  return Coordinate();
73 }
75  /* TODO implement
76  * fix compiler warning
77  */
78  return Coordinate();
79 }
80 
82  try {
83  auto nbControlPoints = _controlPoints.size();
84 
85  _splineCurve = ts::BSpline(degree(), 3, nbControlPoints, TS_CLAMPED);
86 
87  //Set control points
88  std::vector<ts::rational> ts_controlPoints;
89  for (auto cp : _controlPoints) {
90  ts_controlPoints.push_back(cp.x());
91  ts_controlPoints.push_back(cp.y());
92  ts_controlPoints.push_back(cp.z());
93  }
94 
95  _splineCurve.setCtrlp(ts_controlPoints);
96  }
97  catch (std::runtime_error e) {
99  }
100 }
101 
102 const std::vector<BB_CSPtr> Spline::beziers() const {
103  return _beziers;
104 }
105 
106 /*
107  * Need to be updated to return bezier objects instead of returning coordinate vectors.
108  * No external need to cast to bezier and then find intersections.
109  */
111  auto beziers = _splineCurve.toBeziers();
112 
113  int nbBeziers = beziers.nCtrlp() / _splineCurve.order();
114  int nbCoordinate = _splineCurve.order() * _splineCurve.dim();
115 
116  if(_splineCurve.deg() == 2) {
117  for (int i = 0; i < nbBeziers; i++) {
118  std::vector<geo::Coordinate> bez;
119 
120  auto j = nbCoordinate * i;
121  auto end = nbCoordinate * (i+1);
122 
123  while(j < end) {
124  lc::geo::Coordinate cp(beziers.ctrlp()[j], beziers.ctrlp()[j+1], beziers.ctrlp()[j+2]);
125  bez.push_back(cp);
126  j = j + 3;
127  }
128 
129  _beziers.push_back(std::make_shared<Bezier>(bez.at(0),bez.at(1),bez.at(2)));
130  }
131  } else if(_splineCurve.deg() == 3) {
132  for (int i = 0; i < nbBeziers; i++) {
133  std::vector<geo::Coordinate> bez;
134 
135  auto j = nbCoordinate * i;
136  auto end = nbCoordinate * (i+1);
137 
138  while(j < end) {
139  lc::geo::Coordinate cp(beziers.ctrlp()[j], beziers.ctrlp()[j+1], beziers.ctrlp()[j+2]);
140  bez.push_back(cp);
141 
142  j = j + 3;
143  }
144 
145  _beziers.push_back(std::make_shared<CubicBezier>(bez.at(0),bez.at(1),bez.at(2),bez.at(3)));
146  }
147  }
148 }
149 
151  for(const auto & bez : _beziers) {
152  if(bez->boundingBox().inArea(c)) {
153 
154  }
155  }
156 }
const double _sTanZ
Definition: geospline.h:136
splineflag flags() const
Definition: geospline.cpp:61
const splineflag _flags
Definition: geospline.h:148
double startTanY() const
Definition: geospline.cpp:31
const double _eTanX
Definition: geospline.h:138
double startTanZ() const
Definition: geospline.cpp:35
size_t dim() const
const std::vector< Coordinate > _controlPoints
Definition: geospline.h:125
BSpline toBeziers() const
size_t deg() const
short degree() const
degree, Returns degree of spline
Definition: geospline.cpp:14
std::vector< BB_CSPtr > _beziers
Definition: geospline.h:147
double fitTolerance() const
Returns the fit point tolerance of the spline.
Definition: geospline.cpp:64
double endTanX() const
Definition: geospline.cpp:40
const double _nX
Definition: geospline.h:142
const double _eTanZ
Definition: geospline.h:140
const double _sTanX
Definition: geospline.h:134
const double _nZ
Definition: geospline.h:144
void populateCurve()
Fills the opennurbs curve with the data from spline constructor.
Definition: geospline.cpp:81
void trimAtPoint(const geo::Coordinate &c)
Definition: geospline.cpp:150
const double _fitTolerance
Definition: geospline.h:132
size_t order() const
Coordinate nearestPointOnEntity(const Coordinate &coord) const
returns the nearest Point On Entity itself.
Definition: geospline.cpp:74
const std::vector< Coordinate > _fitPoints
Definition: geospline.h:127
ts::BSpline _splineCurve
Definition: geospline.h:146
double nX() const
Definition: geospline.cpp:52
bool closed() const
closed, returns if spline is closed or not
Definition: geospline.cpp:10
void setCtrlp(const std::vector< rational > ctrlp)
const std::vector< BB_CSPtr > beziers() const
Definition: geospline.cpp:102
const short _degree
Definition: geospline.h:129
Definition: cadentity.h:12
double endTanY() const
Definition: geospline.cpp:44
double nZ() const
Definition: geospline.cpp:58
const double _sTanY
Definition: geospline.h:135
const bool _closed
Definition: geospline.h:130
Coordinate nearestPointOnPath(const Coordinate &coord) const
returns the nearest Point On Path
Definition: geospline.cpp:68
double nY() const
Definition: geospline.cpp:55
const std::vector< double > & knotPoints() const
Return a vector of knotpoints.
Definition: geospline.cpp:18
double endTanZ() const
Definition: geospline.cpp:48
const double _eTanY
Definition: geospline.h:139
const double _nY
Definition: geospline.h:143
const std::vector< Coordinate > & fitPoints() const
Return a vector of fitpoints.
Definition: geospline.cpp:22
void generateBeziers()
Definition: geospline.cpp:110
const std::vector< Coordinate > & controlPoints() const
control_points, Returns Control points of spline
Definition: geospline.cpp:6
const std::vector< double > _knotPoints
Definition: geospline.h:126
double startTanX() const
Definition: geospline.cpp:27