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的计算公式这里也已给出。
桩位的任一点
ZH的x坐标:
ZH的y坐标:
下面是主程序:
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();
}
}
}
下面是结果:
本程序由吉林建筑科技学院梁*杰老师教学授课,小编经梁*杰老师传授,进行一系列整理希望能帮助到各位测绘同学!(如有侵权请告知!!!)