private static void DrawArmature(Armature2D armature, IReadOnlyList <float> solution, Vector2 target) { var builder = new SvgBuilder(10); builder.Outline(new[] { new Vector2(-50, -50), new Vector2(50, -50), new Vector2(50, 50), new Vector2(-50, 50), }); var index = 0; var pos = Vector2.Zero; var parentTransform = Matrix4x4.Identity; foreach (var bone in armature.Bones) { builder.Circle(pos, 0.5f, "yellow"); var localTransform = TriangulationSolver2D.CalculateLocalTransform(bone, ToRadians(solution[index])); parentTransform = localTransform * parentTransform; var end = Vector2.Transform(new Vector2(0, 0), parentTransform); index++; builder.Line(pos, end, 2, "red"); pos = end; } builder.Circle(target, 0.5f, "blue"); var str = Regex.Replace(builder.ToString(), "g transform=\"translate\\((.+?), (.+?)\\)\"", "g transform=\"translate(${1}, 100) scale(1, -1)\""); Console.WriteLine(str); }
private static SvgBuilder Draw <TA, TB, TC>(Mesh <TA, TB, TC> mesh, Func <TC, string> faceColor) { var svg = new SvgBuilder(10); foreach (var face in mesh.Faces) { svg.Outline(face.Vertices.Select(v => v.Position).ToArray(), stroke: "none", fill: faceColor(face.Tag)); } foreach (var edge in mesh.HalfEdges.Where(a => a.IsPrimaryEdge)) { svg.Line(edge.StartVertex.Position, edge.EndVertex.Position, 1, "black"); } foreach (var vertex in mesh.Vertices) { svg.Circle(vertex.Position, 0.2f, "black"); } return(svg); }
static void Main(string[] args) { Stopwatch w = new Stopwatch(); w.Start(); var ssk = StraightSkeleton.Generate(new Vector2[] { new Vector2(-10, 10), new Vector2(-1, 10), new Vector2(0, 11), new Vector2(1, 10), new Vector2(10, 10), new Vector2(10, -2), new Vector2(5, 0), new Vector2(7, -10), new Vector2(-7, -10), new Vector2(-5, 0), new Vector2(-10, -2), }, new Vector2[][] { new Vector2[] { new Vector2(2, 2), new Vector2(2, -2), new Vector2(-2, -2), new Vector2(-2, 2) } }); w.Stop(); Stopwatch w2 = new Stopwatch(); w2.Start(); //Extract data from result var builder = new SvgBuilder(30); //Draw outline foreach (var edge in ssk.Borders) { builder.Circle(edge.Start.Position, 0.2f, "blue"); builder.Circle(edge.End.Position, 0.2f, "blue"); builder.Line(edge.Start.Position, edge.End.Position, 2, "blue"); } //Draw offsets for (var i = 1; i < 10; i++) { var offset = ssk.Offset(i / 2f); foreach (var polygon in offset) { builder.Outline(polygon, "green"); } } //Draw spokes foreach (var edge in ssk.Spokes) { builder.Line(edge.Start.Position, edge.End.Position, 4, "lime"); } //Draw straight skeleton foreach (var edge in ssk.Skeleton) { builder.Circle(edge.Start.Position, 0.2f, "hotpink"); builder.Circle(edge.End.Position, 0.2f, "hotpink"); builder.Line(edge.Start.Position, edge.End.Position, 2, "hotpink"); } Console.WriteLine(builder); Console.Title = string.Format("Elapsed: {0}ms {1}ms", w.ElapsedMilliseconds, w2.ElapsedMilliseconds); Console.ReadLine(); }