增加LAtan.cpp/LSinCos.cpp

This commit is contained in:
2020-11-04 11:18:22 +08:00
parent 5d75e138b5
commit be48e1147a
3 changed files with 121 additions and 0 deletions

View File

@@ -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
View 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
View 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