ON_BOOL32 ON_ArcCurve::SetEndPoint(ON_3dPoint end_point) { if (IsCircle()) return false; ON_BOOL32 rc = false; if ( m_dim == 3 || end_point.z == 0.0 ) { ON_3dPoint P; ON_3dVector T; double t = Domain()[0]; Ev1Der( t, P, T ); ON_Arc a; rc = a.Create( P, T, end_point ); if ( rc ) { m_arc = a; } else { ON_3dPoint start_point = PointAt(Domain()[0]); if (end_point.DistanceTo(start_point) < ON_ZERO_TOLERANCE*m_arc.Radius()){ //make arc into circle m_arc.plane.xaxis = start_point - m_arc.Center(); m_arc.plane.xaxis.Unitize(); m_arc.plane.yaxis = ON_CrossProduct(m_arc.Normal(), m_arc.plane.xaxis); m_arc.plane.yaxis.Unitize(); m_arc.SetAngleRadians(2.0*ON_PI); rc = true; } } } return rc; }
ON_BOOL32 ON_ArcCurve::ChangeClosedCurveSeam( double t ){ bool rc = false; if( IsCircle() ){ double angle_delta = m_t.NormalizedParameterAt(t); angle_delta*= 2*ON_PI; m_arc.Rotate(angle_delta, m_arc.plane.Normal()); m_t = ON_Interval( t, m_t[1] + t - m_t[0]); rc = true; } return rc; }
void Location::CalculateBoundingBox() { if(IsCircle()) { boundingBox.AddBoundingVertex(pos.x-radius,pos.z-radius); boundingBox.AddBoundingVertex(pos.x+radius,pos.z+radius); } else { for(size_t i=0; i< locs.GetSize(); i++) { boundingBox.AddBoundingVertex(locs[i]->pos.x,locs[i]->pos.z); } } }