Пример #1
0
        public IEnumerable <Annotation> InferAnnotations(NewPrimitive toBeSnapped, SnappedPrimitive toBeAnnotated)
        {
            // we skip orthogonality inference for spheres
            if (toBeSnapped is NewSphere)
            {
                return(Enumerable.Empty <Annotation>());
            }

            var curvesToSkip = toBeAnnotated.FeatureCurves.Concat(GetSphereFeatureCurves()).ToArray();

            var candidates =
                from firstCurve in toBeAnnotated.FeatureCurves
                from secondCurve in sessionData.FeatureCurves.Except(curvesToSkip)
                where AreGoodCandidates(firstCurve, secondCurve)
                select Tuple.Create(firstCurve, secondCurve);

            if (candidates.Any())
            {
                var bestCandidate        = candidates.Minimizer(pair => DistanceBetweenCurves(pair.Item1, pair.Item2));
                var newFeatureCurve      = bestCandidate.Item1;
                var existingFeatureCurve = bestCandidate.Item2;

                Annotation parallelism = new Parallelism {
                    Elements = new FeatureCurve[] { newFeatureCurve, existingFeatureCurve }
                };

                return(UtilsEnumerable.Singleton(parallelism));
            }
            else
            {
                return(Enumerable.Empty <Annotation>());
            }
        }
Пример #2
0
        public LinesIntersection2?Intersects(Ray2 ray, out Parallelism parallelism)
        {
            //http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect

            var p = Position;
            var r = Direction;

            var q = ray.Position;
            var s = ray.Direction;

            // It isn't maths if the variable names make any sense
            // ReSharper disable InconsistentNaming
            var RxS = r.Cross(s);
            var QmP = q - p;

            // ReSharper restore InconsistentNaming

            if (Math.Abs(RxS - 0) < 0.001)
            {
                // ReSharper disable InconsistentNaming
                var QmPxR = QmP.Cross(r);
                // ReSharper restore InconsistentNaming
                parallelism = Math.Abs(QmPxR - 0) < 0.001 ? Geometry.Parallelism.Collinear : Geometry.Parallelism.Parallel;
                return(null);
            }

            var t = QmP.Cross(s) / RxS;
            var u = QmP.Cross(r) / RxS;

            var point = p + (t * r);

            parallelism = Geometry.Parallelism.None;
            return(new LinesIntersection2(point, t, u));
        }
Пример #3
0
        private static void ExecuteTests()
        {
            ITimes       times       = new Times(1);
            IParallelism parallelism = new Parallelism(2);

            ITestSuit suit   = Program.CreateSuit();
            IReport   report = suit.Execute(times, parallelism);

            report.Print(new ConsolePrinter());
        }
Пример #4
0
        public LinesIntersection2?Intersects(Ray2 ray, out Parallelism parallelism)
        {
            var intersection = LongLine.Intersects(ray, out parallelism);

            if (!intersection.HasValue)
            {
                return(null);
            }

            if (intersection.Value.DistanceAlongA <= 0 || intersection.Value.DistanceAlongA >= 1)
            {
                return(null);
            }

            return(intersection);
        }
Пример #5
0
        private Term[] GetConcreteAnnotationTerm(Parallelism parallelism)
        {
            var terms = new List <Term>();

            if (parallelism.Elements.Length >= 2)
            {
                var normals = from elem in parallelism.Elements
                              select elem.Normal;

                foreach (var normalsPair in normals.SeqPairs())
                {
                    var n1 = normalsPair.Item1;
                    var n2 = normalsPair.Item2;

                    terms.AddRange(VectorParallelism(n1, n2));
                }
            }
            return(terms.ToArray());
        }
Пример #6
0
        public LinesIntersection2?Intersects(LineSegment2 segment, out Parallelism parallelism)
        {
            var intersection = LongLine.Intersects(segment.LongLine, out parallelism);

            if (!intersection.HasValue)
            {
                return(null);
            }

            if (intersection.Value.DistanceAlongA < 0 || intersection.Value.DistanceAlongA > 1)
            {
                return(null);
            }

            if (intersection.Value.DistanceAlongB < 0 || intersection.Value.DistanceAlongB > 1)
            {
                return(null);
            }

            return(intersection);
        }
Пример #7
0
 private Term[] GetConcreteAnnotationTerm(Parallelism parallelism)
 {
     throw new NotImplementedException();// we still don't handle parallelism
 }
Пример #8
0
        static void Main(string[] args)
        {
            var parallelism = new Parallelism();

            parallelism.Test();
        }
Пример #9
0
 public override string ToString() => "Local Environment (parallelism = " + (Parallelism == ExecutionConfig.DefaultParallelism ? "default" : Parallelism.ToString()) + ").";
Пример #10
0
        public LinesIntersection2? Intersects(LineSegment2 segment, out Parallelism parallelism)
        {
            var intersection = LongLine.Intersects(segment.LongLine, out parallelism);

            if (!intersection.HasValue)
                return null;

            if (intersection.Value.DistanceAlongA <= 0 || intersection.Value.DistanceAlongA >= 1)
                return null;

            if (intersection.Value.DistanceAlongB <= 0 || intersection.Value.DistanceAlongB >= 1)
                return null;

            return intersection;
        }
Пример #11
0
        public LinesIntersection2? Intersects(Ray2 ray, out Parallelism parallelism)
        {
            var intersection = LongLine.Intersects(ray, out parallelism);

            if (!intersection.HasValue)
                return null;

            if (intersection.Value.DistanceAlongA <= 0 || intersection.Value.DistanceAlongA >= 1)
                return null;

            return intersection;
        }
Пример #12
0
        public LinesIntersection2? Intersects(Ray2 ray, out Parallelism parallelism)
        {
            //http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect

            var p = Position;
            var r = Direction;

            var q = ray.Position;
            var s = ray.Direction;

            // It isn't maths if the variable names make any sense
            // ReSharper disable InconsistentNaming
            var RxS = r.Cross(s);
            var QmP = q - p;
            // ReSharper restore InconsistentNaming

            if (Math.Abs(RxS - 0) < 0.001)
            {
                // ReSharper disable InconsistentNaming
                var QmPxR = QmP.Cross(r);
                // ReSharper restore InconsistentNaming
                parallelism = Math.Abs(QmPxR - 0) < 0.001 ? Geometry.Parallelism.Collinear : Geometry.Parallelism.Parallel;
                return null;
            }

            var t = QmP.Cross(s) / RxS;
            var u = QmP.Cross(r) / RxS;

            var point = p + (t * r);

            parallelism = Geometry.Parallelism.None;
            return new LinesIntersection2(point, t, u);
        }