NEW: Welcome to the Rhino 6 version of this page! Looking for the older Rhino 5 version?

Intersecting Meshes

Demonstrates how to intersect two meshes.

C/C++

/*
Description:
  Intersects two meshes.
Parameters:
  meshA     - [in]  The first mesh.
  meshB     - [in]  The second mesh.
  OutCurves - [out] The resulting polyline curves.
                    NOTE: THE CALLER IS RESPONSIBLE FOR
                    DESTROYING THESE CURVES.
  tolerance - [in]  The intersection tolerance.
Returns:
  True if successful, false otherwise.
*/
static bool MeshMeshIntersection(
        const ON_Mesh* meshA,
        const ON_Mesh* meshB,
        ON_SimpleArray<ON_Curve*>& OutCurves,
        double tolerance = ON_ZERO_TOLERANCE
        )
{
  if( 0 == meshA | 0 == meshB )
    return false;

  ON_ClassArray<ON_MMX_Polyline> transverse;
  ON_ClassArray<ON_MMX_Polyline> overlap;
  bool rc = ON_MeshMeshIntersect( meshA, meshB, transverse, overlap, tolerance, tolerance );
  if( !rc )
    return rc;

  ON_ClassArray<ON_MMX_Polyline>& arr = transverse;
  int i, j, k;
  for( i = 0; i < 2; i++ )
  {
    if( i == 1 )
      arr = overlap;

    int ct = arr.Count();
    for( j = 0; j < ct; j++ )
    {
      ON_MMX_Polyline& mmxpline = arr[j];
      if( 0 == mmxpline.Count() )
        continue;

      ON_Polyline polyline;
      for( k = 0; k < mmxpline.Count(); k++ )
      {
        double x = mmxpline[k].m_A.m_P.x;
        double y = mmxpline[k].m_A.m_P.y;
        double z = mmxpline[k].m_A.m_P.z;
        polyline.Append( ON_3dPoint(x,y,z) );
      }

      if( false == polyline.IsValid() )
        continue;

      ON_PolylineCurve* polyline_crv = new ON_PolylineCurve( polyline );
      if( 0 == polyline_crv )
        continue;

      OutCurves.Append( polyline_crv );
    }
  }

  return ( OutCurves.Count() ) ? true : false;
}

CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context )
{
  CRhinoGetObject go;
  go.SetCommandPrompt( L"Select meshes to intersect" );
  go.SetGeometryFilter( CRhinoGetObject::mesh_object );
  go.GetObjects( 2, 2 );
  if( go.CommandResult() != success )
    return go.CommandResult();

  const ON_Mesh* meshA = go.Object(0).Mesh();
  const ON_Mesh* meshB = go.Object(1).Mesh();
  if( 0 == meshA | 0 == meshA )
    return failure;

  ON_SimpleArray<ON_Curve*> OutCurves;
  bool rc = MeshMeshIntersection( meshA, meshB, OutCurves );
  if( rc )
  {
    int i;
    for( i = 0; i < OutCurves.Count(); i++ )
    {
      CRhinoCurveObject* curve_obj = new CRhinoCurveObject();
      curve_obj->SetCurve( OutCurves[i] );
      context.m_doc.AddObject( curve_obj );
    }
    context.m_doc.Redraw();
  }

  return success;
}