Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 2
0
        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);
        }