/***********************************************************************
*
* ELMER, A Computational Fluid Dynamics Program.
*
* Copyright 1st April 1995 - , Center for Scientific Computing,
* Finland.
*
* All rights reserved. No part of this program may be used,
* reproduced or transmitted in any form or by any means
* without the written permission of CSC.
*
* Address: Center for Scientific Computing
* Tietotie 6, P.O. BOX 405
* 02101 Espoo, Finland
* Tel. +358 0 457 2001
* Telefax: +358 0 457 2302
* EMail: Jari.Jarvinen@csc.fi
************************************************************************/
/***********************************************************************
Program: ELMER Front
Module: ecif_nurbs.cpp
Language: C++
Date: 01.10.98
Version: 1.00
Author(s): Martti Verho
Revisions:
Abstract: Implementation
************************************************************************/
#include "ecif_geometry.h"
#include "ecif_nurbs.h"
// ************************
// Local utility functions.
// ************************
// B-spline basis function when p=0.
double
bspl_n0(double* knots, int interval, double u)
{
if (u >= knots[interval] && u < knots[interval+1])
return 1.0;
else
return 0.0;
}
// B-spline basis function, general case
// N_i,p(u) value for parameter value u.
double
bspl_np(int p, double* knots, int i, double u)
{
// Elementary case (p=1)
if (p == 1)
return bspl_n0(knots, i, u);
// General case, recursive call
else {
double du0 = knots[i+p] - knots[i];
double du1 = knots[i+1+p] - knots[i+1];
// Take care of the 0/0 special case
double w0 = (du0 == 0.0f)?1.0f:( (u-knots[i])/du0 );
double w1 = (du1 == 0.0f)?1.0f:( (knots[i+1+p]-u)/du1 );
return ( w0 * bspl_np(p-1, knots, i, u) +
w1 * bspl_np(p-1, knots, i+1, u) );
}
}
// Function calculates x,y,z values corresponding parameter
// value u for a b-spline curve.
// Based on basis-functions (bf)
void
bsplCurveValue_bf(struct ecif_NurbsCurve* uP, double u, Point3 result)
{
// Seed for the result
double x_val = 0.0;
double y_val = 0.0;
double z_val = 0.0;
// Cumulate the contribution of all control points
int i;
for (i = 0; i < uP->nofCpoints; i++) {
double b_val = bspl_np(1 + uP->degree, uP->knots, i, u);
x_val = x_val + b_val * uP->cpoints[i][0];
y_val = y_val + b_val * uP->cpoints[i][1];
z_val = z_val + b_val * uP->cpoints[i][2];
}
result[0] = x_val;
result[1] = y_val;
result[2] = z_val;
}
// ******************
// Callable functions.
// ******************
// Function calculates x,y,z values corresponding parameter
// value u for a nurbs-curve.
// Currently only bspline-version !!!***!!!
void
nurbsCurveValue(struct ecif_NurbsCurve* curve_params, double u, Point3 result)
{
bsplCurveValue_bf(curve_params, u, result);
}
syntax highlighted by Code2HTML, v. 0.9.1