McNeel Wiki
How To: Divide a Curve by Length
edit · print · help · all topics
Main Pages

AccuRender

Bongo

Brazil r/s

Developer

Flamingo

Penguin

Rhino Blogs

Rhino

Rhino Labs

Search

Languages

Česky

Deutsch

English

Español

Français

Italiano

Polish

日本語

한국어

中文(繁體)

中文(简体)

 
.
DeveloperC++, .NET
SummaryDemonstrates 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 (Rhino 4)

  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# (Rhino 4)

  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;
  }
Last Modified [7/23/2008] rename · changes · history · subscriptions · references · file upload