示例#1
0
        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();
        }
示例#2
0
        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);
        }
示例#3
0
        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));
            }
        }
示例#4
0
 //-Utils
 public bool isAngleAchievable(float inAngle) {
     float theNormalizedAngle = XMath.getNormalizedAngle(inAngle);
     float theDelta = XMath.getNormalizedAnglesClockwiseDelta(getLimitFrom(), theNormalizedAngle);
     return theDelta < getLimitingAngle() || Mathf.Approximately(theDelta, getLimitingAngle());
 }
示例#5
0
 public float getLimitingAngle() {
     return XMath.getNormalizedAnglesClockwiseDelta(getLimitFrom(), getLimitTo());
 }