public float getNearestLimitForAngle(float inAngle) { float theNormalizedAngle = XMath.getNormalizedAngle(inAngle); float theDeltaToAchieveFromLimit = 0.0f; float theDeltaToAchieveToLimit = 0.0f; if (isAngleAchievable(inAngle)) { theDeltaToAchieveFromLimit = XMath.getNormalizedAnglesClockwiseDelta(getLimitFrom(), theNormalizedAngle); theDeltaToAchieveToLimit = XMath.getNormalizedAnglesClockwiseDelta(theNormalizedAngle, getLimitTo()); } else { theDeltaToAchieveFromLimit = XMath.getNormalizedAnglesClockwiseDelta(theNormalizedAngle, getLimitFrom()); theDeltaToAchieveToLimit = XMath.getNormalizedAnglesClockwiseDelta(getLimitTo(), theNormalizedAngle); } return theDeltaToAchieveFromLimit < theDeltaToAchieveToLimit ? getLimitFrom() : getLimitTo(); }
public float changeAngle(float inValueDelta) { if (Mathf.Approximately(inValueDelta, 0.0f)) return 0.0f; float theOldAngle = _state.Angle; float theNewAngle = XMath.getNormalizedAngle(_state.Angle + inValueDelta); float theDelta = XMath.getNormalizedAnglesClockwiseDelta(getLimitFrom(), theNewAngle); float theDirectedDelta = XMath.getNormalizedAngle(theDelta); if (!isUnlimited() && theDirectedDelta < 0.0f) { _state.Angle = getLimitFrom(); } else if (!isUnlimited() && theDirectedDelta > getLimitingAngle()) { _state.Angle = getLimitTo(); } else { _state.Angle = theNewAngle; } return XMath.getNormalizedAngle(_state.Angle - theOldAngle); }
public float getDiractionToAchieveAngle(float inAngleToAchieve) { float theCurrentAngle = getAngle(); float theAngleToAchieve = XMath.getNormalizedAngle(inAngleToAchieve); if (Mathf.Approximately(theCurrentAngle, theAngleToAchieve)) return 0.0f; if (isAngleAchievable(theAngleToAchieve)) { float theNearestDiraction = XMath.getNormalizedAngle(theAngleToAchieve - theCurrentAngle); if (isUnlimited()) return theNearestDiraction > 0.0f ? 1.0f : -1.0f; if (theNearestDiraction > 0.0f) { float theTestAngle = XMath.getNormalizedAnglesClockwiseDelta(getLimitFrom(), theCurrentAngle); theTestAngle += XMath.getNormalizedAnglesClockwiseDelta(theCurrentAngle, theAngleToAchieve); return theTestAngle < getLimitingAngle() || Mathf.Approximately(theTestAngle, getLimitingAngle()) ? 1.0f : -1.0f; } else { float theTestAngle = XMath.getNormalizedAnglesClockwiseDelta(getLimitFrom(), theCurrentAngle); theTestAngle -= XMath.getNormalizedAnglesClockwiseDelta(getLimitFrom(), theAngleToAchieve); return theTestAngle > 0.0f || Mathf.Approximately(theTestAngle, 0.0f) ? -1.0f : 1.0f; } } else { return getDiractionToAchieveAngle(getNearestLimitForAngle(inAngleToAchieve)); } }
//-Utils public bool isAngleAchievable(float inAngle) { float theNormalizedAngle = XMath.getNormalizedAngle(inAngle); float theDelta = XMath.getNormalizedAnglesClockwiseDelta(getLimitFrom(), theNormalizedAngle); return theDelta < getLimitingAngle() || Mathf.Approximately(theDelta, getLimitingAngle()); }
public float getLimitingAngle() { return XMath.getNormalizedAnglesClockwiseDelta(getLimitFrom(), getLimitTo()); }