//******************************************** // sharp // threshold : sin(angle) //******************************************** int CEdge3d::sharp(float threshold) { // Check if(m_pFace1 == NULL || m_pFace2 == NULL) return 0; return (SinAngle(m_pFace1,m_pFace2) >= threshold); }
static void leaveOrbit (float myState[12], float asteroidLoc[3], float mPanel[3]) { //BEGIN::PROC::leaveOrbit #define SinAngle(a, b) sqrt(1 - mathSquare(mathVecInner((a), (b), 3)/(mathVecMagnitude((a), 3) * mathVecMagnitude((b), 3)))) float targetVel[3]; float r, toMS; float desiredMag; float vecToAst[3]; float vecToMS[3]; int i; for(i = 0; i < 3; i++){ vecToAst[i] = asteroidLoc[i] - myState[i]; vecToMS[i] = mPanel[i] - myState[i]; } toMS = mathVecMagnitude(vecToMS, 3); r = sqrt(mathVecInner(vecToAst, vecToAst, 3)); for(i = 0; i < 3; i++) targetVel[i] = mPanel[i] - myState[i]; if(toMS < .19){ if(mathVecMagnitude(&myState[3], 3) > 0.01) desiredMag = 0.002; else desiredMag = 0.01; } else if(toMS < 0.25) desiredMag = toMS/12; else if(toMS < 0.35) desiredMag = toMS/7; else desiredMag = r*3.141592/(45*SinAngle(vecToAst, &myState[3])); if(desiredMag > toMS/6) desiredMag = toMS/6; mathVecNormalize(targetVel, 3); for(i = 0; i < 3; i++) targetVel[i] *= desiredMag; ZRSetVelocityTarget(targetVel); //ZRSetAttitudeTarget(att); //END::PROC::leaveOrbit }