1
0
Fork 0
mirror of https://git.coom.tech/drummyfish/raycastlib.git synced 2024-11-21 20:29:59 +01:00

Add sin and cos

This commit is contained in:
Miloslav Číž 2018-08-23 09:25:34 +02:00
parent 126f38e5c0
commit b973df588b
2 changed files with 50 additions and 1 deletions

View file

@ -11,7 +11,6 @@
- X axis goes right. - X axis goes right.
- Y axis goes up. - Y axis goes up.
- Each game square is UNITS_PER_SQUARE * UNITS_PER_SQUARE. - Each game square is UNITS_PER_SQUARE * UNITS_PER_SQUARE.
*/ */
#define UNITS_PER_SQUARE 1024 #define UNITS_PER_SQUARE 1024
@ -84,6 +83,11 @@ void castRayMultiHit(Ray ray, int16_t (*arrayFunc)(int16_t, int16_t),
uint16_t maxSteps, HitResult *hitResults, uint16_t *hitResultsLen, uint16_t maxSteps, HitResult *hitResults, uint16_t *hitResultsLen,
uint16_t maxHits); uint16_t maxHits);
Unit cosInt(Unit input);
Unit sinInt(Unit input);
uint16_t sqrtInt(uint32_t value);
Unit dist(Vector2D p1, Vector2D p2);
//============================================================================= //=============================================================================
// privates // privates
@ -98,6 +102,35 @@ Unit clamp(Unit value, Unit valueMin, Unit valueMax)
return value; return value;
} }
// Bhaskara's cosine approximation formula
#define trigHelper(x) (UNITS_PER_SQUARE *\
(UNITS_PER_SQUARE / 2 * UNITS_PER_SQUARE / 2 - 4 * (x) * (x)) /\
(UNITS_PER_SQUARE / 2 * UNITS_PER_SQUARE / 2 + (x) * (x)))
Unit cosInt(Unit input)
{
input = input % UNITS_PER_SQUARE;
if (input < 0)
input = UNITS_PER_SQUARE + input;
if (input < UNITS_PER_SQUARE / 4)
return trigHelper(input);
else if (input < UNITS_PER_SQUARE / 2)
return -1 * trigHelper(UNITS_PER_SQUARE / 2 - input);
else if (input < 3 * UNITS_PER_SQUARE / 4)
return -1 * trigHelper(input - UNITS_PER_SQUARE / 2);
else
return trigHelper(UNITS_PER_SQUARE - input);
}
#undef trigHelper
Unit sinInt(Unit input)
{
return cosInt(input - UNITS_PER_SQUARE / 2);
}
uint16_t sqrtInt(uint32_t value) uint16_t sqrtInt(uint32_t value)
{ {
uint32_t result = 0; uint32_t result = 0;

16
test.c
View file

@ -1,3 +1,9 @@
/**
Tests for raycastlib.
license: CC0
*/
#include <stdio.h> #include <stdio.h>
#include "raycastlib.h" #include "raycastlib.h"
@ -70,5 +76,15 @@ int main()
16)) 16))
return 1; return 1;
for (Unit i = -UNITS_PER_SQUARE; i <= UNITS_PER_SQUARE; i += 64)
{
Unit v = sinInt(i);
for (int j = 0; j < (v + UNITS_PER_SQUARE) / 64; ++j)
printf(".");
printf("\n");
}
return 0; return 0;
} }