summaryrefslogtreecommitdiff
path: root/2d/_collisions/polygon_polygon/snippet1.cpp
blob: 3277cf9f9205db530b925e55a1c5fda5e86f27df (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

Vector2 getProjection(Vector2* vertices, int numVertices, Vector2 axis) {
    // Find the min and max vertex projections
    float32 min = axis.dot(vertices[0]);
    float32 max = min;

    for (int v = 1; v < numVertices; v++) {
        float32 d = axis.dot(vertices[v]);

        if (d < min) {
            min = d;
        } else if (d > max) {
            max = d;
        }
    }

    return Vector2 { min, max };
}

bool projectionsOverlap(Vector2 first, Vector2 second) {
    return first.x <= second.y && second.x <= first.y;
}

bool doIntersect(ConvexPolygon* first, ConvexPolygon* second) {
    IntersectionResult ir;

    // Check agaisnt the edges of the first polygon
    for (int i = 0; i < first->numVertices; i++) {
        Vector2 normal = first->edges[i].normal;

        Vector2 firstProj = getProjection(first->transformedVertices, first->numVertices, normal);
        Vector2 secondProj = getProjection(second->transformedVertices, second->numVertices, normal);

        if (!projectionsOverlap(firstProj, secondProj)) {
            return false;
        }
    }

    // Check against the edges of the second polygon
    for (int i = 0; i < second->numVertices; i++) {
        Vector2 normal = second->edges[i].normal;

        Vector2 firstProj = getProjection(first->transformedVertices, first->numVertices, normal);
        Vector2 secondProj = getProjection(second->transformedVertices, second->numVertices, normal);

        if (!projectionsOverlap(firstProj, secondProj)) {
            return false;
        }
    }

    return true;
}