From e4146267fa1a71fe0aaadbc8aadcfdd58eb9deed Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 16 Nov 2013 18:56:02 -0800 Subject: [PATCH] Fixed bug 2245 - add SDL_acos and SDL_asin Sylvain Here's some code to add arc cosine, and arc sin functions to SDL_stdlib.c There are plainly written using SDL_atan. --- include/SDL_stdinc.h | 2 ++ src/libm/s_atan.c | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/SDL_stdinc.h b/include/SDL_stdinc.h index f0780a21796ff..9a421ba63d424 100644 --- a/include/SDL_stdinc.h +++ b/include/SDL_stdinc.h @@ -340,6 +340,8 @@ extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char #endif #endif +extern DECLSPEC double SDLCALL SDL_acos(double x); +extern DECLSPEC double SDLCALL SDL_asin(double x); extern DECLSPEC double SDLCALL SDL_atan(double x); extern DECLSPEC double SDLCALL SDL_atan2(double x, double y); extern DECLSPEC double SDLCALL SDL_ceil(double x); diff --git a/src/libm/s_atan.c b/src/libm/s_atan.c index f664f0eb3d475..2f24b29b08923 100644 --- a/src/libm/s_atan.c +++ b/src/libm/s_atan.c @@ -112,3 +112,29 @@ double atan(double x) } } libm_hidden_def(atan) + +double SDL_acos(double val) +{ + double result; + if (val == -1.0) { + result = M_PI; + } else { + result = SDL_atan(SDL_sqrt(1.0 - val * val) / val); + if (result < 0.0) + { + result += M_PI; + } + } + return result; +} + +double SDL_asin(double val) +{ + double result; + if (val == -1.0) { + result = -(M_PI / 2.0); + } else { + result = (M_PI / 2.0) - SDL_acos(val); + } + return result; +}