aboutsummaryrefslogtreecommitdiff
path: root/src/Math/Box2f.c
blob: bd6eb73f949c9049c29f24414bde97541264e2c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <BH/Math.h>
#include <string.h>


#define EPSILON 0.00001f
#define PI      3.14159265358979323846f


void BH_Box2fUnion(const float *aMin,
                   const float *aMax,
                   const float *bMin,
                   const float *bMax,
                   float *outMin,
                   float *outMax)
{
    BH_Vec2fMin(aMin, bMin, outMin);
    BH_Vec2fMax(aMax, bMax, outMax);
}


int BH_Box2fIntersect(const float *aMin,
                      const float *aMax,
                      const float *bMin,
                      const float *bMax,
                      float *outMin,
                      float *outMax)
{
    BH_Vec2fMax(aMin, bMin, outMin);
    BH_Vec2fMin(aMax, bMax, outMax);

    if (outMin[0] >= outMax[0] || outMin[1] >= outMax[1])
        return BH_ERROR;

    return BH_OK;
}


int BH_Box2fContains(const float *aMin,
                     const float *aMax,
                     const float *point)
{
    if (point[0] < aMin[0] || point[1] < aMin[1])
        return BH_ERROR;

    if (point[0] > aMax[0] || point[1] > aMax[1])
        return BH_ERROR;

    return BH_OK;
}


int BH_Box2fEnclose(const float *points,
                    size_t size,
                    float *outMin,
                    float *outMax)
{
    float tmp1[2], tmp2[2];
    size_t i;

    if (!size)
        return BH_ERROR;

    memcpy(tmp1, points, sizeof(tmp1));
    memcpy(tmp2, points, sizeof(tmp2));

    for (i = 1; i < size; i++)
    {
        BH_Vec2fMin(tmp1, points + i * 2, tmp1);
        BH_Vec2fMax(tmp2, points + i * 2, tmp2);
    }

    memcpy(outMin, tmp1, sizeof(tmp1));
    memcpy(outMax, tmp2, sizeof(tmp2));
    return BH_OK;
}