Example #1
0
 public static float Cross(Vector2 a, Vector2 b)
 {
     return(GeometryHelpers.CrossProduct(a.x, a.y, b.x, b.y));
 }
Example #2
0
        public IEnumerable <Polygon> Cut(Vector2 p1, Vector2 p2, float gap)
        {
            var x1  = p1.x;
            var y1  = p1.y;
            var dx1 = p2.x - x1;
            var dy1 = p2.y - y1;

            var len    = Vertices.Count;
            var edge1  = 0;
            var ratio1 = 0.0f;
            var edge2  = 0;
            var ratio2 = 0.0f;
            var count  = 0;

            for (var i = 0; i < len; i++)
            {
                var v0 = Vertices[i];
                var v1 = Vertices[(i + 1) % len];

                var x2  = v0.x;
                var y2  = v0.y;
                var dx2 = v1.x - x2;
                var dy2 = v1.y - y2;

                var t = GeometryHelpers.IntersectLines(x1, y1, dx1, dy1, x2, y2, dx2, dy2);
                if (t.y >= 0 && t.y <= 1)
                {
                    switch (count)
                    {
                    case 0:
                        edge1  = i;
                        ratio1 = t.x;
                        break;

                    case 1:
                        edge2  = i;
                        ratio2 = t.x;
                        break;
                    }
                    count++;
                }
            }

            if (count == 2)
            {
                var point1 = p1 + GeometryHelpers.Scale(p2 - p1, ratio1);
                var point2 = p1 + GeometryHelpers.Scale(p2 - p1, ratio2);

                var half1 = new Polygon(Vertices.GetRange(edge1 + 1, edge2 - edge1));
                half1.Vertices.Insert(0, point1);
                half1.Vertices.Add(point2);

                var half2 = new Polygon(Vertices.GetRange(edge2 + 1, Vertices.Count - edge2 - 1).Concat(Vertices.GetRange(0, edge1 + 1)));
                half2.Vertices.Insert(0, point2);
                half2.Vertices.Add(point1);

                if (gap > 0)
                {
                    half1 = half1.Peel(point2, gap / 2);
                    half2 = half2.Peel(point1, gap / 2);
                }

                var v = VectorI(edge1);

                return(GeometryHelpers.CrossProduct(dx1, dy1, v.x, v.y) > 0 ?
                       new [] { half1, half2 } :
                       new [] { half2, half1 });
            }

            return(new [] { new Polygon(this) });
        }