public static List <Fixture> AttachSolidArc(FP density, FP radians, int sides, FP radius, FPVector2 position, FP angle, Body body) { Vertices arc = PolygonTools.CreateArc(radians, sides, radius); arc.Rotate((FP.Pi - radians) / 2 + angle); arc.Translate(ref position); //Close the arc arc.Add(arc[0]); List <Vertices> triangles = Triangulate.ConvexPartition(arc, TriangulationAlgorithm.Earclip, true, FP.EN3); return(AttachCompoundPolygon(triangles, density, body)); }
/// <summary> /// Creates a rounded rectangle. /// Note: Automatically decomposes the capsule if it contains too many vertices (controlled by Settings.MaxPolygonVertices) /// </summary> /// <param name="world">The world.</param> /// <param name="width">The width.</param> /// <param name="height">The height.</param> /// <param name="xRadius">The x radius.</param> /// <param name="yRadius">The y radius.</param> /// <param name="segments">The segments.</param> /// <param name="density">The density.</param> /// <param name="position">The position.</param> /// <returns></returns> public static Body CreateRoundedRectangle(World world, FP width, FP height, FP xRadius, FP yRadius, int segments, FP density, FPVector2 position, object userData = null) { Vertices verts = PolygonTools.CreateRoundedRectangle(width, height, xRadius, yRadius, segments); //There are too many vertices in the capsule. We decompose it. if (verts.Count >= Settings.MaxPolygonVertices) { List <Vertices> vertList = Triangulate.ConvexPartition(verts, TriangulationAlgorithm.Earclip, true, FP.EN3); Body body = CreateCompoundPolygon(world, vertList, density, userData); body.Position = position; return(body); } return(CreatePolygon(world, verts, density, null)); }
public static Body CreateGear(World world, FP radius, int numberOfTeeth, FP tipPercentage, FP toothHeight, FP density, object userData = null) { Vertices gearPolygon = PolygonTools.CreateGear(radius, numberOfTeeth, tipPercentage, toothHeight); //Gears can in some cases be convex if (!gearPolygon.IsConvex()) { //Decompose the gear: List <Vertices> list = Triangulate.ConvexPartition(gearPolygon, TriangulationAlgorithm.Earclip, true, FP.EN3); return(CreateCompoundPolygon(world, list, density, userData)); } return(CreatePolygon(world, gearPolygon, density, userData)); }
/// <summary> /// Convert a closed path into a polygon. /// Convex decomposition is automatically performed. /// </summary> /// <param name="path">The path.</param> /// <param name="body">The body.</param> /// <param name="density">The density.</param> /// <param name="subdivisions">The subdivisions.</param> public static void ConvertPathToPolygon(Path path, Body body, FP density, int subdivisions) { if (!path.Closed) { throw new Exception("The path must be closed to convert to a polygon."); } List <FPVector2> verts = path.GetVertices(subdivisions); List <Vertices> decomposedVerts = Triangulate.ConvexPartition(new Vertices(verts), TriangulationAlgorithm.Bayazit, true, FP.EN3); foreach (Vertices item in decomposedVerts) { body.CreateFixture(new PolygonShape(item, density)); } }
/// <summary> /// Creates a capsule. /// Note: Automatically decomposes the capsule if it contains too many vertices (controlled by Settings.MaxPolygonVertices) /// </summary> /// <returns></returns> public static Body CreateCapsule(World world, FP height, FP topRadius, int topEdges, FP bottomRadius, int bottomEdges, FP density, FPVector2 position, object userData = null) { Vertices verts = PolygonTools.CreateCapsule(height, topRadius, topEdges, bottomRadius, bottomEdges); Body body; //There are too many vertices in the capsule. We decompose it. if (verts.Count >= Settings.MaxPolygonVertices) { List <Vertices> vertList = Triangulate.ConvexPartition(verts, TriangulationAlgorithm.Earclip, true, FP.EN3); body = CreateCompoundPolygon(world, vertList, density, userData); body.Position = position; return(body); } body = CreatePolygon(world, verts, density, userData); body.Position = position; return(body); }
private void GenerateTerrain(int gx, int gy) { FP ax = gx * CellSize; FP ay = gy * CellSize; List <Vertices> polys = MarchingSquares.DetectSquares(new AABB(new FPVector2(ax, ay), new FPVector2(ax + CellSize, ay + CellSize)), SubCellSize, SubCellSize, _terrainMap, Iterations, true); if (polys.Count == 0) { return; } _bodyMap[gx, gy] = new List <Body>(); // create the scale vector FPVector2 scale = new FPVector2(1f / PointsPerUnit, 1f / -PointsPerUnit); // create physics object for this grid cell foreach (Vertices item in polys) { // does this need to be negative? item.Scale(ref scale); item.Translate(ref _topLeft); Vertices simplified = SimplifyTools.CollinearSimplify(item, FP.Zero); List <Vertices> decompPolys = Triangulate.ConvexPartition(simplified, Decomposer, true, FP.EN3); foreach (Vertices poly in decompPolys) { if (poly.Count > 2) { _bodyMap[gx, gy].Add(BodyFactory.CreatePolygon(World, poly, 1, null)); } } } }