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));
        }