#include "nurbsSub.h" namespace PLib { template NurbsSurface* generateTorus(T majorRadius, T minorRadius) { // These define the shape of a unit torus centered about the origin. T xvalues[] = { 0.0, -1.0, -1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 0.0 }; T yvalues[] = { 1.0, 1.0, 0.0, -1.0, -1.0, -1.0, 0.0, 1.0, 1.0 }; T zvalues[] = { 0.0, 1.0, 1.0, 1.0, 0.0, -1.0, -1.0, -1.0, 0.0 }; T offsets[] = { -1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 0.0, -1.0, -1.0 }; // Piecewise Bezier knot vector for a quadratic curve with four segments T knotsMem[] = { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4 }; Vector knots(knotsMem,12) ; int i, j; double r2over2 = sqrt( 2.0 ) / 2.0; double weight; NurbsSurface *torus = new NurbsSurface ; torus->resize(9,9,2,2) ; for (i = 0; i < 9; i++){ for (j = 0; j < 9; j++) { HPoint_nD hp ; weight = ((j & 1) ? r2over2 : 1.0) * ((i & 1) ? r2over2 : 1.0); // Notice how the weights are pre-multiplied with the x, y and z values hp.x() = xvalues[j]* (majorRadius + offsets[i] * minorRadius) * weight; hp.y() = yvalues[j]* (majorRadius + offsets[i] * minorRadius) * weight; hp.z() = (zvalues[i] * minorRadius) * weight; hp.w() = weight; torus->modCP(i,j,hp) ; } } // The knot vectors define piecewise Bezier segments // (the same in both U and V). torus->modKnotU(knots) ; torus->modKnotV(knots) ; return torus; } template NurbsSurface* generateTorus(float majorRadius, float minorRadius); } main() { using namespace PLib ; NurbsSurface *torus; float tolerance = 2.0; torus = generateTorus( 1.3, 0.3 ); NurbsSubSurface surf(*torus) ; surf.drawSubdivisionPS("tnurbsSub.ps", tolerance ); surf.drawSubdivisionVRML("tnurbsSub.wrl",0.1) ; surf.drawSubdivisionVRML97("tnurbsSub97.wrl",0.1) ; }