Esempio n. 1
0
//********************************************
// 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
}