FluidInfo ILineFluidAffectable.GetFluidInfo(GetTangentCallback callback, Line line) { if (polygons.Length == 1) { return(ShapeHelper.GetFluidInfo(Vertexes, callback, line)); } List <Vector2D[]> submerged = new List <Vector2D[]>(polygons.Length); for (int index = 0; index < polygons.Length; ++index) { Vector2D[] vertexes = ShapeHelper.GetIntersection(polygons[index], line); if (vertexes.Length >= 3) { submerged.Add(vertexes); } } if (submerged.Count == 0) { return(null); } Vector2D[][] newPolygons = submerged.ToArray(); Vector2D centroid = MultiPolygonShape.GetCentroid(newPolygons); Scalar area = MultiPolygonShape.GetArea(newPolygons); Vector2D tangent = callback(centroid); Vector2D dragCenter; Scalar dragArea; ShapeHelper.GetFluidInfo(newPolygons, tangent, out dragCenter, out dragArea); return(new FluidInfo(dragCenter, dragArea, centroid, area)); }
DragInfo IExplosionAffectable.GetExplosionInfo(Matrix2x3 matrix, Scalar radius, GetTangentCallback callback) { Vector2D[] vertexes2 = new Vector2D[Vertexes.Length]; for (int index = 0; index < vertexes2.Length; ++index) { vertexes2[index] = matrix * Vertexes[index]; } Vector2D[] inter = ShapeHelper.GetIntersection(vertexes2, radius); if (inter.Length < 3) { return(null); } Vector2D centroid = PolygonShape.GetCentroid(inter); Vector2D tangent = callback(centroid); Scalar min, max; ShapeHelper.GetProjectedBounds(inter, tangent, out min, out max); Scalar avg = (max + min) / 2; return(new DragInfo(tangent * avg, max - min)); }
public static FluidInfo GetFluidInfo(Vector2D[] vertexes2, GetTangentCallback callback, Line line) { Vector2D centroid; Scalar area; Vector2D dragCenter; Scalar dragArea; Vector2D[] vertexes = ShapeHelper.GetIntersection(vertexes2, line); if (vertexes.Length < 3) { return(null); } centroid = PolygonShape.GetCentroid(vertexes); area = PolygonShape.GetArea(vertexes); Vector2D tangent = callback(centroid); Scalar min, max; ShapeHelper.GetProjectedBounds(vertexes, tangent, out min, out max); Scalar avg = (max + min) / 2; dragCenter = tangent * avg; dragArea = max - min; return(new FluidInfo(dragCenter, dragArea, centroid, area)); }