Основная математическая формула для вычисления угла между двумя векторами как таковой:
Рассмотрим & б быть векторами.
точка Ь = абс (а) * абс (б) * COS (угол)
-> COS-1 ((точка б)/(абс (а) * абс (б))
Даже если вы работаете в JavaScript концепция делает вычисления одинаковы: что я могу сделать для вас будет показать вам функции из моего класса Vector3, которые написаны на C++
// -----------------------------------------------------------------------
// GetCosAngle()
// Returns The cos(Angle) Value Between This Vector And Vector V. This
// Is Less Expensive Than Using GetAngle
inline float Vector3::GetCosAngle(const Vector3 &v3, const bool bNormalized) {
// a . b = |a||b|cos(angle)
// -> cos-1((a.b)/(|a||b|))
// Make Sure We Do Not Divide By Zero
float fMagA = Length();
if (fMagA <= Math::ZERO) {
// This (A) Is An Invalid Vector
return 0;
}
float fValue = 0;
if (bNormalized) {
// v3 Is Already Normalized
fValue = Dot(v3)/fMagA;
}
else {
float fMagB = v3.Length();
if (fMagB <= Math::ZERO) {
// B Is An Invalid Vector
return 0;
}
fValue = Dot(v3)/(fMagA*fMagB);
}
// Correct Value Due To Rounding Problem
Math::Constrain(-1.0f, 1.0f, fValue);
return fValue;
} // GetCosAngle
// -----------------------------------------------------------------------
// GetAngle()
// Returns The Angle Between This Vector And Vector V in Radians.
// This Is More Expensive Than Using GetCosAngle
inline float Vector3::GetAngle(const Vector3 &v3, const bool bNormalized, bool bRadians) {
// a . b = |a||b|cos(angle)
// -> cos-1((a.b)/(|a||b|))
if (bRadians) {
return acos(this->GetCosAngle(v3));
}
else {
// Convert To Degrees
return Math::Radian2Degree(acos(GetCosAngle(v3, bNormalized)));
}
} // GetAngle
Здесь являются дополнительными функциями из класса Vector3, которые используются для выполнения этих вычислений нс:
// -----------------------------------------------------------------------
// Length()
// Return The Length Of This Vector
inline float Vector3::Length() const {
return sqrtf(_fX * _fX +
_fY * _fY +
_fZ * _fZ);
} // Length
// -----------------------------------------------------------------------
// Dot()
// Return The Dot Product Between This Vector And Another One
inline float Vector3::Dot(const Vector3 v3) const {
return (_fX * v3._fX +
_fY * v3._fY +
_fZ * v3._fZ);
} // Dot
Вот мои математические функции и значение, которые используются в этих расчетах:
const float Math::PI = 4.0f * atan(1.0f); // tan(pi/4) = 1
const float Math::PI_INVx180 = 180.0f/Math::PI;
const float Math::ZERO = (float)1e-7;
// -----------------------------------------------------------------------
// Constrain()
// Prevent Value From Going Outside The Min, Max Range.
template<class T>
inline void Math::Constrain(T min, T max, T &value) {
if (value < min) {
value = min;
return;
}
if (value > max) {
value = max;
}
} // Constrain
/-----------------------------------------------------------------------
// Radian2Degree()
// Convert Angle In Radians To Degrees
inline float Math::Radian2Degree(float fRadians) {
return fRadians * PI_INVx180;
} // Radian2Degree
Теперь, как я уже говорил они принадлежат к нескольким моим C++ классов, которые находятся в пределах одного моей математики библиотеки. Это используется как демонстрация того, как можно вычислить угол между двумя векторами.
танка я попытаюсь что :) – Bobby