示例#1
0
        protected override Tuple <Term, Term[]> Reconstruct(SnappedStraightGenCylinder snappedPrimitive, Dictionary <FeatureCurve, ISet <Annotation> > curvesToAnnotations)
        {
            var silhouettesCount =
                (new PointsSequence[] { snappedPrimitive.LeftSilhouette, snappedPrimitive.RightSilhouette })
                .Count(curve => curve != null);

            var featuresCount = snappedPrimitive.FeatureCurves
                                .Cast <CircleFeatureCurve>()
                                .Count(curve => curve.SnappedTo != null);

            // get annotated feature curves of this primitive.
            var annotated = new HashSet <FeatureCurve>(curvesToAnnotations.Keys.Where(key => curvesToAnnotations[key].Count > 0));

            annotated.Intersect(snappedPrimitive.FeatureCurves);

            // default objective function and no constraints.. if we can't match a case, we don't optimize.
            Tuple <Term, Term[]> result = Tuple.Create(TermBuilder.Constant(0), new Term[0]);

            if (silhouettesCount == 2 && featuresCount == 2)
            {
                result = FullInfo(snappedPrimitive);
            }
            else if (silhouettesCount == 1 && featuresCount == 2)
            {
                result = SingleSilhouetteTwoFeatures(snappedPrimitive, annotated);
            }
            else if (silhouettesCount == 2 && featuresCount == 1)
            {
                result = SingleFeatureTwoSilhouettes(snappedPrimitive, annotated);
            }

            return(result);
        }
示例#2
0
            public SubstitutionResult Visit(Sum sum)
            {
                var summmandResults = sum.Terms.Select(x => x.Accept(this)).ToArray();

                var    nonConstants = new List <Term>();
                double sumValue     = 0;

                foreach (var summandResult in summmandResults)
                {
                    double value;
                    if (TryGetConstant(summandResult, out value))
                    {
                        sumValue += value;
                    }
                    else
                    {
                        nonConstants.Add(summandResult.Term);
                    }
                }

                if (nonConstants.Count == 0) // all are constants
                {
                    return(CreateResult(sumValue));
                }
                else
                {
                    var newSummands = nonConstants.Concat(Enumerable.Repeat(TermBuilder.Constant(sumValue), 1));
                    return(CreateResult(TermBuilder.Sum(newSummands)));
                }
            }
示例#3
0
 public void ConstantContract()
 {
     Assert.IsType <Constant>(TermBuilder.Constant(1));
     Assert.IsType <Zero>(TermBuilder.Constant(0));
 }
示例#4
0
 private static SubstitutionResult CreateResult(double value)
 {
     return(CreateResult(TermBuilder.Constant(value)));
 }