Esempio n. 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);
    }
Esempio n. 2
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);
    }
Esempio n. 3
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);
    }