public static float Cross(Vector2 a, Vector2 b) { return(GeometryHelpers.CrossProduct(a.x, a.y, b.x, b.y)); }
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) }); }