private static IEnumerable <Vector> GeneratePolygon(Segment startSegment, Dictionary <Vector, List <Segment> > outerSegments, HashSet <Tuple <Vector, Vector> > usedSegments) { var segment = startSegment; usedSegments.Add(Tuple.Create(segment.Start, segment.End)); yield return(segment.Start); while (!segment.End.Equals(startSegment.Start)) { var nextCands = outerSegments[segment.End]; double min = 5; Segment best = null; foreach (var cand in nextCands) { var candMeasure = GeometryExtensions.GetAngleMeasure(segment.End - segment.Start, cand.End - cand.Start); if (candMeasure > 1e-7 && candMeasure < min) { min = candMeasure; best = cand; } } segment = best; if (segment == null) { yield break; } yield return(segment.Start); usedSegments.Add(Tuple.Create(segment.Start, segment.End)); } }
public static TransposeOperator ConstructOperator(Segment source, Segment destination) { var sVector = source.End - source.Start; var dVector = destination.End - destination.Start; var cos = GeometryExtensions.GetCos(sVector, dVector); var sin = GeometryExtensions.GetSin(sVector, dVector); var matrix = new TransposeOperator(); matrix[0, 0] = matrix[1, 1] = cos; matrix[1, 0] = sin; matrix[0, 1] = -sin; var newDVector = matrix.Apply(source.Start); matrix.MoveVector = destination.Start - newDVector; return(matrix); }