ReactOS 0.4.15-dev-7942-gd23573b
bezierEval.cc File Reference
#include <assert.h>
#include <math.h>
Include dependency graph for bezierEval.cc:

Go to the source code of this file.

Macros

#define TOLERANCE   0.0001
 
#define MAX_ORDER   16
 
#define MAX_DIMENSION   4
 

Functions

static void normalize (float vec[3])
 
static void crossProduct (float x[3], float y[3], float ret[3])
 
void bezierCurveEval (float u0, float u1, int order, float *ctlpoints, int stride, int dimension, float u, float retpoint[])
 
void bezierCurveEvalDer (float u0, float u1, int order, float *ctlpoints, int stride, int dimension, float u, float retDer[])
 
void bezierCurveEvalDerGen (int der, float u0, float u1, int order, float *ctlpoints, int stride, int dimension, float u, float retDer[])
 
void bezierSurfEvalDerGen (int uder, int vder, float u0, float u1, int uorder, float v0, float v1, int vorder, int dimension, float *ctlpoints, int ustride, int vstride, float u, float v, float ret[])
 
void bezierSurfEval (float u0, float u1, int uorder, float v0, float v1, int vorder, int dimension, float *ctlpoints, int ustride, int vstride, float u, float v, float ret[])
 
void bezierSurfEvalNormal (float u0, float u1, int uorder, float v0, float v1, int vorder, int dimension, float *ctlpoints, int ustride, int vstride, float u, float v, float retNormal[])
 

Variables

static float binomialCoefficients [8][8]
 

Macro Definition Documentation

◆ MAX_DIMENSION

#define MAX_DIMENSION   4

Definition at line 55 of file bezierEval.cc.

◆ MAX_ORDER

#define MAX_ORDER   16

Definition at line 51 of file bezierEval.cc.

◆ TOLERANCE

#define TOLERANCE   0.0001

Definition at line 48 of file bezierEval.cc.

Function Documentation

◆ bezierCurveEval()

void bezierCurveEval ( float  u0,
float  u1,
int  order,
float ctlpoints,
int  stride,
int  dimension,
float  u,
float  retpoint[] 
)

Definition at line 75 of file bezierEval.cc.

76{
77 float uprime = (u-u0)/(u1-u0);
78 float *ctlptr = ctlpoints;
79 float oneMinusX = 1.0f-uprime;
80 float XPower = 1.0f;
81
82 int i,k;
83 for(k=0; k<dimension; k++)
84 retpoint[k] = (*(ctlptr + k));
85
86 for(i=1; i<order; i++){
87 ctlptr += stride;
88 XPower *= uprime;
89 for(k=0; k<dimension; k++) {
90 retpoint[k] = retpoint[k]*oneMinusX + ctlptr[k]* binomialCoefficients[order-1][i] * XPower;
91 }
92 }
93}
static float binomialCoefficients[8][8]
Definition: bezierEval.cc:64
GLsizei stride
Definition: glext.h:5848
GLuint GLdouble GLdouble GLint GLint order
Definition: glext.h:11194
GLdouble u1
Definition: glext.h:8308
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
int k
Definition: mpi.c:3369

Referenced by bezierCurveEvalDer(), and bezierCurveEvalDerGen().

◆ bezierCurveEvalDer()

void bezierCurveEvalDer ( float  u0,
float  u1,
int  order,
float ctlpoints,
int  stride,
int  dimension,
float  u,
float  retDer[] 
)

Definition at line 125 of file bezierEval.cc.

126{
127 int i,k;
128 float width = u1-u0;
129 float *ctlptr = ctlpoints;
130
132 if(order == 1){
133 for(k=0; k<dimension; k++)
134 retDer[k]=0;
135 }
136 for(i=0; i<order-1; i++){
137 for(k=0; k<dimension; k++) {
138 buf[i][k] = (ctlptr[stride+k] - ctlptr[k])*(order-1)/width;
139 }
140 ctlptr += stride;
141 }
142
143 bezierCurveEval(u0, u1, order-1, (float*) buf, MAX_DIMENSION, dimension, u, retDer);
144}
#define MAX_DIMENSION
Definition: bezierEval.cc:55
void bezierCurveEval(float u0, float u1, int order, float *ctlpoints, int stride, int dimension, float u, float retpoint[])
Definition: bezierEval.cc:75
#define MAX_ORDER
Definition: bezierEval.cc:51
GLint GLint GLsizei width
Definition: gl.h:1546
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751

