Example #1
0
    static public bool point_in_triangle(Vector2f pt, Trianglef triangle)
    {
        float minX = triangle.v0.x;
        float minY = triangle.v0.y;
        float maxX = triangle.v0.x;
        float maxY = triangle.v0.y;

        minX = minX < triangle.v1.x ? minX : triangle.v1.x;
        minX = minX < triangle.v2.x ? minX : triangle.v2.x;

        minY = minY < triangle.v1.y ? minY : triangle.v1.y;
        minY = minY < triangle.v2.y ? minY : triangle.v2.y;

        maxX = maxX > triangle.v1.x ? maxX : triangle.v1.x;
        maxX = maxX > triangle.v2.x ? maxX : triangle.v2.x;

        maxY = maxY > triangle.v1.y ? maxY : triangle.v1.y;
        maxY = maxY > triangle.v2.y ? maxY : triangle.v2.y;

        if (pt.x < minX || pt.x > maxX || pt.y < minY || pt.y > maxY)
        {
            return(false);
        }

        int count = 0;

        for (uint i = 0; i < 3; i++)
        {
            LineSegf line = triangle.side(i);

            if (point_in_lineseg(pt, line))
            {
                return(true);
            }

            if (point_lineseg_side(pt, line) > 0)
            {
                if (count != 0 && count != 1)
                {
                    return(false);
                }

                count = 1;
            }
            else
            {
                if (count != 0 || count != -1)
                {
                    return(false);
                }

                count = -1;
            }
        }

        return(true);
    }
Example #2
0
    static public bool rectangle_in_rectangle_by_triangle(Vector2f p1_r1, Vector2f p2_r1,
                                                          Vector2f p3_r1, Vector2f p4_r1, Vector2f p1_r2, Vector2f p2_r2,
                                                          Vector2f p3_r2, Vector2f p4_r2)
    {
        Vector2f  center_r1 = new Vector2f((p3_r1.x + p1_r1.x) / 2, (p3_r1.y + p1_r1.y) / 2);
        Vector2f  center_r2 = new Vector2f((p3_r2.x + p1_r2.x) / 2, (p3_r2.y + p1_r2.y) / 2);
        Trianglef triangle  = new Trianglef();

        triangle.v0 = p1_r1;
        triangle.v1 = p2_r1;
        triangle.v2 = p3_r1;

        if (point_in_triangle(center_r2, triangle))
        {
            return(true);
        }

        triangle.v0 = p1_r1;
        triangle.v1 = p4_r1;
        triangle.v2 = p3_r1;

        if (point_in_triangle(center_r2, triangle))
        {
            return(true);
        }

        triangle.v0 = p1_r2;
        triangle.v1 = p2_r2;
        triangle.v2 = p3_r2;

        if (point_in_triangle(center_r1, triangle))
        {
            return(true);
        }

        triangle.v0 = p1_r2;
        triangle.v1 = p4_r2;
        triangle.v2 = p3_r2;

        if (point_in_triangle(center_r1, triangle))
        {
            return(true);
        }

        return(false);
    }
Example #3
0
    static public bool circle_intersect_triangle(Vector2f center, float radius, Trianglef triangle)
    {
        if (Geometryalgorithm2d.point_in_triangle(center, triangle))
        {
            return(true);
        }

        for (uint i = 0; i < 3; i++)
        {
            LineSegf line = triangle.side(i);

            Vector2f pt = Geometryalgorithm2d.point_line_intersect(center, line);

            float distance = pt.Subtract(center).length();
            if (distance < radius)
            {
                return(true);
            }
        }

        return(false);
    }
Example #4
0
    static public bool lineseg_intersect_triangle(LineSegf lineseg, Trianglef triangle)
    {
        if (point_in_triangle(lineseg.vertex0, triangle))
        {
            return(true);
        }

        if (point_in_triangle(lineseg.vertex1, triangle))
        {
            return(true);
        }

        for (uint j = 0; j < 3; j++)
        {
            if (lineseg_intersect_lineseg(lineseg, triangle.side(j)))
            {
                return(true);
            }
        }

        return(false);
    }
Example #5
0
    static public bool lineseg_intersect_rectangle_by_triangle(Vector2f p1_l1, Vector2f p2_l1,
                                                               Vector2f p1_r2, Vector2f p2_r2,
                                                               Vector2f p3_r2, Vector2f p4_r2)
    {
        Trianglef triangle = new Trianglef();

        triangle.v0 = p1_r2;
        triangle.v1 = p2_r2;
        triangle.v2 = p3_r2;

        if (point_in_triangle(p1_l1, triangle))
        {
            return(true);
        }

        triangle.v0 = p1_r2;
        triangle.v1 = p4_r2;
        triangle.v2 = p3_r2;

        if (point_in_triangle(p1_l1, triangle))
        {
            return(true);
        }

        triangle.v0 = p1_r2;
        triangle.v1 = p2_r2;
        triangle.v2 = p3_r2;

        if (point_in_triangle(p2_l1, triangle))
        {
            return(true);
        }

        triangle.v0 = p1_r2;
        triangle.v1 = p4_r2;
        triangle.v2 = p3_r2;

        if (point_in_triangle(p2_l1, triangle))
        {
            return(true);
        }

        LineSegf l1 = new LineSegf();
        LineSegf l2 = new LineSegf();

        l1.vertex0 = p1_l1;
        l1.vertex1 = p2_l1;

        l2.vertex0 = p1_r2;
        l2.vertex1 = p2_r2;

        if (lineseg_intersect_lineseg(l1, l2))
        {
            return(true);
        }

        l2.vertex0 = p2_r2;
        l2.vertex1 = p3_r2;

        if (lineseg_intersect_lineseg(l1, l2))
        {
            return(true);
        }

        l2.vertex0 = p3_r2;
        l2.vertex1 = p4_r2;

        if (lineseg_intersect_lineseg(l1, l2))
        {
            return(true);
        }

        l2.vertex0 = p4_r2;
        l2.vertex1 = p1_r2;

        if (lineseg_intersect_lineseg(l1, l2))
        {
            return(true);
        }

        return(false);
    }
 public void printTriangleWireframe(Trianglef triangle, Vec3f color)
 {
     printLine(new Linef(triangle.v0, triangle.v1), color);
     printLine(new Linef(triangle.v1, triangle.v2), color);
     printLine(new Linef(triangle.v2, triangle.v0), color);
 }