Differences

This shows you the differences between two versions of the page.

 — developer:sdksamples:meshmeshintersection [2015/09/14] (current) Line 1: Line 1: + ====== Intersecting Meshes ====== + ====== C++ ====== + > **Summary:​** //​Demonstrates how to intersect two meshes using the Rhino SDK.// + + =====Question===== + I would like to calculate the polylines that would be created if you intersected two mesh objects. I see the the SDK has a **ON_MeshMeshIntersect** function, which does calculate the intersection of two meshes. But, I am unable to interpret the output. Any example that shows how to do this would be helpful. + + =====Answer===== + The following function demonstrates how you use  **ON_MeshMeshIntersect** to find the polylines that result from intersecting two meshes. + + /* + + + 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; + } + + ​ + You can use the above function as follows: + + + + 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; + } + ​ + + + {{tag>​Developer cplusplus}}
developer/sdksamples/meshmeshintersection.txt ยท Last modified: 2015/09/14 (external edit)