Site Tools


Differences

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

Link to this comparison view

developer:sdksamples:crvarclengthpoint [2015/09/14] (current)
Line 1: Line 1:
 +====== Finding Points on Curves at Arc Length Distances ======
 +====== ​ C++ ======
 +> **Summary:​** //​Demonstrates how to find points that are a specified distance from the start of curves using the Rhino SDK.//
 +
 +=====Question=====
 +For a given length from the beginning of a curve, how would I get a curve'​s parameter at this point?
 +
 +=====Answer=====
 +The two function on ON_Curve that are useful for determining the parameter of the point on a curve that is a prescribed arc length distance from the start of a curve are:
 +
 +  * ON_Curve::​GetNormalizedArcLengthPoint
 +  * ON_Curve::​GetNormalizedArcLengthPoints
 +
 +To use these functions, you need to calculate a normalized arc length parameter. That is, a parameter on the curve where 0.0 = the start of the curve, 0.5 = the midpoint of the curve, and 1.0 = the end of the curve.
 +
 +Note, if you want to determine the parameter of the point on a curve that is a prescribed arc length distance from the end of a curve, just reverse the curve before calling one of the above curve members.
 +
 +The following code sample demonstrates how to use these functions.
 +
 +===== C++ =====
 +<code c++>
 +CRhinoCommand::​result CCommandTest::​RunCommand( const CRhinoCommandContext&​ context )
 +{
 +  CRhinoGetObject go;
 +  go.SetCommandPrompt( L"​Select curve" );
 +  go.SetGeometryFilter( CRhinoGetObject::​curve_object );
 +  go.GetObjects( 1, 1 );
 +  if( go.CommandResult() != success )
 +    return go.CommandResult();​
 +
 +  const CRhinoObjRef&​ obj_ref = go.Object(0);​
 +  const ON_Curve* crv = obj_ref.Curve();​
 +  if( 0 == crv )
 +    return failure;
 +
 +  double crv_length = 0.0;
 +  if( !crv->​GetLength(&​crv_length) )
 +    return failure;
 +
 +  CRhinoGetNumber gn;
 +  gn.SetCommandPrompt( L"​Length from start" );
 +  gn.SetLowerLimit( 0.0, TRUE );
 +  gn.SetUpperLimit( crv_length, TRUE );
 +  gn.GetNumber();​
 +  if( gn.CommandResult() != success )
 +    return gn.CommandResult();​
 +
 +  // Cook up a normalized arc length parameter, ​
 +  // where 0.0 <= s <= 1.0.
 +  double length = fabs( gn.Number() );
 +  double s = 0.0;
 +  if( length == 0.0 )
 +    s = 0.0;
 +  else if( length == crv_length )
 +    s = 1.0;
 +  else
 +    s = length / crv_length;
 +
 +  // Get the parameter of the point on the curve that is a 
 +  // prescribed arc length from the start of the curve.
 +  double t = 0.0;
 +  if( crv->​GetNormalizedArcLengthPoint(s,​ &t) )
 +  {
 +    ON_3dPoint pt = crv->​PointAt( t );
 +    context.m_doc.AddPointObject( pt );
 +    context.m_doc.Redraw();​
 +  }
 +
 +  return success;
 +}
 +</​code>​
 +
 +
 +{{tag>​Developer}}
  
developer/sdksamples/crvarclengthpoint.txt ยท Last modified: 2015/09/14 (external edit)