Esempio n. 1
0
        public Edge PerpendicularOnPerimeter(Ellipse ellipse)
        {
            Class12.point_0   = new Point(this.double_0, this.double_1, this.double_2);
            Class12.ellipse_0 = ellipse.DeepCopy();
            LineSearch.ObjectiveFunction function = new LineSearch.ObjectiveFunction(Class12.smethod_0);
            double parameterAtPoint = ellipse.GetParameterAtPoint(Class12.point_0);
            double tetha;

            if (parameterAtPoint <= 3.1415926535897931)
            {
                tetha = LineSearch.GoldenSection(0.001 * Global.AbsoluteEpsilon, 0.0, 3.1415926535897931, function);
            }
            else
            {
                tetha = LineSearch.GoldenSection(0.001 * Global.AbsoluteEpsilon, 3.1415926535897931, 6.2831853071795862, function);
            }
            return(new Edge(this, ellipse.GetPointAtParameter(tetha)));
        }
Esempio n. 2
0
        public static double GoldenSection(double epsilon, double lowerBound, double upperBound, LineSearch.ObjectiveFunction function)
        {
            double num  = (Math.Sqrt(5.0) - 1.0) / 2.0;
            int    num2 = (int)Math.Ceiling(Math.Log(epsilon / (upperBound - lowerBound)) / Math.Log(num));

            double[] array  = new double[num2 + 1];
            double[] array2 = new double[num2 + 1];
            double[] array3 = new double[num2 + 1];
            double[] array4 = new double[num2 + 1];
            double[] array5 = new double[num2 + 1];
            double[] array6 = new double[num2 + 1];
            array[0]  = lowerBound;
            array2[0] = upperBound;
            array3[0] = array[0] + (1.0 - num) * (array2[0] - array[0]);
            array4[0] = array[0] + num * (array2[0] - array[0]);
            array5[0] = function(array3[0]);
            array6[0] = function(array4[0]);
            for (int i = 0; i < num2; i++)
            {
                if (array5[i] >= array6[i])
                {
                    array[i + 1]  = array3[i];
                    array2[i + 1] = array2[i];
                    array3[i + 1] = array4[i];
                    array4[i + 1] = array[i + 1] + num * (array2[i + 1] - array[i + 1]);
                    array5[i + 1] = array6[i];
                    array6[i + 1] = function(array4[i + 1]);
                }
                else
                {
                    array[i + 1]  = array[i];
                    array2[i + 1] = array4[i];
                    array3[i + 1] = array[i + 1] + (1.0 - num) * (array2[i + 1] - array[i + 1]);
                    array4[i + 1] = array3[i];
                    array6[i + 1] = array5[i];
                    array5[i + 1] = function(array3[i + 1]);
                }
            }
            return((array3[num2] + array4[num2]) / 2.0);
        }