C Sharp编写缓和曲线计算应用程序

上期分享了编写C Sharp圆曲线的应用程序,那么缓和曲线计算也是必不可缺的。

与圆曲线计算一样,缓和曲线的计算依然是定义参数,计算,检核,输出;但是需要注意缓和曲线有特殊点:HY and YH两点。

计算公式:

Thyx = Xzh + (Hd - Hd * Hd * Hd / (40 * R * R));
Thyy = Yzh + (Hd * Hd) / (6 * R) - (Hd * Hd * Hd) / (336 * R * R * R);

依旧需要角度和弧度的相互转换(上期已经给出代码结构,这里就不作赘述。)

Console.WriteLine("请输入缓和曲线长:");
double Hd = double.Parse(Console.ReadLine());

此处定义的double HD就是我们计算中的L0。

多出的参数m,p,wet的计算公式这里也已给出。

m = L0/2-L0^3/240*R^3

P = L0^2/24*R

\beta = L0/2*R

桩位的任一点

ZH的x坐标:

X = L0-L0^5/40*R^2*Ls^2

ZH的y坐标:

Y = L0^3/6*R*Ls-L0^7/336*R^3*Ls^3

下面是主程序:

namespace 缓和曲线计算
{
    class Program
    {
        public struct AtH1  
        {
            public double AtH2(double ang)
            {
                int fuhao = (int)(ang / Math.Abs(ang));
                ang = Math.Abs(ang);
                int d = (int)ang;
                int m = ((int)(ang * 100)) - d * 100;
                double s = ang * 10000 - m * 100 - d * 10000;
                return ((d + m / 60.0 + s / 3600.0) * fuhao) / 180.0 * Math.PI;
            }
        }
        static void Main(string[] args)
        {
            double m;
            double p;
            double Thyx;
            double Thyy;
            double T;
            double L;
            double E;
            double q;
            double Kqz;
            double Tx;
            double Ty;
            double Kzh;
            double Khy;
            double Kyh;
            double Khz;
            double wet;
            AtH1 A;
            Console.WriteLine("请输入交点里程(需要输入里程与小数):");
            double Kjd = double.Parse(Console.ReadLine());
            Console.WriteLine("请输入转角值:");
            double Aef = A.AtH2(double.Parse(Console.ReadLine()));
            Console.WriteLine("请输入曲线半径值:");
            double R = double.Parse(Console.ReadLine());
            Console.WriteLine("请输入直缓点的X坐标:");
            double Xzh = double.Parse(Console.ReadLine());
            Console.WriteLine("请输入直缓点的Y坐标:");
            double Yzh = double.Parse(Console.ReadLine());
            Console.WriteLine("请输入ZY-JD方位角:");
            double Wt = A.AtH2(double.Parse(Console.ReadLine()));
            Console.WriteLine("请输入缓和曲线长:");
            double Hd = double.Parse(Console.ReadLine());

            m = Hd / 2 - (Hd * Hd * Hd / 240 / R / R / R);
            Console.WriteLine(m);
            p = Hd * Hd / 24 / R;
            Console.WriteLine(p);
            wet = Hd * A.AtH2(180) / 2 / R / Math.PI;
            Console.WriteLine(wet);
            Console.ReadKey();
            T = (R + p) * Math.Tan(Aef / 2) + m;
            Console.WriteLine("T ={0}", T);
            L = Math.PI * R * (Aef - 2 * wet) / A.AtH2(180) + 2 * Hd;
            Console.WriteLine("L ={0}", L);
            E = (R + p) / Math.Cos(Aef / 2) - R;
            Console.WriteLine("E = {0}", E);
            q = 2 * T - L;
            Console.WriteLine("q = {0}", q);

            Kzh = Kjd - T;
            Console.WriteLine("Kzh = {0}", Kzh);
            Khy = Kzh + Hd;
            Console.WriteLine("Khy = {0}", Khy);
            Kqz = Kzh + L / 2;
            Console.WriteLine("Kqz = {0}", Kqz);
            Kyh = Kqz + L / 2;
            Console.WriteLine("Kyh = {0}", Kyh);
            Khz = Kzh + L;
            Console.WriteLine("Khz = {0}", Khz);


            Console.WriteLine("检校值{0}", Kqz + q / 2 - Kjd);
            Console.WriteLine("请输入整桩点间隔值:");
            double ZZD = double.Parse(Console.ReadLine());
            double Kjd1 = 0;
            List<double> 存里程 = new List<double>();
            for (double i = 0; i < Khy; i += ZZD)
            {
                if (i > Kzh)
                {
                    Kjd1 = i;
                    存里程.Count();
                }

            }
            Console.WriteLine("左幅缓和曲线共有{0}个整装点,输入计算点号", 存里程.Count);
            Console.ReadKey();
            int co = int.Parse(Console.ReadLine());
            Kjd1 = 存里程[co - 1];
            if (Kqz + q / 2 - Kjd == 0) 
            {
                Tx = Xzh + (Hd - (Hd * Hd * Hd * Hd * Hd) / (40 * R * R * (Kjd1 - Kzh)));
                Console.WriteLine("Tx(第{0}桩) = {1}", co, Tx);
                Ty = Yzh + (Hd * Hd * Hd) / (6 * R * (Kjd1 - Kzh)) - (Hd * Hd * Hd * Hd * Hd * Hd * Hd) / (336 * R * R * R * ((Kjd1 - Kzh) * (Kjd1 - Kzh) * (Kjd1 - Kzh)));
                Console.WriteLine("Ty(第{0}桩) = {1}", co, Ty);
                Console.ReadKey();
            }
            else
            {
                Console.WriteLine("里程不符合,计算超限");
                Console.ReadKey();
            }
            Thyx = Xzh + (Hd - Hd * Hd * Hd / (40 * R * R));
            Console.WriteLine("Thyx(缓圆点X)={0}", Thyx);
            Thyy = Yzh + (Hd * Hd) / (6 * R) - (Hd * Hd * Hd) / (336 * R * R * R);
            Console.WriteLine("Thyy(缓圆点X)={0}", Thyy);
            Console.ReadKey();
        }
    }
}

下面是结果:

本程序由吉林建筑科技学院梁*杰老师教学授课,小编经梁*杰老师传授,进行一系列整理希望能帮助到各位测绘同学!(如有侵权请告知!!!)