Changeset 51:0d26d6c7f188 in rrlib_geometry
- Timestamp:
- 25.06.2013 18:48:45 (8 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- curves
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
curves/tBSplineCurve.h
r50 r51 96 96 virtual const unsigned int NumberOfSegments() const; 97 97 98 const std::vector< double> &Knots() const98 const std::vector<typename tSplineCurve::tParameter> &Knots() const 99 99 { 100 100 return this->knots; … … 122 122 private: 123 123 /*! B-spline knot vector (#knots = #control points + degree + 1) */ 124 std::vector< double> knots;124 std::vector<typename tSplineCurve::tParameter> knots; 125 125 /*! Bezier control points used to evaluate b-spline curve which is converted to a set of bezier curves */ 126 std::vector<typename tShape::tPoint> bezier_control_points;126 mutable std::vector<typename tShape::tPoint> bezier_control_point_cache; 127 127 128 128 /*! … … 134 134 * Calculate all Bezier control points by knot insertion, this->bezier_control_points will be modified 135 135 */ 136 void CalculateBezierControlPoints() ;136 void CalculateBezierControlPoints() const; 137 137 138 138 /*! … … 144 144 * @return Control points after knot insertion 145 145 */ 146 st d::vector<typename tShape::tPoint> InsertKnot(int at, const std::vector<double> &knots_before_insertion, double knot, const std::vector<typename tShape::tPoint> &control_points) const;146 static std::vector<typename tShape::tPoint> InsertKnot(int at, const std::vector<typename tSplineCurve::tParameter> &knots_before_insertion, typename tSplineCurve::tParameter knot, const std::vector<typename tShape::tPoint> &control_points); 147 147 148 148 virtual unsigned int GetSegmentForParameter(typename tSplineCurve::tParameter t) const; -
curves/tBSplineCurve.hpp
r50 r51 67 67 { 68 68 this->CalculateKnotVector(); 69 this->CalculateBezierControlPoints();70 69 } 71 70 … … 78 77 std::copy(knots_begin, knots_end, std::back_inserter(this->knots)); 79 78 assert(this->knots.size() == this->ControlPoints().size() + Tdegree + 1); 80 this->CalculateBezierControlPoints();81 79 } 82 80 … … 87 85 { 88 86 this->CalculateKnotVector(); 89 this->CalculateBezierControlPoints();90 87 } 91 88 … … 97 94 { 98 95 unsigned int number_of_segments = 0; 99 doublecurrent_knot = this->knots[0];96 typename tSplineCurve::tParameter current_knot = this->knots[0]; 100 97 for (size_t i = 1; i < this->knots.size(); ++i) 101 98 { … … 109 106 }; 110 107 111 //template<size_t Tdimension, typename TElement, unsigned int Tdegree>112 //void tBSplineCurve<Tdimension, TElement, Tdegree>::AppendControlPoint(const typename tShape::tPoint &point)113 //{114 // tSplineCurve::AppendControlPoint(point);115 // this->CalculateKnotVector();116 // this->CalculateBezierControlPoints();117 //}118 //119 108 //---------------------------------------------------------------------- 120 109 // tBSplineCurve SetChanged … … 125 114 tSplineCurve::SetChanged(); 126 115 this->CalculateKnotVector(); 127 this-> CalculateBezierControlPoints();116 this->bezier_control_point_cache.clear(); 128 117 } 129 118 … … 156 145 157 146 template<size_t Tdimension, typename TElement, unsigned int Tdegree> 158 void tBSplineCurve<Tdimension, TElement, Tdegree>::CalculateBezierControlPoints() 159 { 160 this->bezier_control_point s.clear();161 std::vector< double> new_knots;147 void tBSplineCurve<Tdimension, TElement, Tdegree>::CalculateBezierControlPoints() const 148 { 149 this->bezier_control_point_cache.clear(); 150 std::vector<typename tSplineCurve::tParameter> new_knots; 162 151 new_knots.reserve(this->knots.size() * Tdegree); 163 152 std::copy(this->knots.begin(), this->knots.end(), std::back_inserter(new_knots)); 164 std::copy(this->ControlPoints().begin(), this->ControlPoints().end(), std::back_inserter(this->bezier_control_point s));165 166 doubleknot = new_knots[0];153 std::copy(this->ControlPoints().begin(), this->ControlPoints().end(), std::back_inserter(this->bezier_control_point_cache)); 154 155 typename tSplineCurve::tParameter knot = new_knots[0]; 167 156 unsigned int multiplicity = 1; 168 157 169 for ( std::vector<double>::iteratorit = (++new_knots.begin()); it < new_knots.end(); ++it)158 for (auto it = (++new_knots.begin()); it < new_knots.end(); ++it) 170 159 { 171 160 if (knot == *it) … … 179 168 for (unsigned int s = multiplicity; s < Tdegree; s++) 180 169 { 181 this->bezier_control_point s = InsertKnot((it - new_knots.begin()) - multiplicity, new_knots, knot, this->bezier_control_points);170 this->bezier_control_point_cache = InsertKnot((it - new_knots.begin()) - multiplicity, new_knots, knot, this->bezier_control_point_cache); 182 171 new_knots.insert(it, knot); 183 172 } … … 194 183 195 184 template<size_t Tdimension, typename TElement, unsigned int Tdegree> 196 std::vector<typename tBSplineCurve<Tdimension, TElement, Tdegree>::tShape::tPoint> tBSplineCurve<Tdimension, TElement, Tdegree>::InsertKnot(int at, const std::vector<double> &knots_before_insertion, double knot, const std::vector < 197 typename tShape::tPoint > &control_points) const 185 std::vector<typename tBSplineCurve<Tdimension, TElement, Tdegree>::tShape::tPoint> tBSplineCurve<Tdimension, TElement, Tdegree>::InsertKnot(int at, const std::vector<typename tSplineCurve::tParameter> &knots_before_insertion, typename tSplineCurve::tParameter knot, const std::vector<typename tShape::tPoint> &control_points) 198 186 { 199 187 std::vector<typename tShape::tPoint> new_control_points; … … 206 194 for (int i = at - Tdegree + 1; i <= at; i++) 207 195 { 208 doublea = (knot - knots_before_insertion[i]) / (knots_before_insertion[i + Tdegree] - knots_before_insertion[i]);196 typename tSplineCurve::tParameter a = (knot - knots_before_insertion[i]) / (knots_before_insertion[i + Tdegree] - knots_before_insertion[i]); 209 197 new_control_points.push_back((1 - a) * control_points[i - 1] + a * control_points[i]); 210 198 } … … 250 238 std::shared_ptr<const typename tSplineCurve<Tdimension, TElement, Tdegree>::tBezierCurve> tBSplineCurve<Tdimension, TElement, Tdegree>::CreateBezierCurveForSegment(unsigned int i) const 251 239 { 240 if (this->bezier_control_point_cache.empty()) 241 { 242 this->CalculateBezierControlPoints(); 243 } 252 244 std::vector<typename tShape::tPoint> segment_control_points; 253 std::copy(this->bezier_control_point s.begin() + i * Tdegree, this->bezier_control_points.begin() + i * Tdegree + Tdegree + 1, std::back_inserter(segment_control_points));245 std::copy(this->bezier_control_point_cache.begin() + i * Tdegree, this->bezier_control_point_cache.begin() + i * Tdegree + Tdegree + 1, std::back_inserter(segment_control_points)); 254 246 return std::shared_ptr<const typename tSplineCurve::tBezierCurve>(new typename tSplineCurve::tBezierCurve(segment_control_points.begin(), segment_control_points.end())); 255 247 } … … 278 270 size_t number_of_knots; 279 271 stream >> number_of_knots; 280 doubleknots[number_of_knots];272 typename tSplineCurve<Tdimension, TElement, Tdegree>::tParameter knots[number_of_knots]; 281 273 for (size_t i = 0; i < number_of_knots; ++i) 282 274 { -
curves/tSplineCurve.hpp
r49 r51 72 72 static_assert(Tdegree > 0, "The degree of spline curves must be greater than zero"); 73 73 assert(control_points.size() > Tdegree && "A spline curve needs at least degree + 1 control points"); 74 this->bezier_curve_cache.resize(this->NumberOfSegments());75 74 } 76 75 … … 82 81 std::copy(begin, end, std::back_inserter(this->control_points)); 83 82 assert(control_points.size() > Tdegree && "A spline curve needs at least degree + 1 control points"); 84 this->bezier_curve_cache.resize(this->NumberOfSegments());85 83 } 86 84 … … 92 90 static_assert(sizeof...(rest) + 2 > Tdegree, "A spline curve needs at least degree + 1 control points"); 93 91 util::ProcessVariadicValues<typename tShape::tPoint>([this](const typename tShape::tPoint & x) mutable { this->control_points.push_back(x); }, p1, p2, rest...); 94 this->bezier_curve_cache.resize(this->NumberOfSegments());95 92 } 96 93 … … 123 120 this->control_points.push_back(point); 124 121 this->SetChanged(); 125 this->bezier_curve_cache.emplace_back();126 122 }; 127 123 … … 135 131 this->control_points.insert(this->control_points.begin() + position, point); 136 132 this->SetChanged(); 137 this->bezier_curve_cache.emplace_back();138 133 }; 139 134 … … 184 179 { 185 180 assert(i < this->NumberOfSegments()); 186 assert(this->bezier_curve_cache.size() ==this->NumberOfSegments());181 this->bezier_curve_cache.resize(this->NumberOfSegments()); 187 182 if (!this->bezier_curve_cache[i]) 188 183 {
Note: See TracChangeset
for help on using the changeset viewer.