增加LAtan.cpp/LSinCos.cpp
This commit is contained in:
@@ -4,6 +4,19 @@ file(GLOB TYPE_TEMPLATE_HEADER ${TYPE_INCLUDE_PATH}/*.h)
|
||||
|
||||
SET(SYSTEM_INFO_SOURCE SystemInfo.cpp)
|
||||
|
||||
##Math--------------------------------------------------------
|
||||
SET(MATH_HEADER_FILES ${TYPE_INCLUDE_PATH}/bvec.h
|
||||
${TYPE_INCLUDE_PATH}/FastTriangle.h
|
||||
${TYPE_INCLUDE_PATH}/Math.h
|
||||
${TYPE_INCLUDE_PATH}/Matrix.h
|
||||
${TYPE_INCLUDE_PATH}/Vector.h)
|
||||
|
||||
SET(MATH_SOURCE_FILES Math/LAtan.cpp
|
||||
Math/LSinCos.cpp)
|
||||
|
||||
SOURCE_GROUP("Math\\Header Files" FILES ${MATH_HEADER_FILES})
|
||||
SOURCE_GROUP("Math\\Source Files" FILES ${MATH_SOURCE_FILES})
|
||||
|
||||
##Color--------------------------------------------------------
|
||||
SET(COLOR_HEADER_FILES ${TYPE_INCLUDE_PATH}/Color.h
|
||||
${TYPE_INCLUDE_PATH}/Color3f.h
|
||||
@@ -140,6 +153,9 @@ add_cm_library(CMCore "CM" #${SYSTEM_INFO_SOURCE}
|
||||
|
||||
${IO_SOURCE_FILES}
|
||||
|
||||
${MATH_HEADER_FILES}
|
||||
${MATH_SOURCE_FILES}
|
||||
|
||||
${FILESYSTEM_HEADER_FILES}
|
||||
${FILESYSTEM_SOURCE_FILES}
|
||||
|
||||
|
35
src/Math/LAtan.cpp
Normal file
35
src/Math/LAtan.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
#include<hgl/algorithm/VectorMath.h>
|
||||
#include<cmath>
|
||||
namespace hgl
|
||||
{
|
||||
namespace algorithm
|
||||
{
|
||||
/**
|
||||
* fast atan2
|
||||
* from: Jim Shima
|
||||
* date: 1999/04/23
|
||||
*/
|
||||
double Latan2(double y, double x)
|
||||
{
|
||||
double abs_y = fabs(y) + 1e-10; // kludge to prevent 0/0 condition
|
||||
double angle;
|
||||
double r;
|
||||
|
||||
if (x >= 0)
|
||||
{
|
||||
r = (x - abs_y) / (x + abs_y);
|
||||
angle = HGL_PI_4 - HGL_PI_4 * r;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = (x + abs_y) / (abs_y - x);
|
||||
angle = HGL_PI_3_4 - HGL_PI_4 * r;
|
||||
}
|
||||
|
||||
if (y < 0)
|
||||
return (-angle); // negate if in quad III or IV
|
||||
else
|
||||
return (angle);
|
||||
}
|
||||
}//namespace algorithm
|
||||
}//namespace hgl
|
70
src/Math/LSinCos.cpp
Normal file
70
src/Math/LSinCos.cpp
Normal file
@@ -0,0 +1,70 @@
|
||||
namespace hgl
|
||||
{
|
||||
namespace algorithm
|
||||
{
|
||||
constexpr unsigned int SINV[91] = { 0,
|
||||
17452406, 34899496, 52335956, 69756473, 87155742, 104528463,
|
||||
121869343, 139173100, 156434465, 173648177, 190808995, 207911690,
|
||||
224951054, 241921895, 258819045, 275637355, 292371704, 309016994,
|
||||
325568154, 342020143, 358367949, 374606593, 390731128, 406736643,
|
||||
422618261, 438371146, 453990499, 469471562, 484809620, 500000000,
|
||||
515038074, 529919264, 544639035, 559192903, 573576436, 587785252,
|
||||
601815023, 615661475, 629320391, 642787609, 656059028, 669130606,
|
||||
681998360, 694658370, 707106781, 719339800, 731353701, 743144825,
|
||||
754709580, 766044443, 777145961, 788010753, 798635510, 809016994,
|
||||
819152044, 829037572, 838670567, 848048096, 857167300, 866025403,
|
||||
874619707, 882947592, 891006524, 898794046, 906307787, 913545457,
|
||||
920504853, 927183854, 933580426, 939692620, 945518575, 951056516,
|
||||
956304755, 961261695, 965925826, 970295726, 974370064, 978147600,
|
||||
981627183, 984807753, 987688340, 990268068, 992546151, 994521895,
|
||||
996194698, 997564050, 998629534, 999390827, 999847695, 1000000000 };
|
||||
|
||||
double Lsin(int angle)
|
||||
{
|
||||
double sf;
|
||||
|
||||
if (angle > 360 || angle < -360)angle = angle - (angle / 360) * 360;
|
||||
if (angle < 0)angle = 360 + angle;
|
||||
if (angle > 180)sf = -1; else sf = 1;
|
||||
|
||||
if (angle > 90 && angle <= 180)angle = 180 - angle; else
|
||||
if (angle > 180 && angle <= 270)angle = angle - 180; else
|
||||
if (angle > 270)angle = 360 - angle;
|
||||
|
||||
return sf*SINV[angle] / 10.0e8;
|
||||
}
|
||||
|
||||
double Lcos(int angle)
|
||||
{
|
||||
double cf;
|
||||
|
||||
if (angle > 360 || angle < -360)angle = angle - (angle / 360) * 360;
|
||||
if (angle < 0)angle = 360 + angle;
|
||||
if (angle < 270 && angle>90)cf = -1; else cf = 1;
|
||||
|
||||
if (angle > 90 && angle <= 180)angle = 180 - angle; else
|
||||
if (angle > 180 && angle <= 270)angle = angle - 180; else
|
||||
if (angle > 270)angle = 360 - angle;
|
||||
|
||||
return cf*SINV[90 - angle] / 10.0e8;
|
||||
}
|
||||
|
||||
void Lsincos(int angle, double &s, double &c)
|
||||
{
|
||||
double sf;
|
||||
double cf;
|
||||
|
||||
if (angle > 360 || angle < -360)angle = angle - (angle / 360) * 360;
|
||||
if (angle < 0)angle = 360 + angle;
|
||||
if (angle > 180)sf = -1; else sf = 1;
|
||||
if (angle < 270 && angle>90)cf = -1; else cf = 1;
|
||||
|
||||
if (angle > 90 && angle <= 180)angle = 180 - angle; else
|
||||
if (angle > 180 && angle <= 270)angle = angle - 180; else
|
||||
if (angle > 270)angle = 360 - angle;
|
||||
|
||||
s = sf*SINV[angle] / 10.0e8;
|
||||
c = cf*SINV[90 - angle] / 10.0e8;
|
||||
}
|
||||
}//namespace algorithm
|
||||
}//namespace hgl
|
Reference in New Issue
Block a user