Refactored evaluate curve
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
diff --git a/include/FTContour.h b/include/FTContour.h
index b3a8302..c1eff54 100644
--- a/include/FTContour.h
+++ b/include/FTContour.h
@@ -68,24 +68,15 @@ class FTGL_EXPORT FTContour
/**
* De Casteljau (bezier) algorithm contributed by Jed Soane
*
- * @param t
- * @param curveOrder The order of the curve to be evaluated.
- * <code>2</code> equals conic (quadratic) and <code>3</code> equals cubic
- */
- inline void deCasteljau( const float t, const int curveOrder);
-
- /**
- * De Casteljau (bezier) algorithm contributed by Jed Soane
- *
* @param curveOrder The order of the curve to be evaluated.
* <code>2</code> equals conic (quadratic) and <code>3</code> equals cubic
*/
inline void evaluateCurve( const int curveOrder);
/**
+ * 2D array storing values of de Casteljau algorithm.
*/
- // Magic numbers -- #define MAX_DEG 4
- float bValues[4][4][2]; //3D array storing values of de Casteljau algorithm.
+ float bValues[4][2];
};
#endif // __FTContour__
diff --git a/src/FTContour.cpp b/src/FTContour.cpp
index 3564e7d..fbfccd9 100644
--- a/src/FTContour.cpp
+++ b/src/FTContour.cpp
@@ -1,7 +1,7 @@
#include "FTContour.h"
-static const unsigned int SECOND_ORDER_CURVE = 2;
-static const unsigned int THIRD_ORDER_CURVE = 3;
+static const unsigned int SECOND_DEGREE_CURVE = 2;
+static const unsigned int THIRD_DEGREE_CURVE = 3;
static const float BEZIER_STEP_SIZE = 0.2f;
@@ -38,11 +38,11 @@ FTContour::FTContour( FT_Vector* contour, char* pointTags, unsigned int numberOf
static_cast<float>( controlPoint.y + nextPoint.y) * 0.5f,
0);
- bValues[0][0][0] = previousPoint.x; bValues[0][0][1] = previousPoint.y;
- bValues[0][1][0] = controlPoint.x; bValues[0][1][1] = controlPoint.y;
- bValues[0][2][0] = nextPoint.x; bValues[0][2][1] = nextPoint.y;
+ bValues[0][0] = previousPoint.x; bValues[0][1] = previousPoint.y;
+ bValues[1][0] = controlPoint.x; bValues[1][1] = controlPoint.y;
+ bValues[2][0] = nextPoint.x; bValues[2][1] = nextPoint.y;
- evaluateCurve( SECOND_ORDER_CURVE);
+ evaluateCurve( SECOND_DEGREE_CURVE);
++pointIndex;
previousPoint = nextPoint;
@@ -55,11 +55,11 @@ FTContour::FTContour( FT_Vector* contour, char* pointTags, unsigned int numberOf
: pointTags[pointIndex + 1];
}
- bValues[0][0][0] = previousPoint.x; bValues[0][0][1] = previousPoint.y;
- bValues[0][1][0] = controlPoint.x; bValues[0][1][1] = controlPoint.y;
- bValues[0][2][0] = nextPoint.x; bValues[0][2][1] = nextPoint.y;
+ bValues[0][0] = previousPoint.x; bValues[0][1] = previousPoint.y;
+ bValues[1][0] = controlPoint.x; bValues[1][1] = controlPoint.y;
+ bValues[2][0] = nextPoint.x; bValues[2][1] = nextPoint.y;
- evaluateCurve( SECOND_ORDER_CURVE);
+ evaluateCurve( SECOND_DEGREE_CURVE);
continue;
}
@@ -71,12 +71,12 @@ FTContour::FTContour( FT_Vector* contour, char* pointTags, unsigned int numberOf
? pointList[0]
: FTPoint( contour[pointIndex + 2]);
- bValues[0][0][0] = previousPoint.x; bValues[0][0][1] = previousPoint.y;
- bValues[0][1][0] = controlPoint.x; bValues[0][1][1] = controlPoint.y;
- bValues[0][2][0] = controlPoint2.x; bValues[0][2][1] = controlPoint2.y;
- bValues[0][3][0] = nextPoint.x; bValues[0][3][1] = nextPoint.y;
+ bValues[0][0] = previousPoint.x; bValues[0][1] = previousPoint.y;
+ bValues[1][0] = controlPoint.x; bValues[1][1] = controlPoint.y;
+ bValues[2][0] = controlPoint2.x; bValues[2][1] = controlPoint2.y;
+ bValues[3][0] = nextPoint.x; bValues[3][1] = nextPoint.y;
- evaluateCurve( THIRD_ORDER_CURVE);
+ evaluateCurve( THIRD_DEGREE_CURVE);
++pointIndex;
continue;
}
@@ -93,30 +93,22 @@ void FTContour::AddPoint( FTPoint point)
}
-void FTContour::deCasteljau( const float t, const int n)
+void FTContour::evaluateCurve( const int curveDegree)
{
- //Calculating successive b(i)'s using de Casteljau algorithm.
- for( int i = 1; i <= n; i++)
+ for( unsigned int i = 0; i <= ( 1.0f / BEZIER_STEP_SIZE); i++)
{
- for( int k = 0; k <= (n - i); k++)
+ float t = static_cast<float>(i) * BEZIER_STEP_SIZE;
+
+ for( unsigned int m = curveDegree; m > 0; m--)
{
- bValues[i][k][0] = (1 - t) * bValues[i - 1][k][0] + t * bValues[i - 1][k + 1][0];
- bValues[i][k][1] = (1 - t) * bValues[i - 1][k][1] + t * bValues[i - 1][k + 1][1];
+ for ( unsigned int j = 0; j < m; j++)
+ {
+ bValues[j][0] = (1.0f - t) * bValues[j][0] + t * bValues[j + 1][0];
+ bValues[j][1] = (1.0f - t) * bValues[j][1] + t * bValues[j + 1][1];
+ }
}
- }
-
- AddPoint( FTPoint( bValues[n][0][0], bValues[n][0][1], 0.0f));
-}
-
-void FTContour::evaluateCurve( const int n)
-{
- float t; //parameter for curve point calc. [0.0, 1.0]
-
- for( int m = 0; m <= ( 1 / BEZIER_STEP_SIZE); m++)
- {
- t = m * BEZIER_STEP_SIZE;
- deCasteljau( t, n); //calls to evaluate point on curve at t.
+ AddPoint( FTPoint( bValues[0][0], bValues[0][1], 0.0f));
}
}