developer:sdksamples:dividecurvelength


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;
}
developer/sdksamples/dividecurvelength.txt · Last modified: 2010/01/26 16:37 (external edit) Driven by DokuWiki Recent changes RSS feed

 © 1997-2010 

McNeel North America Europe Latin AmericaAsia