CRhinoCommand::result CCommandSampleSubCrvLength::RunCommand( const CRhinoCommandContext& context ) { CRhinoGetObject go; go.SetCommandPrompt( L"Select curve to measure" ); go.SetGeometryFilter( CRhinoGetObject::curve_object ); go.GetObjects( 1, 1 ); if( go.CommandResult() != CRhinoCommand::success ) return go.CommandResult(); const CRhinoObjRef& ref = go.Object(0); const ON_Curve* crv = ref.Curve(); if( !crv ) return CRhinoCommand::failure; CRhinoGetPoint gp; gp.SetCommandPrompt( L"First point on curve" ); gp.Constrain( *crv ); gp.GetPoint(); if( gp.CommandResult() != CRhinoCommand::success ) return gp.CommandResult(); double t0; if( !crv->GetClosestPoint(gp.Point(), &t0) ) return CRhinoCommand::nothing; gp.SetCommandPrompt( L"Second point on curve" ); gp.GetPoint(); if( gp.CommandResult() != CRhinoCommand::success ) return gp.CommandResult(); double t1; if( !crv->GetClosestPoint(gp.Point(), &t1) ) return CRhinoCommand::nothing; ON_Interval dom; if( t0 < t1 ) dom.Set( t0, t1 ); else dom.Set( t1, t0 ); double len; if( crv->GetLength(&len, 0.0, &dom) ) RhinoApp().Print( L"Subcurve length = %f.\n", len ); else RhinoApp().Print( L"Unable to calculate length of subcurve.\n" ); return CRhinoCommand::success; }
ON_BOOL32 ON_Surface::IsClosed(int dir) const { ON_Interval d = Domain(dir); if ( d.IsIncreasing() && Dimension() <= 3 ) { const int span_count = SpanCount(dir?0:1); const int span_degree = Degree(dir?0:1); if ( span_count > 0 && span_degree > 0 ) { ON_SimpleArray<double> s(span_count+1); s.SetCount(span_count+1); int n = 2*span_degree+1; double delta = 1.0/n; ON_3dPoint P, Q; P.Zero(); Q.Zero(); int hintP[2] = {0,0}; int hintQ[2] = {0,0}; double *u0, *u1, *v0, *v1; double t; ON_Interval sp; if ( dir ) { v0 = &d.m_t[0]; v1 = &d.m_t[1]; u0 = &t; u1 = &t; } else { u0 = &d.m_t[0]; u1 = &d.m_t[1]; v0 = &t; v1 = &t; } if ( GetSpanVector( dir?0:1, s.Array() ) ) { int span_index, i; for ( span_index = 0; span_index < span_count; span_index++ ) { sp.Set(s[span_index],s[span_index+1]); for ( i = 0; i < n; i++ ) { t = sp.ParameterAt(i*delta); if ( !Evaluate( *u0, *v0, 1, 3, P, 0, hintP ) ) return false; if ( !Evaluate( *u1, *v1, 2, 3, Q, 0, hintQ ) ) return false; if ( false == ON_PointsAreCoincident( 3, 0, &P.x, &Q.x ) ) return false; } } return true; } } } return false; }
void ON_CurveProxy::SetProxyCurve( const ON_Curve* real_curve, ON_Interval real_curve_subdomain) { if ( real_curve != this ) { // setting m_real_curve=0 prevents crashes if user has deleted // the "real" curve before calling SetProxyCurve(). m_real_curve = 0; DestroyCurveTree(); m_real_curve_domain.Destroy(); m_this_domain.Destroy(); m_bReversed = false; } else { // If you are debugging and end up here, there is a 99% chance // that you passed the wrong pointer to SetProxyCurve(). // However, I will assume you really meant to use a fancy self // reference to adjust domains. if ( IsValid() && m_this_domain.Includes(real_curve_subdomain) ) { real_curve = m_real_curve; // because input real_curve_subdomain was with respect to "this". double r0 = RealCurveParameter(real_curve_subdomain[0]); double r1 = RealCurveParameter(real_curve_subdomain[1]); real_curve_subdomain.Set(r0,r1); } else { real_curve = 0; } // setting m_real_curve=0 prevents crashes if user has deleted // the "real" curve before calling SetProxyCurve(). m_real_curve = 0; DestroyCurveTree(); } m_real_curve = real_curve; if ( m_real_curve ) { SetProxyCurveDomain( real_curve_subdomain ); } else { m_real_curve_domain = real_curve_subdomain; } m_this_domain = m_real_curve_domain; }