Table of Contents
How To: Divide a Curve by Length
C++, .NET
Summary: Demonstrates how to divide a curve object by a specified length.
The following sample code demonstrates how to divide a selected curve object by a specified length.
C++
CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context ) { CRhinoGetObject go; go.SetCommandPrompt( L"Select curve to divide" ); go.SetGeometryFilter( CRhinoGetObject::curve_object ); go.GetObjects( 1, 1 ); if( go.CommandResult() != CRhinoCommand::success ) return go.CommandResult(); const CRhinoObjRef& objref = go.Object(0); const ON_Curve* crv = objref.Curve(); if( !crv ) return CRhinoCommand::failure; double crv_length = 0.0; crv->GetLength( &crv_length ); if( crv_length < ON_ZERO_TOLERANCE ) return CRhinoCommand::failure; ON_wString s; s.Format( L"Curve length is %g. Segment Length", crv_length ); CRhinoGetNumber gn; gn.SetCommandPrompt( s ); gn.SetLowerLimit( 0.0, TRUE ); gn.SetUpperLimit( crv_length, TRUE ); gn.GetNumber(); if( gn.CommandResult() != CRhinoCommand::success ) return gn.CommandResult(); double seg_length = gn.Number(); int seg_count = (int)floor( crv_length / seg_length ); double fractional_end = (seg_count * seg_length) / crv_length; double t0, t1; crv->GetDomain( &t0, &t1 ); crv->GetNormalizedArcLengthPoint( fractional_end, &t1 ); seg_count++; ON_SimpleArray<double> t( seg_count ); t.SetCount( seg_count ); for( int i = 0; i < seg_count; i++ ) { double param = (double)i / ((double)seg_count-1); t[i] = param; } ON_Interval sub_domain( t0, t1 ); crv->GetNormalizedArcLengthPoints( seg_count, (double*)&t[0], (double*)&t[0], 0.0, 1.0e-8, &sub_domain ); for( int i = 0; i < seg_count; i++ ) { ON_3dPoint pt = crv->PointAt( t[i] ); context.m_doc.AddPointObject( pt ); } context.m_doc.Redraw(); return CRhinoCommand::success; }
VB.NET
Public Overrides Function RunCommand(ByVal context As IRhinoCommandContext) _ As IRhinoCommand.result Dim go As New MRhinoGetObject() go.SetCommandPrompt("Select curve to divide") go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object) go.GetObjects(1, 1) If (go.CommandResult() <> IRhinoCommand.result.success) Then Return go.CommandResult() End If Dim objref As IRhinoObjRef = go.Object(0) Dim crv As IOnCurve = objref.Curve() If (crv Is Nothing) Then Return IRhinoCommand.result.failure Dim crv_length As Double = 0.0 crv.GetLength(crv_length) If (crv_length < OnUtil.On_ZERO_TOLERANCE) Then Return IRhinoCommand.result.failure End If Dim s As String = String.Format("Curve length is {0:f3}. Segment Length", _ crv_length) Dim gn As New MRhinoGetNumber() gn.SetCommandPrompt(s) gn.SetLowerLimit(0.0, True) gn.SetUpperLimit(crv_length, True) gn.GetNumber() If (gn.CommandResult() <> IRhinoCommand.result.success) Then Return gn.CommandResult() End If Dim seg_length As Double = gn.Number() Dim seg_count As Integer = CType(Math.Floor(crv_length / seg_length), Integer) Dim fractional_end As Double = (seg_count * seg_length) / crv_length Dim t0 As Double = 0 Dim t1 As Double = 0 crv.GetDomain(t0, t1) crv.GetNormalizedArcLengthPoint(fractional_end, t1) Dim t(seg_count) As Double For i As Integer = 0 To seg_count t(i) = i / seg_count Next Dim sub_domain As New OnInterval(t0, t1) crv.GetNormalizedArcLengthPoints(t, t, 0.0, 0.00000001, sub_domain) For i As Integer = 0 To seg_count Dim pt As On3dPoint = crv.PointAt(t(i)) context.m_doc.AddPointObject(pt) Next context.m_doc.Redraw() Return IRhinoCommand.result.success End Function
C#
public override IRhinoCommand.result RunCommand(IRhinoCommandContext context) { MRhinoGetObject go = new MRhinoGetObject(); go.SetCommandPrompt( "Select curve to divide" ); go.SetGeometryFilter( IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object ); go.GetObjects( 1, 1 ); if( go.CommandResult() != IRhinoCommand.result.success ) return go.CommandResult(); MRhinoObjRef objref = go.Object(0); IOnCurve crv = objref.Curve(); if( crv == null ) return IRhinoCommand.result.failure; double crv_length = 0.0; crv.GetLength( ref crv_length ); if( crv_length < OnUtil.On_ZERO_TOLERANCE ) return IRhinoCommand.result.failure; MRhinoGetNumber gn = new MRhinoGetNumber(); string s = string.Format("Curve length is {0:f3}. Segment length",crv_length); gn.SetCommandPrompt( s ); gn.SetLowerLimit( 0.0, true ); gn.SetUpperLimit( crv_length, true ); gn.GetNumber(); if(gn.CommandResult() != IRhinoCommand.result.success) return gn.CommandResult(); double seg_length = gn.Number(); int seg_count = (int)System.Math.Floor( crv_length / seg_length ); double fractional_end = (seg_count * seg_length) / crv_length; double t0=0, t1=0; crv.GetDomain( ref t0, ref t1 ); crv.GetNormalizedArcLengthPoint( fractional_end, ref t1); seg_count++; double[] t = new double[seg_count]; for( int i = 0; i < seg_count; i++ ) { double param = (double)i / ((double)seg_count-1); t[i] = param; } OnInterval sub_domain = new OnInterval(t0,t1); crv.GetNormalizedArcLengthPoints( t, ref t, 0.0, 1.0e-8, sub_domain ); for( int i = 0; i < seg_count; i++ ) { On3dPoint pt = crv.PointAt( t[i] ); context.m_doc.AddPointObject( pt ); } context.m_doc.Redraw(); return IRhinoCommand.result.success; }