27#ifndef INC_CINOSNURBSCURVE_H
28#define INC_CINOSNURBSCURVE_H
33#define DF_INOS_NURBSCURVE_UNDIFINED_SEG_INDEX 0xFFFFFFFF
46#include <inosstdtypes.h>
48#include <cinosspline.h>
60static constexpr double BinCoeff[6 * 6] = {
61 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
62 1.0, 1.0, 0.0, 0.0, 0.0, 0.0,
63 1.0, 2.0, 1.0, 0.0, 0.0, 0.0,
64 1.0, 3.0, 3.0, 1.0, 0.0, 0.0,
65 1.0, 4.0, 6.0, 5.0, 1.0, 0.0,
66 1.0, 5.0, 10.0, 10.0, 5.0, 1.0
100 for (uint32
i=0;
i<
N;
i++) {
130 return (uint32)
P.size();
153 if (
P.size() < (
D+1)) {
157 D = (
int)(
P.size() - 1);
179 for (uint32
i=1;
i<(
P.size()-
D);
i++) {
186 if (
U.size() != (
P.size()+
D+1)) {
198 static constexpr double d43 = 4.0/3.0;
199 static constexpr double d13 = 1.0/3.0;
210 if((
m_uFlags & eFlgCurveValid) == 0) {
219 m_sPreviousCache[0].m_uPSpan = 0;
220 m_sPreviousCache[0].m_uSplineIndex = 1;
221 m_sPreviousCache[0].m_uUSpan =
D;
222 m_sPreviousCache[0].m_uSegment = 0;
223 m_sPreviousCache[0].m_dDistanceSegBeg = -1.0;
224 m_sPreviousCache[0].m_dDistanceSegEnd = -1.0;
225 m_sPreviousCache[0].m_dP = 0.0;
234 uint32
uNoP = (uint32)
P.size();
237 m_UofPs.resize(
uNoP - 1,
nullptr);
241 if(
uNoP == 2 &&
P[0] ==
P[1]) {
252 Spline->SetPoint(0, 0.0, 0.0);
254 Spline->SetPoint(1, 1.0, 0.0);
284 const double du_2 =
du * 0.5;
371 CINOSSpline::eBt1stDeriv,
vSEnd,
false);
387 double u = GetLocalU(
adP, 0);
396 double u = GetLocalU(
adP, 0);
421 m_sPreviousCache[0].m_uUSpan =
D;
423 else if(
adU>=
U[
P.size()]) {
424 m_sPreviousCache[0].m_uUSpan = (uint32)(
P.size()-1);
426 else if(m_sPreviousCache[0].m_uPSpan == DF_INOS_NURBSCURVE_UNDIFINED_SEG_INDEX) {
429 else if(
adU >=
U[m_sPreviousCache[0].m_uUSpan + 1]) {
431 m_sPreviousCache[0].m_uUSpan++;
433 while(
adU >=
U[m_sPreviousCache[0].m_uUSpan + 1]);
435 else if(
adU <
U[m_sPreviousCache[0].m_uUSpan]) {
437 m_sPreviousCache[0].m_uUSpan--;
439 while(
adU <
U[m_sPreviousCache[0].m_uUSpan]);
459 if (!(
m_uFlags & eFlgCustomWeight)) {
461 for(uint32
i=0;
i<=
D;
i++) {
468 for(uint32
i=0;
i<=
D;
i++) {
510 else if (
adU <
U.front())
adU =
U.front();
530 for(
int i = 0;
i <
N;
i++) {
542 for(
int i = 0;
i <
N;
i++) {
587 for(
int i = 0;
i <
N;
i++) {
606 double u =
U.front();
614 for (uint32
i=0;
i<
N;
i++){
646 uint32
u = m_UofPs.size();
670 m_sPreviousCache[
auChannel].m_uPSpan = 0;
671 m_sPreviousCache[
auChannel].m_uSplineIndex = 1;
675 m_sPreviousCache[
auChannel].m_uPSpan = (uint32)(m_UofPs.size() - 1);
679 if(m_sPreviousCache[
auChannel].m_uPSpan == DF_INOS_NURBSCURVE_UNDIFINED_SEG_INDEX) {
683 uint32
u = (uint32)m_UofPs.size();
707 m_sPreviousCache[
auChannel].m_uSplineIndex = 1;
718 return m_UofPs[m_sPreviousCache[
auChannel].m_uPSpan]->
739 for(uint32
uD = 0;
uD<
N;
uD++) {
747 memset(&m_sPreviousCache, 0,
sizeof(m_sPreviousCache));
748 for (uint32
i=0;
i<eCnsMaxChannels;
i++) {
749 m_sPreviousCache[
i].m_uPSpan = DF_INOS_NURBSCURVE_UNDIFINED_SEG_INDEX;
751 m_sPreviousCache[
i].m_uSegment = 0;
752 m_sPreviousCache[
i].m_dDistanceSegBeg = -1.0;
753 m_sPreviousCache[
i].m_dDistanceSegEnd = -1.0;
754 m_sPreviousCache[
i].m_dP = 0.0;
761 for(
auto spline : m_UofPs) {
775 return (uint32)(
P.size()-1) ;
798 for(uint32
j=1;
j<=
D ;
j++){
802 for(uint32
r=0 ;
r<
j;
r++){
835 for(
int j=(
int)
D;
j>=0;--
j)
881 for(
int j=(
int)
D;
j>=0;--
j)
894 for (uint32
k=
D+1;
k<=
d;
k++)
ck[
k] = 0.0;
905 for(
int k=
du;
k>=0;--
k){
916 for(uint32
k= 0;
k<=
d;
k++) {
918 for(uint32
i=1;
i<=
k;
i++)
924 for(
int k=
du;
k>=0;--
k){
939 if (
cnl.m_dDistanceSegEnd<0.0){
948 if (
cnl.m_uSegment <
P.size()-2) {
951 cnl.m_dDistanceSegEnd =
958 cnl.m_dDistanceSegBeg =
cnl.m_dDistanceSegEnd;
960 cnl.m_dDistanceSegEnd =
965 cnl.m_dDistanceSegBeg =
971 cnl.m_dDistanceSegBeg =
978 if (
cnl.m_uSegment > 0) {
981 cnl.m_dDistanceSegBeg =
988 cnl.m_dDistanceSegEnd =
cnl.m_dDistanceSegBeg;
1006 return cnl.m_uSegment;
1014 eFlgPrepared = 0x00000001,
1015 eFlgCustomWeight = 0x00000002,
1016 eFlgZeroWeight = 0x00000004,
1017 eFlgCurveValid = 0x00000008,
1020 eCnsMaxChannels = 4,
1032 double m_dLength = std::numeric_limits<double>::quiet_NaN();
1034 inos_std::vector<CINOSNurbsPoint<N>>
P;
1036 inos_std::vector<double>
U;
1062 } m_sPreviousCache[eCnsMaxChannels];
1064 inos_std::vector<CINOSSpline*> m_UofPs;
The CINOSNurbsPoint class.
#define DECLARE_DYNAMIC_N(aClass, aN)
Definition cinospartitionmemory.h:338
#define IMPLEMENT_DYNAMIC_N(aClass, aN)
Definition cinospartitionmemory.h:373
Definition cinosmcmodule.h:1900
Definition cinosmovepath.h:566
Definition cinosnurbscurve.h:70
TINOSVector< N > _array_vector[DF_INOS_NURBSCURVE_MAX_DEGREE+1]
get auLevel derivative at param 'adU' (The NURBS book, page 93, A3.2)
Definition cinosnurbscurve.h:505
virtual void GetPositionLast(TINOSVector< N > &ovPos)
get last position
Definition cinosnurbscurve.h:411
void AddPoint(TINOSVector< N > &aPoint)
add control point to curve
Definition cinosnurbscurve.h:96
void BasisFuns(double u, uint32 i, _vector &Nb) const
compute the nonvanishing basis functions (The NURBS book, page 70, A2.2)
Definition cinosnurbscurve.h:792
void DersBasisFuns(uint32 n, double u, uint32 span, _matrix &ders) const
compute nonzero basis functions and their derivatives (The NURBS book, page 72, A2....
Definition cinosnurbscurve.h:812
uint32 m_uFlags
flags
Definition cinosnurbscurve.h:1024
virtual void GetD2max(TINOSVector< N > &ovD2Max)
get max. second derivative over the whole curve
Definition cinosnurbscurve.h:603
uint8 m_uNoLengthDims
numeber of length relevant dimensions
Definition cinosnurbscurve.h:1041
virtual void GetDerivativeEnd(uint32 auLevel, TINOSVector< N > &ovDer)
get auLevel derivative at curve end
Definition cinosnurbscurve.h:497
void GetPositionU(double adU, TINOSVector< N > &ovPos)
get position at param 'adU' (The NURBS book, page 124, A4.1)
Definition cinosnurbscurve.h:446
double GetLength()
get curve length
Definition cinosnurbscurve.h:202
uint32 m_uInterpolationPoints
curve interpolation points
Definition cinosnurbscurve.h:1030
uint8 m_uLengthDims[N]
length relevant dimensions indices
Definition cinosnurbscurve.h:1039
virtual void GetPositionFirst(TINOSVector< N > &ovPos)
get first position
Definition cinosnurbscurve.h:404
void CurveDerivs(double u, uint32 d, _array_vector &ck)
compute curve derivatives (The NURBS book, page 93, A3.2)
Definition cinosnurbscurve.h:889
uint32 Check()
check curve
Definition cinosnurbscurve.h:141
virtual void GetDerivativeBgn(uint32 auLevel, TINOSVector< N > &ovDer)
get auLevel derivative at curve begin
Definition cinosnurbscurve.h:490
inos_std::vector< double > U
knot vector
Definition cinosnurbscurve.h:1036
virtual void GetD3max(TINOSVector< N > &ovD3Max)
get max. 3rd derivative over the whole curve
Definition cinosnurbscurve.h:628
double GetGlobalU(double adP)
approximately project P tu U
Definition cinosnurbscurve.h:635
virtual void GetPosition(double adP, TINOSVector< N > &ovPos, uint32 &auSegment)
get position at 'adP'
Definition cinosnurbscurve.h:393
void AddKnot(double adKnot, uint32 auMultiplicity)
add knot to curve
Definition cinosnurbscurve.h:108
void GetLocalPositionU(double adU, TINOSVector< N > &ovPos)
get position at param 'adU' (The NURBS book, page 124, A4.1)
Definition cinosnurbscurve.h:418
inos_std::vector< CINOSNurbsPoint< N > > P
control points
Definition cinosnurbscurve.h:1034
CINOSNurbsCurve(uint32 auDegree=DF_INOS_NURBSCURVE_MAX_DEGREE, uint32 auInterpolationPoints=DF_INOS_NURBSCURVE_INTERPOLATION_POINTS, uint32 auLengthMask=0xFFFFFFF8)
constructor
Definition cinosnurbscurve.h:729
virtual ~CINOSNurbsCurve()
destructor
Definition cinosnurbscurve.h:759
void AddPoint(CINOSNurbsPoint< N > &aPoint)
add control point to curve
Definition cinosnurbscurve.h:77
void SetPoints(uint32 auPoints)
set number of control points
Definition cinosnurbscurve.h:120
double m_dLength
curve length
Definition cinosnurbscurve.h:1032
uint32 D
curve degree
Definition cinosnurbscurve.h:1026
virtual void GetDerivative(uint32 auLevel, double adP, TINOSVector< N > &ovDer)
get auLevel derivative at 'adP'
Definition cinosnurbscurve.h:481
uint32 FindSpan(double u) const
determine the knot span index (The NURBS book, page 68, A2.1)
Definition cinosnurbscurve.h:772
const uint32 m_uLengthMask
length mask (bit = 1 -> axis is not length relevant)
Definition cinosnurbscurve.h:1028
virtual void GetPositionU(double adU, TINOSVector< N > &ovPos, uint32 auUSpan)
get position at param 'adU' (The NURBS book, page 124, A4.1)
Definition cinosnurbscurve.h:452
void SetInterpolationPoints(uint32 auInterpolationPoints)
set number of interpolation points
Definition cinosnurbscurve.h:134
uint32 GetPoints()
get number of control points
Definition cinosnurbscurve.h:127
virtual void GetPosition(double adP, TINOSVector< N > &ovPos)
get position at 'adP'
Definition cinosnurbscurve.h:384
#define DF_INOS_NURBSCURVE_INTERPOLATION_POINTS
Definition inosdefault.h:188
#define DF_INOS_NURBSCURVE_MAX_DEGREE
Definition inosdefault.h:180
uint32 INOS_OK
Definition inoserror.h:1677
uint32 INOS_MOVEPATH_ERROR_NURBS_RELEVANT_LENGTH_ZERO
Definition inoserror.h:1677
uint32 INOS_MOVEPATH_ERROR_NURBS_ALL_WEIGHTS_ZERO
Definition inoserror.h:1677
uint32 INOS_MOVEPATH_ERROR_NURBS_NUMBER_OF_KNOTS_INVALID
Definition inoserror.h:1677
uint32 INOS_MOVEPATH_ERROR_NURBS_NOT_ENOUGH_POINTS
Definition inoserror.h:1677
uint32 INOS_MOVEPATH_ERROR_NURBS_DEGREE_INVALID
Definition inoserror.h:1677
Definition cinosnurbscurve.h:1045
double m_dDistanceSegEnd
Distance to segment end.
Definition cinosnurbscurve.h:1057
uint32 m_uSplineIndex
current spline index
Definition cinosnurbscurve.h:1049
uint32 m_uUSpan
current span in Us
Definition cinosnurbscurve.h:1051
uint32 m_uPSpan
current span in Ps
Definition cinosnurbscurve.h:1047
uint32 m_uSegment
current segment
Definition cinosnurbscurve.h:1053
double m_dP
P value.
Definition cinosnurbscurve.h:1059
double m_dDistanceSegBeg
Distance to segment begin.
Definition cinosnurbscurve.h:1055