摘 要:主要針對解決線路工程測量中經常碰到的圓曲線主點放樣采用傳統的手工計算標定要素,再用傳統光學儀器進行放樣時計算量較大,放樣工作繁雜而不靈活這一實際問題進行解決,結合現代工程施工放樣主要是采用全站儀進行,為了能夠減輕計算的工作量,而c#語言也是比較易學易用的計算機語言,所以將兩者的結合應用進行闡述。
關鍵詞:圓曲線;主點放樣;c#語言
中圖分類號:TP文獻標識碼:A文章編號:1672-3198(2008)08-0359-03
無論是采用傳統光學儀器放樣圓曲線主點,還是采用全站儀放樣圓曲線主點,圓曲線要素、圓曲線主點里程均是必須計算出來的,它們的數學模型分別為:
圓曲線要素切線長:T=Rtgα2
曲線長:L=π180#8226;α#8226;R
外矢距:E=R(secα2-1)
切曲差:q=2T-L
圓曲線主點里程計算:
ZY里程=JD里程-T
YZ里程=ZY里程+L
QZ里程=YZ里程-L2(假設JD里程已知)
JD里程=QZ里程+q2(檢核)
各點平面坐標的計算:x=Li-li36R2+li5120R4(QZ點:Li=L2;YZ點:Li=L)y=li22R-Li424R3+L6i720R5
假定我們在進行圓曲線放樣時,建立如下坐標系統(圖1)。
圖1
I——測站點
JD——交點
ZY——直線段公路與曲線段公路的轉折點
QZ——圓曲線中點
YZ——曲線段公路與直線段公路的轉折點
α——曲線轉角(實測或已知)
R——圓曲線設計半徑(已知)
下面是圓曲線主點放樣要素計算基于c#語言編程實現的主要源代碼,考慮到文章的篇幅,對于窗口通用的最大化、最小化、關閉的代碼就沒有再一一列出。
namespace 測量計算器 //程序命名空間
{
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgse)
{
//主要的計算過程就在這里了
//按照計算要求,輸入各已知量,已知量包括:
//轉向角,轉向方向,曲線半徑,曲線主點里程和測站點坐標。
//首先輸入主點里程
int DisMiles;
double DisMeters;
double Distance;
DisMiles = Convert.ToInt32(txtmiles.Text);
DisMeters = Convert.ToDouble(txtmeters.Text);
Distance = 1000 * DisMiles + DisMeters;//得到已知里程
//輸入角度,包括度、分、秒;
int drg = 0, mnt = 0, snd = 0;
drg = int.Parse(txtdeg.Text);
mnt = int.Parse(txtmin.Text);
snd = int.Parse(txtsec.Text);
double vbanjing = double.Parse(txtrd.Text); //輸入曲線半徑
//角度換成弧度:
double grdvalue = ((drg + mnt / 60.0 + snd / 3600.0) / 180.0) * Math.PI;
double valueIX, valueIY;//IY,IX分別是I點的坐標,這個坐標一般已經給出
double valueT,valueL,valueE,valueq; //表示各曲線要素
double valueZY,valueYZ,valueQZ,valueJD; //表示各主點里程
double valueXQZ, valueYQZ, valueXYZ, valueYYZ, valueXJD, valueYJD;//QZ,YZ,JD 3點的坐標
valueIX = Convert.ToDouble(txtx.Text);
valueIY = Convert.ToDouble(txty.Text);
valueT = vbanjing * Math.Tan(grdvalue/2);//算出T
txtT.Text = Math.Round(valueT,3).ToString();
valueL = grdvalue * vbanjing;//算出L;
txtL.Text =Math.Round( valueL,3).ToString();
valueE=vbanjing*((1/Math.Cos(grdvalue/2))-1);//算出E
txte.Text =Math.Round( valueE,3).ToString();
valueq = 2 * valueT - valueL;//算出q;
txtq.Text =Math.Round( valueq,3).ToString();
//接下來計算各主點里程里程
valueZY = Distance + valueL-valueL/2 + valueq/2-valueT;
valueYZ = valueZY + valueL;
valueQZ = valueYZ - valueL/2;
valueJD = valueQZ +valueq/2;
// 定義中間量方便計算轉換
int vzy, vyz, vqz, vjd;
vzy = (int)valueZY / 1000;
vyz = (int)valueYZ / 1000;
vqz = (int)valueQZ / 1000;
vjd = (int)valueJD / 1000;
txtzy1.Text = vzy.ToString();
txtzy2.Text = Convert.ToString(Math.Round((valueZY - 1000 * vzy),3));
txtyz1.Text = vyz.ToString();
txtyz2.Text = Convert.ToString(Math.Round((valueYZ - 1000 * vyz),3));
txtqz1.Text = vqz.ToString();
txtqz2.Text = Convert.ToString(Math.Round((valueQZ - 1000 * vqz),3));
txtjd1.Text = vjd.ToString();
txtjd2.Text = Convert.ToString(Math.Round((valueJD - 1000 * vjd),3));
//首先確定JD點的坐標
valueXJD = valueT;
valueYJD = 0;
//接下來計算4個坐標值:
//注意,在計算4個坐標時,Y坐標的正負由轉向角方向決定,假如向左,Y為負,否則,為正
//所以先定義一個這樣的標量:
int leftORright;
leftORright =left.Checked? -1 : 1; //判斷是否為向左
double LQZ = valueL / 2; //這是計算的之間量!
valueXQZ=LQZ-(LQZ*LQZ*LQZ)/(6*vbanjing*vbanjing)+Math.Pow(LQZ,5)/(120*Math.Pow(vbanjing,4));
txtxqz.Text = Math.Round(valueXQZ,3).ToString(); //計算坐標值
valueYQZ=leftORright*((LQZ*LQZ)/(2*vbanjing)-Math.Pow(LQZ,4)/(24*Math.Pow(vbanjing,3))+Math.Pow(LQZ,6)/(720*(Math.Pow(vbanjing,5))));
txtyqz.Text=Math.Round(valueYQZ,3).ToString();
valueXYZ=valueL-(valueL*valueL*valueL)/(6*vbanjing*vbanjing)+Math.Pow(valueL,5)/(120*Math.Pow(vbanjing,4));
txtxyz.Text = Math.Round(valueXYZ,3).ToString();
valueYYZ=leftORright*((valueL*valueL)/(2*vbanjing)-Math.Pow(valueL,4)/(24*Math.Pow(vbanjing,3))+Math.Pow(valueL,6)/(720*(Math.Pow(vbanjing,5))));
txtyyz.Text=Math.Round(valueYYZ,3).ToString();
//最后進行各點放樣數據的計算,主要包括了方位角計算
//,水平角計算以及三個距離的計算。
//在計算過程中,需要判斷曲線書左向還是右向,因為方向的不同會導致計算結果的不一樣。
//首先定義水平角AIZY:
double AIZY;
if (left.Checked)
AIZY = (270 / 180.0) * Math.PI;
else
AIZY =( 90 / 180.0) * Math.PI;
//下面。根據轉向角的方向確定方位角:
//三個方位角:αIJD, αIQZ, αIYZ,分別是I點到JD、QZ、YZ的方位角
double αIJD, αIQZ, αIYZ;
//在確定方位角后,就可進行放樣要素的計算了,這主要包括2個內容:距離D,以及夾角β:
//首先求得夾角B:βIJD,βIQZ,βIYZ:
double βIJD, βIQZ, βIYZ;
//假如為左:
if (left.Checked)
{
αIJD = 2 * Math.PI - Math.Atan(Math.Abs((valueYJD - valueIY) / (valueXJD - valueIX)));
αIQZ = 2 * Math.PI - Math.Atan(Math.Abs((valueYQZ - valueIY) / (valueXQZ - valueIX)));
αIYZ = 2 * Math.PI - Math.Atan(Math.Abs((valueYYZ - valueIY) / (valueXYZ - valueIX)));
βIJD = αIJD - αIZY;
βIQZ = αIQZ - αIZY;
βIYZ = αIYZ - αIZY;
}
//假如為右
else
{
αIJD = Math.Atan(Math.Abs((valueYJD - valueIY) / (valueXJD - valueIX)));
αIQZ = Math.Atan(Math.Abs((valueYQZ - valueIY) / (valueXQZ - valueIX)));
αIYZ = Math.Atan(Math.Abs((valueYYZ - valueIY) / (valueXYZ - valueIX)));
βIJD = -(αIJD - αIZY);
βIQZ = -(αIQZ - αIZY);
βIYZ = -(αIYZ - αIZY);
}
//轉換成角度(包含度,分,秒)
//定義度,分,秒以及弧度的中間量
//利用Converting()函數實現角度轉變
TXTαIJD.Text = Converting(αIJD / Math.PI * 180.0);
TXTαIQZ.Text = Converting(αIQZ / Math.PI * 180.0);
TXTαIYZ.Text = Converting(αIYZ / Math.PI * 180.0);
//轉換成角度(包含度,分,秒)
βIJD = βIJD / Math.PI * 180.0;
βIQZ = βIQZ / Math.PI * 180.0;
βIYZ = βIYZ / Math.PI * 180.0;
TXTβIJD.Text = Converting(βIJD);// βIJD.ToString();
TXTβIQZ.Text = Converting(βIQZ); //βBIQZ.ToString();
TXTβIYZ.Text = Converting(βIYZ);// βIYZ.ToString();
//最后,計算出點間距離:
double DIJD, DIQZ, DIYZ;
DIJD=Math.Sqrt((valueYJD-valueIY)*(valueYJD-valueIY)+(valueXJD-valueIX)*(valueXJD-valueIX));
DIQZ=Math.Sqrt((valueYQZ-valueIY)*(valueYQZ-valueIY)+(valueXQZ-valueIX)*(valueXQZ-valueIX));
DIYZ=Math.Sqrt((valueYYZ-valueIY)*(valueYYZ-valueIY)+(valueXYZ-valueIX)*(valueXYZ-valueIX));
TXTDIJD.Text = Math.Round(DIJD,3).ToString();
TXTDIQZ.Text = Math.Round(DIQZ,3).ToString();
TXTDIYZ.Text = Math.Round(DIYZ,3).ToString();
}
private string Converting(double jiao)//轉換函數
{
intdu, fen, miao;
string jiaodu;
du =(int) Math.Floor(jiao);
fen =(int) Math.Floor((jiao - du) * 60);
miao =(int)( Math.Round ((((jiao - du) * 60 - Math.Floor((jiao - du) * 60)) * 60),1));
jiaodu = Convert.ToString(du) + ”?“ + Convert.ToString(fen) + ”\\'“ + Convert.ToString(miao) + ”\\””;
return jiaodu;
}
}
}
據此源代碼,進行窗口設計的最終效果圖(如圖2),可供讀者進行參考設計。
圖2 圓曲線主點要素及放樣要素計算器(基于c#語言)
此源代碼可用于施工放樣過程中無法在交點或直圓點安置儀器進行放樣的最復雜的情況,無論是曲線左轉還是右轉,均可通過此程序快速計算出各要素,無論是采用全站儀坐標放樣功能進行主點放樣還是采用傳統光學儀器進行撥角法放樣各主點,均可提高作業精度和速度。同時由于c#語言易學易用,任何一位有編程基礎的測繪人員均可參照此思路及框架采用c#語言進行其他測量功能的實現。