📄 polar.cpp
字号:
//===========================================================================//
// File: rotation.cc //
// Contents: Implementation details for rotation classes //
//---------------------------------------------------------------------------//
// Copyright (C) Microsoft Corporation. All rights reserved. //
//===========================================================================//
#include "StuffHeaders.hpp"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ YawPitchRange ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const YawPitchRange
YawPitchRange::Identity(0.0f,0.0f,0.0f);
//
//#############################################################################
//#############################################################################
//
YawPitchRange&
YawPitchRange::operator=(const Vector3D &vector)
{
Check_Pointer(this);
Check_Object(&vector);
//
//------------------------------------------------------------------------
// See if we have a zero length vector. If so, convert it to the identity
//------------------------------------------------------------------------
//
Verify(
Vector3D::Forward.z == 1.0f && Vector3D::Left.x == 1.0f && Vector3D::Up.y == 1.0f
);
Scalar sub_range = vector.x*vector.x + vector.z*vector.z;
range = Sqrt(sub_range + vector.y*vector.y);
if (Small_Enough(range))
{
yaw = 0.0f;
pitch = 0.0f;
}
else
{
//
//---------------------------------------------------------------------
// Isolate the yaw element. If the vector is vertical, yaw will simply
// be zero. If not, the yaw will indicate counter-clockwise deviation
// from the negative Z axis
//---------------------------------------------------------------------
//
sub_range = Sqrt(sub_range);
if (Small_Enough(sub_range))
{
yaw = 0.0f;
pitch = (vector.y > 0.0f) ? -Pi_Over_2 : Pi_Over_2;
}
else
{
yaw = Arctan(vector.x, vector.z);
pitch = -Arctan(vector.y, sub_range);
}
}
return *this;
}
//
//#############################################################################
//#############################################################################
//
bool
Stuff::Small_Enough(
const YawPitchRange& angles,
Scalar e
)
{
Check_Object(&angles);
return
Small_Enough(angles.pitch,e)
&& Small_Enough(angles.yaw,e)
&& Small_Enough(angles.range,e);
}
//
//#############################################################################
//#############################################################################
//
bool
Stuff::Close_Enough(
const YawPitchRange& a1,
const YawPitchRange& a2,
Scalar e
)
{
Check_Object(&a1);
Check_Object(&a2);
return
Close_Enough(a1.pitch,a2.pitch,e)
&& Close_Enough(a1.yaw,a2.yaw,e)
&& Close_Enough(a1.range,a2.range,e);
}
//
//#############################################################################
//#############################################################################
//
#if !defined(Spew)
void
Spew(
const char* group,
const YawPitchRange &angle
)
{
SPEW((group, "<+"));
Spew(group, angle.yaw);
SPEW((group, ",+"));
Spew(group, angle.pitch);
SPEW((group, "; %f+", angle.range));
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -