CNCPoint CNCPoint::operator- ( const CNCPoint & rhs ) const { CNCPoint result(*this); result.SetX( X() - rhs.X() ); result.SetY( Y() - rhs.Y() ); result.SetZ( Z() - rhs.Z() ); return(result); }
bool CNCPoint::operator<( const CNCPoint & rhs ) const { if (*this == rhs) return(false); if (fabs(X() - rhs.X()) > Tolerance()) { if (X() > rhs.X()) return(false); if (X() < rhs.X()) return(true); } if (fabs(Y() - rhs.Y()) > Tolerance()) { if (Y() > rhs.Y()) return(false); if (Y() < rhs.Y()) return(true); } if (fabs(Z() - rhs.Z()) > Tolerance()) { if (Z() > rhs.Z()) return(false); if (Z() < rhs.Z()) return(true); } return(false); // They're equal } // End equivalence operator
std::list< CNCPoint > CDrilling::DrillBitVertices( const CNCPoint & origin, const double radius, const double length ) const { std::list<CNCPoint> top, spiral, bottom, countersink, result; double flutePitch = 5.0; // 5mm of depth per spiral of the drill bit's flute. double countersinkDepth = -1 * radius * tan(31.0); // this is the depth of the countersink cone at the end of the drill bit. (for a typical 118 degree bevel) unsigned int numPoints = 20; // number of points in one circle (360 degrees) i.e. how smooth do we want the graphics const double pi = 3.1415926; double alpha = 2 * pi / numPoints; // Get a circle at the top of the dill bit's path top = PointsAround( origin, radius, numPoints ); top.push_back( *(top.begin()) ); // Close the circle double depthPerItteration; countersinkDepth = -1 * radius * tan(31.0); // For a typical (118 degree bevel on the drill bit tip) unsigned int l_iNumItterations = numPoints * (length / flutePitch); depthPerItteration = (length - countersinkDepth) / l_iNumItterations; // Now generate the spirals. unsigned int i = 0; while( i++ < l_iNumItterations ) { double theta = alpha * i; CNCPoint pointOnCircle( cos( theta ) * radius, sin( theta ) * radius, 0 ); pointOnCircle += origin; // And spiral down as we go. pointOnCircle.SetZ( pointOnCircle.Z() - (depthPerItteration * i) ); spiral.push_back(pointOnCircle); } // End while // And now the countersink at the bottom of the drill bit. i = 0; while( i++ < numPoints ) { double theta = alpha * i; CNCPoint topEdge( cos( theta ) * radius, sin( theta ) * radius, 0 ); // This is at the top edge of the countersink topEdge.SetX( topEdge.X() + origin.X() ); topEdge.SetY( topEdge.Y() + origin.Y() ); topEdge.SetZ( origin.Z() - (length - countersinkDepth) ); spiral.push_back(topEdge); // And now at the very point of the countersink CNCPoint veryTip( origin ); veryTip.SetZ( (origin.Z() - length) ); spiral.push_back(veryTip); spiral.push_back(topEdge); } // End while std::copy( top.begin(), top.end(), std::inserter( result, result.begin() ) ); std::copy( spiral.begin(), spiral.end(), std::inserter( result, result.end() ) ); std::copy( countersink.begin(), countersink.end(), std::inserter( result, result.end() ) ); return(result); } // End DrillBitVertices() routine