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()); }
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>()); } }