private static void Subdivide(List <SKPoint> path, int desiredPointCount) { var desiredLength = path.Count + desiredPointCount; var step = SKGeometry.Perimeter(path) / desiredPointCount; var i = 0; var cursor = 0.0f; var insertAt = step / 2f; while (path.Count < desiredLength) { var a = path[i]; var b = path[(i + 1) % path.Count]; var segment = SKGeometry.Distance(a, b); if (insertAt <= cursor + segment) { path.Insert(i + 1, segment != 0 ? SKGeometry.PointAlong(a, b, (insertAt - cursor) / segment) : a); insertAt += step; continue; } cursor += segment; i++; } }
private static void Bisect(List <SKPoint> ring, float maxSegmentLength) { // skip if we have asked that the path not be bisected if (maxSegmentLength <= 0) { return; } for (var i = 0; i < ring.Count; i++) { var a = ring[i]; var b = i == ring.Count - 1 ? ring[0] : ring[i + 1]; // could splice the whole set for a segment instead, but a bit messy while (SKGeometry.Distance(a, b) > maxSegmentLength) { b = SKGeometry.PointAlong(a, b, 0.5f); ring.Insert(i + 1, b); } } }