// createFluidBody public void createFluidBody(List<Vector2> polygonPoints) { List<PolygonPoint> P2TPoints = new List<PolygonPoint>(); Polygon polygon; Vector2 topLeft = polygonPoints[0]; Vector2 bottomRight = polygonPoints[0]; float spacing = RADIUS / 3.7f; Random random = new Random(); foreach (Vector2 point in polygonPoints) { topLeft = Vector2.Min(topLeft, point); bottomRight = Vector2.Max(bottomRight, point); P2TPoints.Add(new PolygonPoint(point.X, point.Y)); } polygon = new Polygon(P2TPoints); for (float i = topLeft.X; i < bottomRight.X; i += spacing) { for (float j = topLeft.Y; j < bottomRight.Y; j += spacing) { Vector2 jitter = new Vector2(-1 + (float)random.NextDouble() * 2, -1 + (float)random.NextDouble() * 2) * (spacing * 0.2f); Vector2 point = new Vector2(i, j) + jitter; if (polygon.IsPointInside(new PolygonPoint(point.X, point.Y))) createParticle(point, Vector2.Zero); } } }
private List<Polygon> TriangulatePolyTree(PolyTree tree) { List<Polygon> polygonsGenerated = new List<Polygon>(); List<PolygonPoint> AllPoints = new List<PolygonPoint>(); foreach (PolyNode islands in tree.Childs) { List<PolygonPoint> floorPoints = new List<PolygonPoint>(); foreach (IntPoint point in SubdividePolygon(islands.Contour)) { floorPoints.Add(new PolygonPoint(point.X / GenerationInformation.CalculationScaleFactor, point.Y / GenerationInformation.CalculationScaleFactor)); } AllPoints.AddRange(floorPoints); Polygon floorPolygon = new Polygon(floorPoints); foreach (PolyNode nextNode in islands.Childs) { if (nextNode.IsHole) { List<PolygonPoint> holePoints = new List<PolygonPoint>(); foreach (IntPoint point in SubdividePolygon(nextNode.Contour)) { holePoints.Add(new PolygonPoint(point.X / GenerationInformation.CalculationScaleFactor, point.Y / GenerationInformation.CalculationScaleFactor)); } AllPoints.AddRange(holePoints); floorPolygon.AddHole(new Polygon(holePoints)); } } if (GenerationInformation.UseGrid) { List<TriangulationPoint> steinerPoints = new List<TriangulationPoint>(); for (float x = (float)floorPolygon.BoundingBox.MinX - ((float)floorPolygon.BoundingBox.MinX % GenerationInformation.GridSize.x); x < floorPolygon.BoundingBox.MaxX; x += GenerationInformation.GridSize.x) { for (float y = (float)floorPolygon.BoundingBox.MinY - ((float)floorPolygon.BoundingBox.MinY % GenerationInformation.GridSize.y); y < floorPolygon.BoundingBox.MaxY; y += GenerationInformation.GridSize.y) { TriangulationPoint p = new TriangulationPoint(x, y); if (floorPolygon.IsPointInside(p)) steinerPoints.Add(p); } } CullSteinerPoints(ref steinerPoints, AllPoints, 0.1f); floorPolygon.AddSteinerPoints(steinerPoints); } floorPolygon.Prepare(P2T.CreateContext(TriangulationAlgorithm.DTSweep)); P2T.Triangulate(floorPolygon); polygonsGenerated.Add(floorPolygon); } return polygonsGenerated; }