◆ bezierCurveEvalDerGen()

void bezierCurveEvalDerGen ( int  der,
float  u0,
float  u1,
int  order,
float ctlpoints,
int  stride,
int  dimension,
float  u,
float  retDer[] 
)

Definition at line 146 of file bezierEval.cc.

147{
148 int i,k,r;
149 float *ctlptr = ctlpoints;
150 float width=u1-u0;
152 if(der<0) der=0;
153 for(i=0; i<order; i++){
154 for(k=0; k<dimension; k++){
155 buf[0][i][k] = ctlptr[k];
156 }
157 ctlptr += stride;
158 }
159
160
161 for(r=1; r<=der; r++){
162 for(i=0; i<order-r; i++){
163 for(k=0; k<dimension; k++){
164 buf[r][i][k] = (buf[r-1][i+1][k] - buf[r-1][i][k])*(order-r)/width;
165 }
166 }
167 }
168
169 bezierCurveEval(u0, u1, order-der, (float *) (buf[der]), MAX_DIMENSION, dimension, u, retDer);
170}
GLdouble GLdouble GLdouble r
Definition: gl.h:2055

Referenced by bezierSurfEvalDerGen().

◆ bezierSurfEval()

void bezierSurfEval ( float  u0,
float  u1,
int  uorder,
float  v0,
float  v1,
int  vorder,
int  dimension,
float ctlpoints,
int  ustride,
int  vstride,
float  u,
float  v,
float  ret[] 
)

Definition at line 192 of file bezierEval.cc.

193{
194 bezierSurfEvalDerGen(0, 0, u0, u1, uorder, v0, v1, vorder, dimension, ctlpoints, ustride, vstride, u, v, ret);
195 if(dimension == 4) /*homogeneous*/{
196 ret[0] /= ret[3];
197 ret[1] /= ret[3];
198 ret[2] /= ret[3];
199 }
200}
void bezierSurfEvalDerGen(int uder, int vder, float u0, float u1, int uorder, float v0, float v1, int vorder, int dimension, float *ctlpoints, int ustride, int vstride, float u, float v, float ret[])
Definition: bezierEval.cc:176
const GLdouble * v
Definition: gl.h:2040
GLdouble GLdouble GLint ustride
Definition: glext.h:8308
GLdouble GLdouble GLint GLint uorder
Definition: glext.h:8308
GLfloat v0
Definition: glext.h:6061
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint vorder
Definition: glext.h:8308
GLfloat GLfloat v1
Definition: glext.h:6062
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint vstride
Definition: glext.h:8308
int ret

Referenced by bezierPatchEval(), and bezierPatchMeshEval().

◆ bezierSurfEvalDerGen()

void bezierSurfEvalDerGen ( int  uder,
int  vder,
float  u0,
float  u1,
int  uorder,
float  v0,
float  v1,
int  vorder,
int  dimension,
float ctlpoints,
int  ustride,
int  vstride,
float  u,
float  v,
float  ret[] 
)

Definition at line 176 of file bezierEval.cc.

177{
178 int i;
179 float newPoints[MAX_ORDER][MAX_DIMENSION];
180
181 for(i=0; i<uorder; i++){
182
183 bezierCurveEvalDerGen(vder, v0, v1, vorder, ctlpoints+ustride*i, vstride, dimension, v, newPoints[i]);
184
185 }
186
187 bezierCurveEvalDerGen(uder, u0, u1, uorder, (float *) newPoints, MAX_DIMENSION, dimension, u, ret);
188}
void bezierCurveEvalDerGen(int der, float u0, float u1, int order, float *ctlpoints, int stride, int dimension, float u, float retDer[])
Definition: bezierEval.cc:146

Referenced by bezierSurfEval(), and bezierSurfEvalNormal().

◆ bezierSurfEvalNormal()

