Esempio n. 1
0
        private Term[] GetConcreteAnnotationTerm(Coplanarity coplanarity)
        {
            var constraints = new List <Term>();

            if (coplanarity.Elements.Length >= 2)
            {
                var terms = new List <Term>();
                foreach (var pair in coplanarity.Elements.SeqPairs())
                {
                    var fst = pair.Item1;
                    var snd = pair.Item2;

                    var p1 = fst.Center;
                    var p2 = snd.Center;

                    var n1 = fst.Normal;
                    var n2 = snd.Normal;

                    constraints.AddRange(VectorParallelism(n1, n2));
                    constraints.AddRange(PointsOnPlaneConstraint(p1, n1, new TVec[] { p2 }));
                    constraints.AddRange(PointsOnPlaneConstraint(p2, n2, new TVec[] { p1 }));
                }
            }
            return(constraints.ToArray());
        }
Esempio n. 2
0
        private Term[] GetConcreteAnnotationTerm(Coplanarity coplanarity)
        {
            var constraints = new List <Term>();

            if (coplanarity.Elements.Length >= 2)
            {
                var terms = new List <Term>();
                foreach (var pair in coplanarity.Elements.SeqPairs())
                {
                    var fst = pair.Item1;
                    var snd = pair.Item2;

                    var p1 = fst.Center;
                    var p2 = snd.Center;

                    var n1 = fst.Normal;
                    var n2 = snd.Normal;

                    var pts1 = GetPointsOnPlane(p1, n1);
                    var pts2 = GetPointsOnPlane(p2, n2);

                    var planarity1 = PointsOnPlaneConstraint(p1, n1, pts2);
                    var planarity2 = PointsOnPlaneConstraint(p2, n2, pts1);
                    constraints.AddRange(planarity1);
                    constraints.AddRange(planarity2);
                }
            }
            return(constraints.ToArray());
        }
        private IEnumerable <Annotation> SelectBestCandidates(IEnumerable <CandidatePair> candidates)
        {
            // eliminate containers that are not visible because their normal faces away from the viewer
            // (positive Z coordinate).
            var withVisibleContainers = from pair in candidates
                                        where pair.Container.NormalResult.Z < 0
                                        select pair;

            if (withVisibleContainers.Any())
            {
                // choose the pair such that the projection of the containee's center on the container's normal
                // has the lowest value
                var bestCandidate = withVisibleContainers.Minimizer(ContainedCenterOnContainerAxisProjection);

                // construct the coplanarity annotation and return a singleton enumerable containing it.
                var annotation = new Coplanarity {
                    Elements = new FeatureCurve[] { bestCandidate.Container, bestCandidate.Contained }
                };
                return(Utils.Enumerable.Singleton(annotation));
            }
            else
            {
                return(Enumerable.Empty <Annotation>());
            }
        }