private Geometry HandleClosedPaths(IImmutableList<Tuple<Coords, Coords, Direction>> combinedLineSegments, PathSegmentCollection segments) { var lastLineSegment = combinedLineSegments.Last(); var firstLineSegment = combinedLineSegments.First(); if (Equals(firstLineSegment.Item1, lastLineSegment.Item2)) { // Only the 'O' tetra stick has a closed line. // The following code relies on the 'O' tetra stick // line going Up then Right then Down then Left. // Ideally, it should not rely on this but life is // too short! Debug.Assert(segments.Count%2 == 0); var halfLength = segments.Count/2; var innerSegments = segments.Skip(halfLength).ToList(); var outerSegments = segments.Take(halfLength).ToList(); var cornerSegments = new PathSegmentCollection(); AddCornerDownThenRight(cornerSegments, lastLineSegment.Item2); outerSegments[0] = cornerSegments[0]; innerSegments.RemoveAt(0); innerSegments.Add(cornerSegments[1]); var outerGeometry = new PathGeometry { Figures = new PathFigureCollection { new PathFigure { StartPoint = CoordsToInsetLowerLeftVertical(lastLineSegment.Item2), Segments = new PathSegmentCollection(outerSegments) } } }; var innerGeometry = new PathGeometry { Figures = new PathFigureCollection { new PathFigure { StartPoint = CoordsToInsetLowerRightVertical(lastLineSegment.Item2), Segments = new PathSegmentCollection(innerSegments) } } }; return new CombinedGeometry(GeometryCombineMode.Exclude, outerGeometry, innerGeometry); } return new PathGeometry { Figures = new PathFigureCollection { new PathFigure { StartPoint = GetStartingPoint(combinedLineSegments), Segments = segments } } }; }