int ON_Cylinder::GetNurbForm( ON_NurbsSurface& s ) const { int rc = 0; if ( IsValid() && height[0] != height[1] ) { ON_NurbsCurve n0, n1; int i; ON_Circle c0 = CircleAt(height[0]); ON_Circle c1 = CircleAt(height[1]); if ( height[0] <= height[1] ) { c0.GetNurbForm(n0); c1.GetNurbForm(n1); } else { c0.GetNurbForm(n1); c1.GetNurbForm(n0); } if ( n0.m_dim != n1.m_dim || n0.m_is_rat != n1.m_is_rat || n0.m_order != n1.m_order || n0.m_cv_count != n1.m_cv_count ) return 0; s.Create(3,TRUE, n0.m_order, 2, n0.m_cv_count, 2 ); if ( height[0] <= height[1] ) { s.m_knot[1][0] = height[0]; s.m_knot[1][1] = height[1]; } else { s.m_knot[1][0] = height[1]; s.m_knot[1][1] = height[0]; } for ( i = 0; i < n0.KnotCount(); i++ ) s.m_knot[0][i] = n0.m_knot[i]; for ( i = 0; i < n0.m_cv_count; i++ ) { s.SetCV(i,0,ON::homogeneous_rational,n0.CV(i)); s.SetCV(i,1,ON::homogeneous_rational,n1.CV(i)); } rc = 2; } return rc; }
int ON_Cone::GetNurbForm( ON_NurbsSurface& s ) const { int rc = 0; if ( IsValid() ) { ON_Circle c = CircleAt(height); ON_NurbsCurve n; c.GetNurbForm(n); ON_3dPoint apex = ApexPoint(); ON_4dPoint cv; int i, j0, j1; s.Create(3,TRUE,3,2,9,2); for ( i = 0; i < 10; i++ ) s.m_knot[0][i] = n.m_knot[i]; if ( height >= 0.0 ) { s.m_knot[1][0] = 0.0; s.m_knot[1][1] = height; j0 = 0; j1 = 1; } else { s.m_knot[1][0] = height; s.m_knot[1][1] = 0.0; j0 = 1; j1 = 0; } for ( i = 0; i < 9; i++ ) { cv = n.CV(i); s.SetCV(i, j1, ON::homogeneous_rational, &cv.x ); cv.x = apex.x*cv.w; cv.y = apex.y*cv.w; cv.z = apex.z*cv.w; s.SetCV(i, j0, cv); } rc = 2; } return rc; }
int ON_Sphere::GetNurbForm( ON_NurbsSurface& s ) const { int rc = 0; if ( IsValid() ) { s.Create(3,true,3,3,9,5); s.m_knot[0][0] = s.m_knot[0][1] = 0.0; s.m_knot[0][2] = s.m_knot[0][3] = 0.5*ON_PI; s.m_knot[0][4] = s.m_knot[0][5] = ON_PI; s.m_knot[0][6] = s.m_knot[0][7] = 1.5*ON_PI; s.m_knot[0][8] = s.m_knot[0][9] = 2.0*ON_PI; s.m_knot[1][0] = s.m_knot[1][1] = -0.5*ON_PI; s.m_knot[1][2] = s.m_knot[1][3] = 0.0; s.m_knot[1][4] = s.m_knot[1][5] = 0.5*ON_PI; ON_4dPoint* CV = (ON_4dPoint*)s.m_cv; const ON_3dVector x = radius*plane.xaxis; const ON_3dVector y = radius*plane.yaxis; const ON_3dVector z = radius*plane.zaxis; ON_3dPoint p[9] = {plane.origin+x, plane.origin+x+y, plane.origin+y, plane.origin-x+y, plane.origin-x, plane.origin-x-y, plane.origin-y, plane.origin+x-y, plane.origin+x}; const double w = 1.0/sqrt(2.0); double w13; int i; ON_4dPoint southpole = plane.origin - z; ON_4dPoint northpole = plane.origin + z; for ( i = 0; i < 8; i++ ) { CV[5*i ] = southpole; CV[5*i+1] = p[i] - z; CV[5*i+2] = p[i]; CV[5*i+3] = p[i] + z; CV[5*i+4] = northpole; if ( i%2) { CV[5*i ].x *= w; CV[5*i ].y *= w; CV[5*i ].z *= w; CV[5*i ].w = w; CV[5*i+2].x *= w; CV[5*i+2].y *= w; CV[5*i+2].z *= w; CV[5*i+2].w = w; CV[5*i+4].x *= w; CV[5*i+4].y *= w; CV[5*i+4].z *= w; CV[5*i+4].w = w; w13 = 0.5; } else { w13 = w; } CV[5*i+1].x *= w13; CV[5*i+1].y *= w13; CV[5*i+1].z *= w13; CV[5*i+1].w = w13; CV[5*i+3].x *= w13; CV[5*i+3].y *= w13; CV[5*i+3].z *= w13; CV[5*i+3].w = w13; } CV[40] = CV[0]; CV[41] = CV[1]; CV[42] = CV[2]; CV[43] = CV[3]; CV[44] = CV[4]; rc = 2; } return rc; }