大地測量學白塞爾大地主題解算
阿新 • • 發佈:2018-11-26
namespace 大地測量學1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
double L1 = 130 + (10 * 60 + 12.2676) / 3600.0, B1 = 41 + (1 * 60 + 35.6874 ) / 3600.0, A12 = 1 + (49 * 60 + 43) / 3600.0, S = 80000.0;
double ρ = 206264.806247096355,
a = 6378245, b = 6356863.0187730473, c = 6399698.9017827110, α = 1 / 298.3, e2 = 0.006693421622966, eΒ = 0.006738525414683;//先BLA是角度,BmLmAm是弧度直接進行運算,可以直接進行三角函式運算,感覺在最上邊宣告MATH後就不用再一個一個的代用;
L1 = L1 /180.0 * Math .PI;
B1 = B1 /180.0 * Math.PI;
A12 = (A12 / 180.0) * Math.PI;
//轉化為弧度
double Wm = Math.Sqrt((1 - e2 * (Math.Sin(B1)) * (Math.Sin(B1))));//在此處e2為平方
double Nm = a / Wm;
double Mm = a * (1 - e2) / (Wm * Wm * Wm);
double B02 = ρ / Mm * S * Math .Cos(A12);
double L02 = ρ / Nm * S * Math.Sin(A12) * (Math.Cos(B1) / Math.Sin(B1));
double A02 = L02 * Math.Sin(B1);
L1 = 130 + (10 * 60 + 12.2676) / 3600.0;
B1 = 41 + (1 * 60 + 35.6874) / 3600.0;
A12 = 1 + (49 * 60 + 43) / 3600.0;
double Bm = B1 + 1 / 2.0 * B02 / 3600;
double Am = A12 + 1 / 2.0 * A02 / 3600;//此時為角度
Bm = Bm/180*Math.PI;
Am = Am/180*Math.PI;//此時為弧度
double L2 = ρ / Nm * S * Math.Sin(Am) * (Math.Cos(Bm) / Math.Sin(Bm)) * (1 + A02 * A02 / (24 * ρ * ρ) - B02 * B02 / (24 * ρ * ρ));
double B2 = ρ / Mm * S * Math.Cos(Am) * (1 + L02 * L02 / 12 / (ρ * ρ) + A02 * A02 / 24 / (ρ * ρ))/*我用了一個連續相除*/;
double A2 = ρ / Nm * S * Math.Sin(Am) * Math.Tan(Bm) * (1 + B02 * B02 / 12 / ρ / ρ + L02 * L02 / 12 / ρ / ρ * Math.Cos(Bm) * Math.Cos(Bm) + A02 * A02 / 24 / ρ / ρ);
double i = 1;
for (i = 1; (Math.Abs(B2 - B02) > 0.0001); i++)
{
Bm = B1 + 1 / 2.0 * B2 / 3600;
Am = A12 + 1 / 2.0 * A2 / 3600;//此時為角度
Bm = Bm / 180 * Math.PI;
Am = Am / 180 * Math.PI;//此時為弧度
B02 = B2;
L02 = L2;
A02 = A2;
L2 = ρ / Nm * S * Math.Sin(Am) * (Math.Cos(Bm) / Math.Sin(Bm)) * (1 + A02 * A02 / (24 * ρ * ρ) - B02 * B02 / (24 * ρ * ρ));
B2 = ρ / Mm * S * Math.Cos(Am) * (1 + L02 * L02 / 12 / (ρ * ρ) + A02 * A02 / 24 / (ρ * ρ))/*我用了一個連續相除*/;
A2 = ρ / Nm * S * Math.Sin(Am) * Math.Tan(Bm) * (1 + B02 * B02 / 12 / ρ / ρ + L02 * L02 / 12 / ρ / ρ * Math.Cos(Bm) * Math.Cos(Bm) + A02 * A02 / 24 / ρ / ρ);
}
double B = B1 + B2/3600;//角度
double L = L1 + L2 / 3600;
double A21 = A12 + A2/3600+180;
Console.WriteLine("{0} {1}", i , B);
textBox1.Text = Convert.ToString(B);
textBox3.Text = Convert.ToString(L);
textBox5.Text = Convert.ToString(A21);
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
double L1 = 130 + (10 * 60 + 12.2676) / 3600.0, B1 = 41 + (1 * 60 + 35.6874) / 3600.0;
double ρ = 206264.806247096355,
a = 6378245, b = 6356863.0187730473, c = 6399698.9017827110, e2 = 0.006693421622966, eΒ = 0.006738525414683;//先BLA是角度,BmLmAm是弧度直接進行運算,可以直接進行三角函式運算,感覺在最上邊宣告MATH後就不用再一個一個的代用;
double L2 = 130.196203938625;
double B2 = 41.7465640175246;
double L = L2 - L1;
L= L / 180.0 * Math.PI;
double Bm = (B1 + B2) / 2.0;
double Lm = (L1 + L2) / 2.0;//此時為角度
L1 = L1 / 180.0 * Math.PI;
B1 = B1 / 180.0 * Math.PI;
//轉化為弧度
L2 = L2 / 180.0 * Math.PI;
B2 = B2/ 180.0 * Math.PI;
double W1 = Math.Sqrt(1 - e2 * Math.Sin(B1) * Math.Sin(B1));
double W2 = Math.Sqrt(1 - e2 * Math.Sin(B2));
double u1, u2;
//Math.Sin(u1) = Math.Sin(B1) * Math.Sqrt(1 - e2) / W1;
//Math.Sin(u2) = Math.Sin(B2) * Math.Sqrt(1 - e2) / W2;
//Math.Cos(u1) = Math.Cos(B1) / W1;
//Math.Cos(u2) = Math.Cos(B2) / W2;
double a1 = Math.Sin(B1) * Math.Sqrt(1 - e2) / W1 * Math.Sin(B2) * Math.Sqrt(1 - e2) / W2;
double a2 = Math.Cos(B1) / W1 * Math.Cos(B2) / W2;
double b1 = Math.Cos(B1) / W1 * Math.Sin(B2) * Math.Sqrt(1 - e2) / W2;
double b2 = Math.Sin(B1) * Math.Sqrt(1 - e2) / W1 * Math.Cos(B2) / W2;
double δ = 0.0;
double λ=L+δ;//這時候sitar為弧度
double p=Math.Cos(B2)/W2*Math.Sin(λ);
double q = b1 - b2 * Math.Cos(λ);
double A1 = Math.Atan(p / q);
A1 = A1 / Math.PI * 180;//此時為角度
if (p > 0)
{
if (q > 0)
{
A1 = Math.Abs(A1);
}
else
{
A1 = 180 - Math.Abs(A1);
}
}
else
{
if (q < 0)
{
A1 = 180 + Math.Abs(A1);
}
else
{
A1 = 360 - Math.Abs(A1);
}
}
//Math.Sin(δ) = p * Math.Sin(A1) + q * Math.Cos(A1);
//Math.Cos(δ) = a1 + a2 * Math.Cos(λ);
double o = Math.Atan(p * Math.Sin(A1) + q * Math.Cos(A1) / a1 + a2 * Math.Cos(λ));//此時為弧度
o = o / Math.PI * 180;//此時為角度
if ((a1 + a2 * Math.Cos(λ)) > 0)
{
o = Math.Abs(o);
}
else
{
o = 180 - Math.Abs(o);
}
//Math.Cos(A0)
//把A1化為弧度
A1=A1/Math.PI*180;
double zy=Math.Cos(B1) / W1*Math.Sin(A1);
o=o/180*Math.PI;//化弧
//Math .Sqrt(1-zy*zy);
//sin a0=cos u1*sin A1;
double α = (33523299 - (28189 - 70 *(1-zy*zy)) *(1-zy*zy)) * 0.0000000001;
double Β1 = (28189 - 94 * (1-zy*zy)) * 0.0000000001;
double x=2*a1-(1-zy*zy)*Math.Cos(δ);
double δ1 = (α * o - Β1 * x * Math.Sin(o)) * (Math.Cos(B1) / W1 * Math.Sin(A1));
///////////////////////////
///////////////////////////
///////////////////////////
double i=1;
for(i=1;Math.Abs(δ1-δ)>0.000001;i++)
{
δ = δ1;
λ = L + δ;
p = Math.Cos(B2) / W2 * Math.Sin(λ);
q = b1 - b2 * Math.Cos(λ);
A1 = Math.Atan(p / q);
A1 = A1 / Math.PI * 180;//此時為角度
if (p > 0)
{
if (q > 0)
{
A1 = Math.Abs(A1);
}
else
{
A1 = 180 - Math.Abs(A1);
}
}
else
{
if (q < 0)
{
A1 = 180 + Math.Abs(A1);
}
else
{
A1 = 360 - Math.Abs(A1);
}
}
//Math.Sin(δ) = p * Math.Sin(A1) + q * Math.Cos(A1);
//Math.Cos(δ) = a1 + a2 * Math.Cos(λ);
o = Math.Atan(p * Math.Sin(A1) + q * Math.Cos(A1) / a1 + a2 * Math.Cos(λ));//此時為弧度
o = o / Math.PI * 180;//此時為角度
if ((a1 + a2 * Math.Cos(λ)) > 0)
{
o = Math.Abs(o);
}
else
{
o = 180 - Math.Abs(o);
}
//Math.Cos(A0)
//把A1化為弧度
A1 = A1 /180*Math.PI;
zy = Math.Cos(B1) / W1 * Math.Sin(A1);
o = o / 180 * Math.PI;//化弧
//Math .Sqrt(1-zy*zy); zy=sin A0 平方 cos (1 - zy * zy)
//sin a0=cos u1*sin A1;
α = (33523299 - (28189 - 70 * (1 - zy * zy)) * (1 - zy * zy)) * 0.0000000001;
Β1 = (28189 - 94 * (1 - zy * zy)) * 0.0000000001;
x = 2 * a1 - (1 - zy * zy) * Math.Cos(δ);
δ1 = (α * o - Β1 * x * Math.Sin(o)) * (Math.Cos(B1) / W1 * Math.Sin(A1));
}
double y = ((1 - zy * zy)*(1 - zy * zy) - 2 * x * x) * Math.Cos(o);
double A = 6356863.020 + (10708.949 - 13.474 * (1 - zy * zy)) * (1 - zy * zy);
double B22 = 10708.938 - 17.956 * (1 - zy * zy);
double C22 = 4.487;
double S = A * o + (B22 * x + C22 * y) * Math.Sin(o);
double A2 = Math.Atan(Math.Cos(B1) / W1 * Math.Sin(λ) / (b1 * Math.Cos(λ) - b2));
textBox2.Text = Convert.ToString(S);
textBox4.Text = Convert.ToString(A2);
textBox6.Text = Convert.ToString(y);
}
}
}
這個實驗運用了兩次迭代感覺自己已經基本掌握了迭代的用法,但是不知道反算哪裡出了問題,傷心。。。不過逐漸搞懂了大一學習C語言時老師教的基礎課,需要程式的苦逼測繪人可以聯絡我,學長幫人到底。
謝謝閱讀