圆曲线要素及其计算(含细部点)C#

圆曲线

单圆曲线简称圆曲线,是最简单的一种圆曲线,其测设和资料计算都比较容易。但在测设之前,必须进行曲线要素及主要点的里程计算.

圆曲线要素及其计算

在这里插入图片描述

如图所示,圆曲线的半径R、偏角(即线路转向角)α、切线长T、曲线长L、外矢距E及切曲差q(又叫矫正数或超距),称为曲线要素。其中,R以及α均为已知数据。R是在设计中按路线等级及地形条件等因素选定的,α是线路定测时测出的。其余要素可按照下列关系式计算得出
{ T = R t a n ( α / 2 ) L = π / 180 ° ∗ α R E = R ( s e c ( α / 2 ) − 1 ) q = 2 T − L \begin{cases} T=Rtan(α/2)\\ L=π/180°*αR\\ E=R(sec(α/2)-1)\\ q=2T-L \end{cases} T=Rtanα/2L=π/180°αRE=R(sec(α/2)1)q=2TL

圆曲线主要点里程的计算

圆曲线的主要点包括
——ZY点(直圆点),直线与圆曲线的连接点
——QZ(曲中点),圆曲线的中点
——YZ(圆直点),圆曲线与直线的连接点
其主要点的里程,可以通过交点JD的里程计算得出

算例如下

例1,已知α=10°25′10″,R=800m,JD里程为DK11+295.78,求曲线主点要素和主点里程。
T=Rtan(α/2)=72.94m
L=π/180°*αR=145.48m
E=R(sec(α/2)-1)=3.32m
q=2T-L=0.40m
主点里程计算如下
    JD DK11+295.78         检核:
-T            72.94        JD DK11+295.78
—————————       +L/2           72.94
    ZY DK11+222.84            DK11+368.72
+L/2           72.94         ————————
—————————       -q             0.40
    QZ DK11+295.58         ————————
+L/2           72.94        YZ DK11+368.32
—————————
    YZ DK11+368.32

细部点计算(偏角法)

用偏角法测设圆曲线上的细部点是以曲线起点(或终点)作为测站,计算出测站至曲线上任一细部点Pi的弦线与切线的夹角—弦切角i(称为偏角)和弦长Ci或相邻细部点的弦长c,据此确定Pi点的位置。曲线上的细部点即曲线上的里程桩,一般按曲线半径R规定弧长为l的整桩。l一般规定为5m、10m和20m,R越小,l也越小。
在这里插入图片描述
由直圆点(圆直点),圆心和细部点三点构成的一个等腰三角形,大圆心角即为α(通过几何关系可以得出和转角α是相等的),细部点到直圆点(圆直点)之间的弧长设为Li,其弧长所对应的弦长设为Ci,弧长所对应的圆心角设为αi,三角形的两个底角设为∠b,则∠b=(180°-αi)/2,偏角i=90°-∠b,即i=αi/2,Li=αi * R(注意这个公式中,αi是弧度制,一般题目中会给度分秒的60进制角度,编程中会给出dd.mmsssss的60进制角度形式,注意要将其化成弧度运算,或者是用Li=αi*R * Π/180°(这里的α是十进制角度)进行运算)。弦长Ci=2R * sini。现将公式总结如下
{ i = α i / 2 C i = 2 R ∗ s i n i L i = α i ∗ R ∗ Π / 180 ° \begin{cases} i=αi/2\\ Ci=2R * sini\\ Li=αi*R * Π/180° \end{cases} i=αi/2Ci=2RsiniLi=αiRΠ/180°
在进行实地放样时,假设已经测设出主点的位置,右转线路具体测设细部点的方式如下:
正拨
1.安置经纬仪(或全站仪)于曲线起点(ZY)上,瞄准交点(JD),使水平度盘读数设置为00°00′00″ ;
2.水平转动照准部,正拨使度盘读数为i1,沿此方向测设弦长Ci1,定出 P1点;
3.再水平转动照准部,使度盘读数为i2,沿此方向测设长弦Ci2,定出P2点;以此类推,测设其他细部点;
反拨
1.安置经纬仪(或全站仪)于曲线终点(YZ)上,瞄准交点(JD),使水平度盘读数设置为00°00′00″ ;
2.水平转动照准部,反拨使度盘读数为i1,沿此方向测设弦长Ci1,定出 P1点;
3.再水平转动照准部,使度盘读数为i2,沿此方向测设长弦Ci2,定出P2点;以此类推,测设其他细部点;

正拨反拨判断以及左转右转的具体解释

1.左转和右转的判断:沿着路线的方向看,右偏就是右转,有右转角,左偏就是左转,有左转角,这个很好判断,注意跟测量学中的左角右角区别开。
2.正拨反拨:正拨为顺时针转,角度值与度盘读数值增加方向一致;反拨为逆时针转,角度值与度盘读数值减少方向一致(在测试细部点时,左转的情况下,全站仪或经纬仪,架设在ZY点要反拨,架设在YZ点要正拨;右转的情况下,全站仪或经纬仪,架设在ZY点要正拨,架设在YZ点要反拨)

C#代码实现

界面设计

控件用了label、textbox、radiobutton、button和datagridview
在这里插入图片描述

代码实现

1.先做了一个角度转弧度(JDZHD)和弧度转角度的封装,便于在给定初始的转角α值时,先进行弧度转化,便于Math函数的识别,最后在计算出偏角i的时候,将算出的弧度其转化为角度(实际测设的时候,肯定是拨角度分秒,不可能让你拨一个弧度制的角吧,毕竟仪器是60进制角度制的)
2.计算出T,L,E,q,算出主点的里程,然后注意用IndexOf和Substring进行字符串的截取,把"DK"、“+”、“里程的数值”截取出来
3.在计算桩的个数和桩号的时候,用到了ceiling(向上取整)和floor(向下取整)函数,注意算法问题,我这里以桩距20为例,桩的总个数就是(曲中点里程/20向下取整-直圆点里程/20向上取整)+(圆直点里程/20向下取整-曲中点里程/20向上取整),ZY-QZ和QZ-YZ的桩的个数,就是上式中"+"的前一部分和后一部分
4.在进行for循环时候,特别注意循环的次数,你第0行是要写ZY数据的,然后在写ZY-QZ这个区间里桩的数据,然后写两个QZ点数据,然后再写QZ-YZ这个区间里的桩的数据,然后写YZ的数据。
5.本程序比较简单,只能算不递增公里数的桩号里程,比如说ZY点里程DK1+20.12,YZ点里程DK1+891.22,这就是都在1-2公里之间,你的桩号就都是DK1开头,但如果ZY是DK1+20.12,YZ是DK2+60.11,这就会涉及到DK1和DK2开头的桩号,也就是满一公里之后,DK后面的整公里数值要递增1的问题。

public double JDZHD(double degrees)
        {
            double d = Math.Truncate(degrees);
            double m = Math.Truncate((degrees - d) * 100);
            double s = ((degrees - d) * 100 - m) * 100;
            double radians = (d + m / 60 + s / 3600) / 180 * Math.PI;
            return radians;
        }
        public static double HTOD(double radians)
        {
            double dd = radians / Math.PI * 180;
            double d = Math.Truncate(dd);
            double m = Math.Truncate((dd - d) * 60);
            double s = Math.Round(((dd - d) * 60 - m) * 60, 4);
            double degrees = d + m / 100 + s / 10000;
            return degrees;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            double ZJ = double.Parse(textBox1.Text);//转角
            double R = double.Parse(textBox2.Text);//半径
            double d = double.Parse(textBox4.Text);//桩距
            double ZJ1 = JDZHD(ZJ);
            double T = R * Math.Tan(ZJ1 / 2);
            double L = R*ZJ1;
            double E = R * (1 / Math.Cos(ZJ1 / 2) - 1);
            double q = 2 * T - L;
            textBox5.Text = T.ToString();
            textBox6.Text = L.ToString();
            textBox7.Text = E.ToString();
            textBox8.Text = q.ToString();
            string s = textBox3.Text;
            string s1 = s.Trim();
            int f1 = s1.IndexOf('K');
            int f2 = s1.IndexOf('+');
            string s2 = s1.Substring(0, f1 + 1);  //DK                            
            string s3 = s1.Substring(2, f2 - f1 - 1);                     
            string s4 = s1.Substring(f2);
            double LC = double.Parse(s3) * 1000 + double.Parse(s4);
            int s5 = Convert.ToInt32(s3);
            double JD = LC;
            double ZY = JD - s5 * 1000 - T;
            double YZ = ZY + L;
            double QZ = ZY + (L / 2);
            int A = (int)Math.Ceiling(ZY / d);
            int B = (int)Math.Floor(YZ / d);
            int Q1 = (int)Math.Floor(QZ / d);
            int Q2 = (int)Math.Ceiling(QZ / d);
            int n1 = Q1 - A;
            int n2 = B - Q2;
            double[,] mm = new double[n1 + 3, 3];
            mm[0, 0] = ZY;
            mm[0, 1] = 0;
            mm[0, 2] = 0;
            mm[1, 0] = A * d;
            mm[n1 + 1, 0] = B * d;
            mm[n1 + 2, 0] = QZ;
            mm[n1 + 2, 1] = QZ - Q1 * d;
            mm[n1 + 2, 2] = HTOD(2 * Math.PI - ((QZ - ZY) / R / 2));
            if (radioButton2.Checked == true)
            {
                mm[n1 + 2, 2] = HTOD((QZ - ZY) / R / 2);
            }
            dataGridView1.Rows.Add();
            dataGridView1.Rows[0].Cells[0].Value = s2 + s3 + "+" + mm[0, 0];
            dataGridView1.Rows[0].Cells[1].Value = mm[0, 1];
            dataGridView1.Rows[0].Cells[2].Value = mm[0, 2];
            for (int i = 0; i < n1 + 1; i++)
            {
                mm[i + 1, 0] = A * d + d * i;//里程
                mm[i + 1, 1] = mm[i + 1, 0] - mm[i, 0];//曲线点间距
                mm[i + 1, 2] = HTOD(2 * Math.PI - ((mm[i + 1, 0] - mm[0, 0]) / R / 2));//偏角
                if (radioButton2.Checked == true)
                {
                    mm[i + 1, 2] = HTOD((mm[i + 1, 0] - mm[0, 0]) / R / 2);
                }
                dataGridView1.Rows.Add();
                dataGridView1.Rows[i + 1].Cells[0].Value = s2 + s3 + "+" + mm[i + 1, 0];
                dataGridView1.Rows[i + 1].Cells[1].Value = Math.Round(mm[i + 1, 1], 4);
                dataGridView1.Rows[i + 1].Cells[2].Value = Math.Round(mm[i + 1, 2], 8);
            }
            dataGridView1.Rows.Add();
            dataGridView1.Rows[n1 + 2].Cells[0].Value = s2 + s3 + "+" + mm[n1 + 2, 0];
            dataGridView1.Rows[n1 + 2].Cells[1].Value = Math.Round(mm[n1 + 2, 1], 4);
            dataGridView1.Rows[n1 + 2].Cells[2].Value = mm[n1 + 2, 2];
            double[,] ww = new double[n1 + 3, 3];
            ww[0, 0] = QZ;
            ww[1, 0] = Q2 * d;
            ww[n2 + 1, 0] = B * d;
            ww[n2 + 2, 0] = YZ;
            ww[n2 + 1, 1] = YZ - B * d;
            for (int x = 0; x < n2 + 2; x++)
            {
                if (x < n2 + 1)
                {
                    ww[x + 1, 0] = Q2 * d + d * x;
                    ww[x, 1] = ww[x + 1, 0] - ww[x, 0];
                }
                ww[x, 2] = HTOD((ww[n2 + 2, 0] - ww[x, 0]) / R / 2);
                if (radioButton2.Checked == true)
                {
                    ww[x, 2] = HTOD(2 * Math.PI - ((ww[n2 + 2, 0] - ww[x, 0]) / R / 2));
                }
                dataGridView1.Rows.Add();
                dataGridView1.Rows[x + n1 + 3].Cells[0].Value = s2 + s3 + "+" + ww[x, 0];
                dataGridView1.Rows[x + n1 + 3].Cells[1].Value = Math.Round(ww[x, 1], 4);
                dataGridView1.Rows[x + n1 + 3].Cells[2].Value = Math.Round(ww[x, 2], 8);
            }
            dataGridView1.Rows.Add();
            dataGridView1.Rows[n2 + n1 + 5].Cells[0].Value = s2 + s3 + "+" + ww[n2 + 2, 0];
            dataGridView1.Rows[n2 + n1 + 5].Cells[1].Value = ww[n2 + 2, 1];
            dataGridView1.Rows[n2 + n1 + 5].Cells[2].Value = ww[n2 + 2, 2];
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
            textBox3.Text = "";
            textBox2.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";
            textBox6.Text = "";
            textBox7.Text = "";
            textBox8.Text = "";
            dataGridView1.Rows.Clear();
        }
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值