diff options
Diffstat (limited to 'test/src/TestRay2f.c')
| -rw-r--r-- | test/src/TestRay2f.c | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/test/src/TestRay2f.c b/test/src/TestRay2f.c new file mode 100644 index 0000000..811cd96 --- /dev/null +++ b/test/src/TestRay2f.c @@ -0,0 +1,196 @@ +#include <BH/Math.h> +#include <BH/Unit.h> + + +#define ACCEPTABLE_DELTA 0.0001f + + +BH_UNIT_TEST(RayIntersectLine) +{ + float a[2], b[2], p[2], d[2], r[3]; + float time; + + a[0] = 4.0000f; a[1] = 9.0000f; + b[0] = 2.0000f; b[1] = 5.0000f; + + p[0] = -5.0000f; p[1] = 3.0000f; + d[0] = 0.8944f; d[1] = 0.4472f; + + BH_VERIFY(BH_LineFromPoints(a, b, r) == BH_OK); + BH_VERIFY(BH_Ray2fIntersectLine(p, d, r, &time, r) == BH_OK); + + BH_VERIFY_DELTA(time, 8.9443f, ACCEPTABLE_DELTA * 10); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + BH_Vec2fScale(d, time, r); + BH_Vec2fAdd(p, r, r); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + d[0] = -2.0000f; d[1] = -4.0000f; + BH_VERIFY(BH_LineFromPoints(a, b, r) == BH_OK); + BH_VERIFY(BH_Ray2fIntersectLine(p, d, r, &time, r) != BH_OK); + + return 0; +} + + +BH_UNIT_TEST(RayIntersectRay) +{ + float p1[2], d1[2], p2[2], d2[2], r[2]; + float time; + + p1[0] = -5.0000f; p1[1] = 3.0000f; + d1[0] = 0.8944f; d1[1] = 0.4472f; + + p2[0] = 4.0000f; p2[1] = 9.0000f; + d2[0] = -0.4472f; d2[1] =-0.8944f; + + BH_VERIFY(BH_Ray2fIntersectRay(p1, d1, p2, d2, &time, r) == BH_OK); + + BH_VERIFY_DELTA(time, 8.9443f, ACCEPTABLE_DELTA * 10); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + BH_Vec2fScale(d1, time, r); + BH_Vec2fAdd(p1, r, r); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY(BH_Ray2fIntersectRay(p1, d1, p2, d1, &time, r) != BH_OK); + + d1[0] = 0.0000f; d1[1] = 1.0000f; + BH_VERIFY(BH_Ray2fIntersectRay(p1, d1, p2, d2, &time, r) != BH_OK); + + return 0; +} + + +BH_UNIT_TEST(RayIntersectSegment) +{ + float p[2], d[2], a[2], b[2], r[2]; + float time; + + p[0] = -5.0000f; p[1] = 3.0000f; + d[0] = 0.8944f; d[1] = 0.4472f; + + a[0] = 4.0000f; a[1] = 9.0000f; + b[0] = 2.0000f; b[1] = 5.0000f; + + BH_VERIFY(BH_Ray2fIntersectSegment(p, d, a, b, &time, r) == BH_OK); + + BH_VERIFY_DELTA(time, 8.9443f, ACCEPTABLE_DELTA * 10); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + BH_Vec2fScale(d, time, r); + BH_Vec2fAdd(p, r, r); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + d[0] = -2.0000f; d[1] = -4.0000f; + BH_VERIFY(BH_Ray2fIntersectSegment(p, d, a, b, &time, r) != BH_OK); + + d[0] = 1.0000f; d[1] = 0.0000f; + BH_VERIFY(BH_Ray2fIntersectSegment(p, d, a, b, &time, r) != BH_OK); + + return 0; +} + + +BH_UNIT_TEST(SegmentIntersectLine) +{ + float a1[2], b1[2], a2[2], b2[2], r[3]; + float time; + + a1[0] = -5.0000f; a1[1] = 3.0000f; + b1[0] = 5.0000f; b1[1] = 8.0000f; + + a2[0] = 4.0000f; a2[1] = 9.0000f; + b2[0] = 2.0000f; b2[1] = 5.0000f; + + BH_VERIFY(BH_LineFromPoints(a2, b2, r) == BH_OK); + BH_VERIFY(BH_Segment2fIntersectLine(a1, b1, r, &time, r) == BH_OK); + + BH_VERIFY_DELTA(time, 0.8000f, ACCEPTABLE_DELTA * 10); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + BH_Vec2fLerp(a1, b1, time, r); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + return 0; +} + + +BH_UNIT_TEST(SegmentIntersectSegment) +{ + float a1[2], b1[2], a2[2], b2[2], r[2]; + float time; + + a1[0] = -5.0000f; a1[1] = 3.0000f; + b1[0] = 5.0000f; b1[1] = 8.0000f; + + a2[0] = 4.0000f; a2[1] = 9.0000f; + b2[0] = 2.0000f; b2[1] = 5.0000f; + + BH_VERIFY(BH_Segment2fIntersectSegment(a1, b1, a2, b2, &time, r) == BH_OK); + + BH_VERIFY_DELTA(time, 0.8000f, ACCEPTABLE_DELTA * 10); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + BH_Vec2fLerp(a1, b1, time, r); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + return 0; +} + + +BH_UNIT_TEST(Time) +{ + float a1[2], b1[2], a2[2], b2[2], r[2]; + float time1, time2; + + a1[0] = -5.0000f; a1[1] = 3.0000f; + b1[0] = 10.0000f; b1[1] = 5.0000f; + + a2[0] = 4.0000f; a2[1] = 9.0000f; + b2[0] = -2.0000f; b2[1] =-4.0000f; + + BH_VERIFY(BH_Ray2fIntersectTime(a1, b1, a2, b2, &time1, &time2) == BH_OK); + + BH_VERIFY_DELTA(time1, 0.8000f, ACCEPTABLE_DELTA * 10); + BH_VERIFY_DELTA(time2, 0.5000f, ACCEPTABLE_DELTA * 10); + + BH_Vec2fScale(b1, time1, r); + BH_Vec2fAdd(a1, r, r); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + BH_Vec2fScale(b2, time2, r); + BH_Vec2fAdd(a2, r, r); + BH_VERIFY_DELTA(r[0], 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r[1], 7.0000f, ACCEPTABLE_DELTA); + + return 0; +} + + +int main(int argc, char **argv) +{ + (void)argc; + (void)argv; + + BH_UNIT_ADD(RayIntersectLine); + BH_UNIT_ADD(RayIntersectRay); + BH_UNIT_ADD(RayIntersectSegment); + BH_UNIT_ADD(SegmentIntersectLine); + BH_UNIT_ADD(SegmentIntersectSegment); + BH_UNIT_ADD(Time); + + return BH_UnitRun(); +} |
