bool ON_LineCurve::Morph( const ON_SpaceMorph& morph ) { DestroyCurveTree(); m_line.from = morph.MorphPoint(m_line.from); m_line.to = morph.MorphPoint(m_line.to); return true; }
bool ON_NurbsSurface::Morph( const ON_SpaceMorph& morph ) { DestroySurfaceTree(); ON_BOOL32 bIsClosed[2]; ON_BOOL32 bIsPeriodic[2]; ON_BOOL32 bIsSingular[4]; int i; for ( i = 0; i < 2; i++ ) { bIsClosed[i] = IsClosed(i); bIsPeriodic[i] = IsPeriodic(i); } for ( i = 0; i < 4; i++ ) bIsSingular[i] = IsSingular(i); for ( i = 0; i < m_cv_count[0]; i++ ) { morph.MorphPointList( m_dim, m_is_rat, m_cv_count[1], m_cv_stride[1], CV(i,0) ); } for ( i = 0; i < 4; i++ ) { if ( bIsSingular[i] ) CollapseSide(i); } // TODO - if input was closed/periodic make output the same return true; }
bool ON_PointCloud::Morph( const ON_SpaceMorph& morph ) { if ( m_P.Count() > 0 ) { morph.MorphPointList( 3, 0, m_P.Count(), 3, &m_P[0].x ); m_bbox.Destroy(); } return true; }
bool ON_Mesh::Morph( const ON_SpaceMorph& morph ) { if ( m_V.Count() > 0 ) { bool bHasFaceNormals = HasFaceNormals(); bool bHasVertexNormals = HasVertexNormals(); int i, count = m_V.Count(); if ( bHasVertexNormals ) { for ( i = 0; i < count; i++ ) { m_N[i] = m_V[i] + 0.0009765625f*m_N[i]; } morph.MorphPointList( 3, 0, count, 3, &m_N[0].x ); } morph.MorphPointList( 3, 0, count, 3, &m_V[0].x ); if ( bHasVertexNormals ) { for ( i = 0; i < count; i++ ) { m_N[i] -= m_V[i]; m_N[i].Unitize(); } } m_FN.SetCount(0); m_K.SetCount(0); if ( bHasFaceNormals ) { ComputeFaceNormals(); } m_Ctag.Default(); InvalidateVertexBoundingBox(); InvalidateVertexNormalBoundingBox(); InvalidateCurvatureStats(); } return true; }
bool ON_BezierSurface::Morph( const ON_SpaceMorph& morph ) { int i; for ( i = 0; i < m_order[0]; i++ ) { morph.MorphPointList( m_dim, m_is_rat, m_order[1], m_cv_stride[1], CV(i,0) ); } return true; }
bool ON_NurbsCurve::Morph( const ON_SpaceMorph& morph ) { DestroyCurveTree(); ON_BOOL32 bIsClosed = IsClosed(); ON_BOOL32 bIsPeriodic = IsPeriodic(); morph.MorphPointList( m_dim, m_is_rat, m_cv_count, m_cv_stride, m_cv ); if ( bIsPeriodic ) { int i, deg = m_order-1; for ( i = 0; i < deg; i++ ) SetCV( m_cv_count-deg+i, ON::intrinsic_point_style, CV(i) ); } else if ( bIsClosed ) { SetCV( m_cv_count-1, ON::intrinsic_point_style, CV(0) ); } return true; }
bool ON_Plane::Morph( const ON_SpaceMorph& morph ) { ON_Plane mp; double s = sqrt( fabs(origin.MaximumCoordinate())*ON_SQRT_EPSILON + ON_ZERO_TOLERANCE ); mp.xaxis = morph.MorphVector(origin,s*xaxis); mp.yaxis = morph.MorphVector(origin,s*yaxis); mp.zaxis = morph.MorphVector(origin,s*zaxis); origin = morph.MorphPoint(origin); UpdateEquation(); bool bx = mp.xaxis.Unitize(); bool by = mp.yaxis.Unitize(); bool bz = mp.zaxis.Unitize(); if (!bx) { mp.xaxis = ON_CrossProduct(mp.yaxis,mp.zaxis); bx = mp.xaxis.Unitize(); } if (!by) { mp.yaxis = ON_CrossProduct(mp.zaxis,mp.xaxis); by = mp.yaxis.Unitize(); } if (!bz) { mp.zaxis = ON_CrossProduct(mp.xaxis,mp.yaxis); bz = mp.zaxis.Unitize(); } mp.origin.Set(0.0,0.0,0.0); mp.UpdateEquation(); bool rc = mp.IsValid(); ON_3dVector x, y, z; if ( rc ) { x = mp.xaxis; y = mp.yaxis; z = mp.zaxis; } else { x = ON_CrossProduct(mp.yaxis,mp.zaxis); y = ON_CrossProduct(mp.zaxis,mp.xaxis); z = ON_CrossProduct(mp.xaxis,mp.yaxis); x.Unitize(); y.Unitize(); z.Unitize(); x = mp.xaxis + x; y = mp.yaxis + y; z = mp.zaxis + z; x.Unitize(); y.Unitize(); z.Unitize(); rc = mp.CreateFromFrame(ON_origin,x,y); if (rc) { x = mp.xaxis; y = mp.yaxis; z = mp.zaxis; } else { rc = mp.CreateFromFrame(ON_origin,y,z); if ( rc ) { y = mp.xaxis; z = mp.yaxis; x = mp.zaxis; } else { rc = mp.CreateFromFrame(ON_origin,z,x); if (rc) { z = mp.xaxis; x = mp.yaxis; y = mp.zaxis; } else { rc = mp.CreateFromNormal(ON_origin,z); if (rc) { x = mp.xaxis; y = mp.yaxis; z = mp.zaxis; } } } } } if (rc) { xaxis = x; yaxis = y; zaxis = z; UpdateEquation(); } return rc; }
// virtual ON_Geometry override bool ON_PolylineCurve::Morph( const ON_SpaceMorph& morph ) { DestroyCurveTree(); morph.MorphPointList( 3, false, m_pline.Count(), 3, (double*)m_pline.Array() ); return true; }
bool ON_BezierCurve::Morph( const ON_SpaceMorph& morph ) { morph.MorphPointList( m_dim, m_is_rat, m_order, m_cv_stride, m_cv ); return true; }
bool ON_Point::Morph( const ON_SpaceMorph& morph ) { point = morph.MorphPoint(point); return true; }