在测绘行业中经常会用到圆曲线方法放样,我们在测量出数据后会进行大量计算,为了方便计算小编编写了一套简易的C Sharp程序。
此程序基于C Sharp控制台应用程序Program.cs文件
整体思路:
第一步:需要将所有参数进行定义(这里只定义了主要的参数)
//代求参数
double T; double L;
double E; double q;
第二步:考虑到角度弧度需要相互转换,那么可以在整体Program中建立结构,也可以添加一个类(这里新入门的同学建议第一种方法!)
1:角度转弧度方法:
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;
}
2:弧度转角度方法:
public double HtA(double ang)
{
ang += 1.0E-15;
int fuhao = (int)(ang / Math.Abs(ang));
ang = Math.Abs(ang) * 180.0 / Math.PI;
int d = (int)ang;
ang = (ang - d) * 60.0;
int m = (int)ang;
double s = (ang - m) * 60.0;
return (d + m / 100.0 + s / 10000.0) * fuhao;
}
第三步:计算(分别计算圆曲线要素以及主点里程)
所需计算公式请自行寻找,这里就不作赘述!
(记得检核哦!!!
检校值{0}", ****
请输入整桩点间隔值
double = double
)
第四步:极坐标元素计算and桩位坐标计算
利用for,if,else 等方法
第五步:存储
存.Add 存.count 等
下面是整体程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;
}
public double HtA(double ang)
{
ang += 1.0E-15;
int fuhao = (int)(ang / Math.Abs(ang));
ang = Math.Abs(ang) * 180.0 / Math.PI;
int d = (int)ang;
ang = (ang - d) * 60.0;
int m = (int)ang;
double s = (ang - m) * 60.0;
return (d + m / 100.0 + s / 10000.0) * fuhao;
}
}
static void Main(string[] args)
{
double T; double L;
double E; double q;
double Kzy; double Kqz;
double Kyz; double Dert;
double Dis; double Tx;
double Ty;
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 Xzy = double.Parse(Console.ReadLine());
Console.WriteLine("请输入直圆点的Y坐标:");
double Yzy = double.Parse(Console.ReadLine());
Console.WriteLine("请输入ZY-JD方位角:");
double Wt = A.AtH2(double.Parse(Console.ReadLine()));
T = R * Math.Tan(Aef/2);
Console.WriteLine("T ={0}", T);
L = R * Aef ;
Console.WriteLine("L ={0}", L);
E = R / Math.Cos(Aef / 2) - R;
Console.WriteLine("E = {0}", E);
q = 2 * T - L;
Console.WriteLine("q = {0}", q);
Kzy = Kjd - T;
Console.WriteLine("Kzy = {0}", Kzy);
Kqz = Kzy + L / 2;
Console.WriteLine("Kqz = {0}", Kqz);
Kyz = Kqz + L / 2;
Console.WriteLine("Kyz = {0}", Kyz);
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 < Kyz; i += ZZD)
{
if (i > Kzy )
{
Kjd1 = i;
存里程.Add(Kjd1);
}
}
Console.WriteLine("本曲线共有{0}个整桩点,请输入需要计算的整桩点点号",存里程.Count);
int co = int.Parse(Console.ReadLine());
Kjd1= 存里程[ co - 1 ];
if (Kqz + q / 2 - Kjd == 0)
{
Dert = A.AtH2(90) * (Kjd1 - Kzy) / (Math.PI * R);
Console.WriteLine("第一桩Dert = {0}", A.HtA(Dert));
Dis = 2 * R * Math.Sin(Dert);
Console.WriteLine("第一桩DIS = {0}", Dis);
Tx = Xzy + Dis * Math.Cos( Wt + Dert);
//Tx = Dis * Math.Cos(Wt + Dert);
Console.WriteLine("Tx(第一桩) = {0}", Tx);
Ty = Yzy + Dis * Math.Sin(Wt + Dert);
Console.WriteLine("Ty(第一桩) = {0}", Ty);
Console.ReadKey();
}
else
{
Console.WriteLine("里程不符合,计算超限");
Console.ReadKey();
}
}
}
}
本程序由吉林建筑科技学院梁*杰老师教学授课,小编经梁*杰老师传授,进行一系列整理希望能帮助到各位测绘同学!(如有侵权请告知!!!)