Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
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;
}
Example #7
0
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;
}
Example #8
0
// 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;
}
Example #9
0
bool ON_BezierCurve::Morph( const ON_SpaceMorph& morph )
{
  morph.MorphPointList( m_dim, m_is_rat, m_order, m_cv_stride, m_cv );
  return true;
}
Example #10
0
bool ON_Point::Morph( const ON_SpaceMorph& morph )
{
  point = morph.MorphPoint(point);
  return true;
}