Example #1
0
    /// <summary>
    /// 求两个多边形差集
    /// </summary>
    /// <param name="poly1"></param>
    /// <param name="poly2"></param>
    /// <param name="interPoly"></param>
    /// <returns></returns>
    public static bool PolygonClip(List<Vector2> poly1, List<Vector2> poly2, out List<Vector2> interPoly)
    {
        interPoly = new List<Vector2>();

        if (poly1.Count < 3 || poly2.Count < 3)
        {
            return false;
        }

        Vector2 point;
        //计算多边形交点
        for (int i = 0; i < poly1.Count; i++)
        {
            int poly1_next_idx = (i + 1) % poly1.Count;
            for (int j = 0; j < poly2.Count; j++)
            {
                int poly2_next_idx = (j + 1) % poly2.Count;
                if (ImageUtil.GetIntersection(poly1[i], poly1[poly1_next_idx],
                    poly2[j], poly2[poly2_next_idx],
                    out point))
                {
                    interPoly.Add(point);
                }
            }
        }

        //计算多边形内部点
        for (int i = 0; i < poly1.Count; i++)
        {
            if (ImageUtil.Contains(poly1[i], poly2))
            {
                interPoly.Add(poly1[i]);
            }
        }
        for (int i = 0; i < poly2.Count; i++)
        {
            if (ImageUtil.Contains(poly2[i], poly1))
            {
                interPoly.Add(poly2[i]);
            }
        }

        if (interPoly.Count <= 0)
            return false;

        //点集排序
        interPoly = EdgeUtil.CreateConvexOutside(interPoly);
        return true;
    }