// 坐标平差 private bool AdjCoord() { mDspStr += ">>> 4.坐标近似平差计算 <<<\r\n"; double fx, fy, fs; double totalS = 0.0; int n = mTraverseLine.Lines.Count; // 导线所有直线段数 for (int i = 1; i <= n - 2; i++) // 计算观测直线总长 { totalS += mTraverseLine.Lines[i].Distance; } double fs0 = 5000.0; fx = mTraverseLine.Lines[n - 1].StartPt.X - mTraverseLine.KnowedObsData.X0[2]; fy = mTraverseLine.Lines[n - 1].StartPt.Y - mTraverseLine.KnowedObsData.Y0[2]; fs = Math.Sqrt(fx * fx + fy * fy); fs = Math.Floor(1 / (fs / totalS)); mDspStr += " 坐标闭合差fx=" + (fx * 1000).ToString("0.0") + "mm fy=" + (fy * 1000).ToString("0.0") + "mm 边长相对误差fs=1/" + fs.ToString("0") + " 限差=1/" + fs0.ToString("0") + "\r\n"; if (fs < fs0) { mDspStr += "坐标闭合差超限!\r\n"; return(false); } // 计算坐标改正数 mDspStr += "坐标改正数\r\n"; double[] Vx = new double[n - 3 + 1], Vy = new double[n - 3 + 1]; double Vx0 = -fx / totalS; double Vy0 = -fy / totalS; for (int i = 0; i <= n - 3; i++) { Vx[i] = Vx0 * mTraverseLine.Lines[i + 1].Distance; Vy[i] = Vy0 * mTraverseLine.Lines[i + 1].Distance; mDspStr += mTraverseLine.Lines[i + 1].EndPt.Name + " 点 的坐标改正数Vx=" + (Vx[i] * 1000).ToString("0.0") + "mm Vy=" + (Vy[i] * 1000).ToString("0.0") + "mm \r\n"; } // 计算坐标改正数 mDspStr += "坐标平差值\r\n"; double totalVx, totalVy; totalVx = totalVy = 0.0; for (int i = 0; i <= n - 3; i++) { totalVx += Vx[i]; totalVy += Vy[i]; mTraverseLine.Lines[i + 1].EndPt.X += totalVx; mTraverseLine.Lines[i + 1].EndPt.Y += totalVy; mDspStr += mTraverseLine.Lines[i + 1].EndPt.Name + " 点 平差坐标X=" + mTraverseLine.Lines[i + 1].EndPt.X.ToString("0.000") + " Y=" + mTraverseLine.Lines[i + 1].EndPt.Y.ToString("0.000") + "\r\n"; // 重新计算导线距离、方位角等数据 mTraverseLine.Lines[i + 1].Direction = BaseFunction.DirectAB(mTraverseLine.Lines[i + 1]); mTraverseLine.Lines[i + 1].Distance = BaseFunction.DistAB(mTraverseLine.Lines[i + 1]); } return(true); }
// 初始化观测值表格 public void InitlGridObsData(frmProcess viewForm) { int n; n = mKnowedObsData.Pnames.Count; // 总点数(已知+未知) viewForm.gridObsData.Rows.Clear(); // 清空原有行 viewForm.gridObsData.Rows.Add(n); // 增加数据行 // 设置已知点单元格格式 // 前面两已知点 viewForm.gridObsData.Rows[0].DefaultCellStyle.BackColor = Color.LightGray; viewForm.gridObsData.Rows[0].ReadOnly = true; viewForm.gridObsData.Rows[1].DefaultCellStyle.BackColor = Color.LightGray; viewForm.gridObsData.Rows[1].ReadOnly = true; viewForm.gridObsData.Rows[1].Cells[2].Style.BackColor = Color.White; viewForm.gridObsData.Rows[1].Cells[2].ReadOnly = false; // 后面两已知点 viewForm.gridObsData.Rows[n - 1].DefaultCellStyle.BackColor = Color.LightGray; viewForm.gridObsData.Rows[n - 1].ReadOnly = true; viewForm.gridObsData.Rows[n - 2].Cells[1].Style.BackColor = Color.LightGray; viewForm.gridObsData.Rows[n - 2].Cells[1].ReadOnly = true; // 赋值序号及点号 for (int i = 0; i <= n - 1; i++) { viewForm.gridObsData.Rows[i].Cells[0].Value = i + 1; viewForm.gridObsData.Rows[i].Cells[1].Value = mKnowedObsData.Pnames[i]; } // 赋值已知点距离 double dist; dist = BaseFunction.DistAB(mKnowedObsData.X0[0], mKnowedObsData.Y0[0], mKnowedObsData.X0[1], mKnowedObsData.Y0[1]); viewForm.gridObsData.Rows[1].Cells[3].Value = dist.ToString("0.000"); dist = BaseFunction.DistAB(mKnowedObsData.X0[2], mKnowedObsData.Y0[2], mKnowedObsData.X0[3], mKnowedObsData.Y0[3]); viewForm.gridObsData.Rows[n - 1].Cells[3].Value = dist.ToString("0.000"); // 赋值观测角度默认值 for (int i = 1; i <= n - 2; i++) { viewForm.gridObsData.Rows[i].Cells[2].Value = "0.0000"; } // 赋值观测距离默认值 for (int i = 2; i <= n - 2; i++) { viewForm.gridObsData.Rows[i].Cells[3].Value = "0.000"; } }
// 初始化导线 private void Intil() { MyPoint startPt, endPt; MyLine line; int n = mTraverseLine.KnowedObsData.Pnames.Count; // 总点数(已知点4+未知点数) // 赋值第一条起始边 startPt = new MyPoint(); startPt.Name = mTraverseLine.KnowedObsData.Pnames[0]; startPt.X = mTraverseLine.KnowedObsData.X0[0]; startPt.Y = mTraverseLine.KnowedObsData.Y0[0]; startPt.Type = 1; endPt = new MyPoint(); endPt.Name = mTraverseLine.KnowedObsData.Pnames[1]; endPt.X = mTraverseLine.KnowedObsData.X0[1]; endPt.Y = mTraverseLine.KnowedObsData.Y0[1]; endPt.Type = 1; line = new MyLine(); line.StartPt = startPt; line.EndPt = endPt; line.Name = startPt.Name + endPt.Name; line.Distance = BaseFunction.DistAB(line); line.Direction = BaseFunction.DirectAB(line); line.Type = 1; mTraverseLine.Lines.Add(line); // 赋值中间未知边 for (int i = 2; i <= n - 2; i++) { startPt = endPt; endPt = new MyPoint(); endPt.Name = mTraverseLine.KnowedObsData.Pnames[i]; endPt.Type = 2; if (i == n - 2) { endPt.Type = 1; endPt.X = mTraverseLine.KnowedObsData.X0[2]; endPt.Y = mTraverseLine.KnowedObsData.Y0[2]; } line = new MyLine(); line.StartPt = startPt; line.EndPt = endPt; line.Name = startPt.Name + endPt.Name; line.Distance = mTraverseLine.KnowedObsData.SS[i - 2]; // 赋值实测距离 line.Type = 2; mTraverseLine.Lines.Add(line); } // 赋值最后一条已知边 startPt = endPt; endPt = new MyPoint(); endPt.Name = mTraverseLine.KnowedObsData.Pnames[n - 1]; endPt.Type = 1; endPt.X = mTraverseLine.KnowedObsData.X0[3]; endPt.Y = mTraverseLine.KnowedObsData.Y0[3]; line = new MyLine(); line.StartPt = startPt; line.EndPt = endPt; line.Name = startPt.Name + endPt.Name; line.Distance = BaseFunction.DistAB(line); line.Direction = BaseFunction.DirectAB(line); line.Type = 1; mTraverseLine.Lines.Add(line); }