void bezierSurfEvalNormal ( float  u0,
float  u1,
int  uorder,
float  v0,
float  v1,
int  vorder,
int  dimension,
float ctlpoints,
int  ustride,
int  vstride,
float  u,
float  v,
float  retNormal[] 
)

Definition at line 202 of file bezierEval.cc.

203{
204 float partialU[4];
205 float partialV[4];
206 assert(dimension>=3 && dimension <=4);
207 bezierSurfEvalDerGen(1,0, u0, u1, uorder, v0, v1, vorder, dimension, ctlpoints, ustride, vstride, u, v, partialU);
208 bezierSurfEvalDerGen(0,1, u0, u1, uorder, v0, v1, vorder, dimension, ctlpoints, ustride, vstride, u, v, partialV);
209
210 if(dimension == 3){/*inhomogeneous*/
211 crossProduct(partialU, partialV, retNormal);
212
213 normalize(retNormal);
214
215 return;
216 }
217 else { /*homogeneous*/
218 float val[4]; /*the point coordinates (without derivative)*/
219 float newPartialU[MAX_DIMENSION];
220 float newPartialV[MAX_DIMENSION];
221 int i;
222 bezierSurfEvalDerGen(0,0, u0, u1, uorder, v0, v1, vorder, dimension, ctlpoints, ustride, vstride, u, v, val);
223
224 for(i=0; i<=2; i++){
225 newPartialU[i] = partialU[i] * val[3] - val[i] * partialU[3];
226 newPartialV[i] = partialV[i] * val[3] - val[i] * partialV[3];
227 }
228 crossProduct(newPartialU, newPartialV, retNormal);
229 normalize(retNormal);
230 }
231}
static void normalize(float vec[3])
Definition: bezierEval.cc:234
static void crossProduct(float x[3], float y[3], float ret[3])
Definition: bezierEval.cc:253
#define assert(x)
Definition: debug.h:53
GLuint GLfloat * val
Definition: glext.h:7180

Referenced by bezierPatchEvalNormal(), and bezierPatchMeshEval().

◆ crossProduct()

static void crossProduct ( float  x[3],
float  y[3],
float  ret[3] 
)
static

Definition at line 253 of file bezierEval.cc.

254{
255 ret[0] = x[1]*y[2] - y[1]*x[2];
256 ret[1] = x[2]*y[0] - y[2]*x[0];
257 ret[2] = x[0]*y[1] - y[0]*x[1];
258
259}
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548

Referenced by bezierSurfEvalNormal().

◆ normalize()

static void normalize ( float  vec[3])
static

Definition at line 234 of file bezierEval.cc.

235{
236 float size = (float)sqrt(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]);
237
238 if(size < TOLERANCE)
239 {
240#ifdef DEBUG
241 fprintf(stderr, "Warning: in oglBSpline.c normal is 0\n");
242#endif
243 return;
244 }
245 else {
246 vec[0] = vec[0]/size;
247 vec[1] = vec[1]/size;
248 vec[2] = vec[2]/size;
249 }
250}
_STLP_DECLSPEC complex< float > _STLP_CALL sqrt(const complex< float > &)
Definition: complex.cpp:188
#define TOLERANCE
Definition: bezierEval.cc:48
FT_Vector * vec
Definition: ftbbox.c:448
GLsizeiptr size
Definition: glext.h:5919
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static float(__cdecl *square_half_float)(float x

Referenced by bezierSurfEvalNormal(), gl_unpack_image(), gl_xform_normals_3fv(), xmlParseAttribute2(), xmlParseAttValueComplex(), and xmlParseAttValueInternal().

Variable Documentation

◆ binomialCoefficients

float binomialCoefficients[8][8]
static
Initial value:
= {
{1,0,0,0,0,0,0,0},
{1,1,0,0,0,0,0,0},
{1,2,1,0,0,0,0,0},
{1,3,3,1,0,0,0,0},
{1,4,6,4,1,0,0,0},
{1,5,10,10,5,1,0,0},
{1,6,15,20,15,6,1,0},
{1,7,21,35,35,21,7,1}
}

Definition at line 64 of file bezierEval.cc.

Referenced by bezierCurveEval().