예제 #1
0
        void ChangePolynomialtemplateDegree(int newDegree)
        {
            if (Selected)
            {
                if (newDegree < 1)
                {
                    Console.WriteLine("polynomial template degree cannot be less than 1");

                    return;
                }

                Console.WriteLine("changing polynomial template degree to {0}", newDegree);

                nextSpecification = new BasicSpecification
                                    (
                    nextSpecification.CurveLength,
                    nextSpecification.SegmentCount,
                    new PolynomialFunctionTermCurveTemplate(newDegree),
                    nextSpecification.CurveSpecifications
                                    );

                RebuildCurveSpecification();

                curveOptimizer.Submit(nextSpecification);
            }
        }
예제 #2
0
        void ChangeCurveSegmentCount(int newSegmentCount)
        {
            if (Selected)
            {
                if (newSegmentCount < 1)
                {
                    Console.WriteLine("segment count cannot be smaller than one!");

                    return;
                }

                Console.WriteLine("changing segment count to {0}", newSegmentCount);

                nextSpecification = new BasicSpecification
                                    (
                    nextSpecification.CurveLength,
                    newSegmentCount,
                    nextSpecification.SegmentTemplate,
                    nextSpecification.CurveSpecifications
                                    );

                RebuildCurveSpecification();

                curveOptimizer.Submit(nextSpecification);
            }
        }
예제 #3
0
        void CurveChanged(BasicSpecification newBasicSpecification, Curve newCurve)
        {
            basicSpecification = newBasicSpecification;
            curve = newCurve;

            Changed();
        }
예제 #4
0
        public CurveComponent(Component parent, OptimizationWorker optimizationWorker, Specification specification) : base(parent)
        {
            if (optimizationWorker == null)
            {
                throw new ArgumentNullException("optimizationWorker");
            }

            this.curveOptimizer = new CurveOptimizer(optimizationWorker, specification);
            this.curveOptimizer.CurveChanged += CurveChanged;

            this.curveStartComponent     = new FixedPositionComponent(this, this, 0);
            this.curveEndComponent       = new FixedPositionComponent(this, this, 1);
            this.specificationComponents = new List <SpecificationComponent>();
            this.segmentComponents       = new List <SegmentComponent>();

            nextSpecification = specification.BasicSpecification;
            curve             = null;

            RebuildSegmentComponents();

            curveOptimizer.Submit(nextSpecification);

            IEnumerable <SpecificationComponent> specificationComponents =
                (
                    from spec in nextSpecification.CurveSpecifications
                    orderby spec.Position ascending
                    group spec by spec.Position into specificationGroup
                    select new SpecificationComponent(this, this, specificationGroup.Key, specificationGroup)
                );

            foreach (SpecificationComponent component in specificationComponents)
            {
                AddSpecificationComponent(component);
            }
        }
예제 #5
0
 void ChangeCurveLength(double newCurveLength)
 {
     nextSpecification = new BasicSpecification
                         (
         newCurveLength,
         nextSpecification.SegmentCount,
         nextSpecification.SegmentTemplate,
         nextSpecification.CurveSpecifications
                         );
 }
예제 #6
0
 void RebuildCurveSpecification()
 {
     nextSpecification = new BasicSpecification
                         (
         nextSpecification.CurveLength,
         nextSpecification.SegmentCount,
         nextSpecification.SegmentTemplate,
         (
             from specificationComponent in SpecificationComponents
             from specification in specificationComponent.Specifications
             select specification
         )
         .ToArray()
                         );
 }
예제 #7
0
        void Optimize(BasicSpecification basicSpecification)
        {
            if (specification == null)
            {
                specification = new Specification(basicSpecification);
            }

            // TODO: make sure the new curve resembles the old one, even when SegmentCount and/or SegmentTemplate are changed
            if (basicSpecification.SegmentCount != specification.BasicSpecification.SegmentCount || basicSpecification.SegmentTemplate != specification.BasicSpecification.SegmentTemplate)
            {
                specification = new Specification(basicSpecification);
            }

            specification = new Specification(basicSpecification, specification.Position);

            try
            {
                Stopwatch stopwatch = new Stopwatch();

                stopwatch.Restart();
                specification = optimizer.Normalize(specification);
                stopwatch.Stop();

                Console.WriteLine("normalization: {0} s", stopwatch.Elapsed.TotalSeconds);

                stopwatch.Restart();
                Kurve.Curves.Curve curve = new DiscreteCurve(optimizer.GetCurve(specification), (int)basicSpecification.CurveLength);
                stopwatch.Stop();

                Console.WriteLine("discrete curve: {0} s", stopwatch.Elapsed.TotalSeconds);

                Application.Invoke
                (
                    delegate(object sender, EventArgs e)
                {
                    if (CurveChanged != null)
                    {
                        CurveChanged(basicSpecification, curve);
                    }
                }
                );
            }
            catch (InvalidOperationException exception)
            {
                Terminal.Write(exception.Message, ConsoleColor.Red);
                Terminal.WriteLine();
            }
        }
예제 #8
0
        void AddCurve()
        {
            BasicSpecification basicSpecification = new BasicSpecification
                                                    (
                100,
                1,
                new PolynomialFunctionTermCurveTemplate(10),
                Enumerables.Create
                (
                    new PointCurveSpecification(0.0, new Vector2Double(300, 300)),
                    new PointCurveSpecification(1.0, new Vector2Double(400, 300))
                )
                                                    );

            AddCurve(new CurveComponent(this, optimizationWorker, new Specification(basicSpecification)));
        }
예제 #9
0
 public void Submit(BasicSpecification basicSpecification)
 {
     optimizationWorker.SubmitTask(this, curveOptimizer => curveOptimizer.Optimize(basicSpecification));
 }