使用C#编制一个控制台应用-竖曲线标高计算
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace 竖曲线计算 { class Program { static void Main(string[] args) { string folder = Directory.GetCurrentDirectory(); string file_path = Path.Combine(folder, "data.txt"); double[,] arr = Toolbox.readData(file_path); if (arr != null) { string sInput = ""; bool endApp = false; while (!endApp) { Console.Write("请输入桩号:"); sInput = Console.ReadLine(); double dMile = 0; while (!double.TryParse(sInput, out dMile)) { Console.Write("This is not valid input. Please enter an integer value: "); sInput = Console.ReadLine(); } double h = Toolbox.getElevation(arr, dMile); Console.Write("Press 'n' and Enter to close the app, or press any other key and Enter to continue: "); if (Console.ReadLine() == "n") endApp = true; } } } } class Toolbox { public static double getElevation(double[,] arrIn, double dMile) { double[,] arrOut = Toolbox.getData(arrIn); double h = 0; for (int i = 1; i < arrOut.GetLength(0) - 1; i++) { double dPrevMile = arrOut[i - 1, 0]; double dCurtMile = arrOut[i, 0]; double dNextMile = arrOut[i + 1, 0]; double dPrevElevation = arrOut[i - 1, 1]; double dCurtElevation = arrOut[i, 1]; double dNextElevation = arrOut[i + 1, 1]; //if (dMile == dPrevMile) //{ // Console.WriteLine("the elevation is :{0:N5}", dPrevElevation); // break; //} //else if (dMile == dCurtMile) //{ // Console.WriteLine("the elevation is :{0:N5}", dCurtElevation); // break; //} //else if (dMile == dNextMile) //{ // Console.WriteLine("the elevation is :{0:N5}", dNextElevation); // break; //} if ((dMile > dPrevMile) && (dMile < dNextMile)) { double dPrevTag = arrOut[i - 1, 5]; double dCurtTag = arrOut[i, 5]; double dNextTag = arrOut[i + 1, 5]; double dRadius = arrOut[i, 2]; double kL = arrOut[i, 3]; double kR = arrOut[i, 4]; double omgea = kR - kL; if ((dPrevTag == 0 && dCurtTag == -1 && dNextTag == 0) || (dPrevTag == 1 && dCurtTag == -1 && dNextTag == 0))/// left line right arc { if (dMile < dCurtMile) { h = dCurtElevation + kL * (dMile - dCurtMile); Console.WriteLine("the elevation is {0:N5}", h); break; } else if (dMile < dNextMile) { h = dCurtElevation + kL * (dMile - dCurtMile) + Math.Sign(omgea) * Math.Pow((dMile - dCurtMile), 2) / 2 / dRadius; Console.WriteLine("the elevation is {0:N5}", h); break; } } if (dPrevTag == -1 && dCurtTag == 0 && dNextTag == 1)///either arc { if (dMile < dCurtMile) { h = dCurtElevation + kL * (dMile - dCurtMile) + Math.Sign(omgea) * Math.Pow((dMile - dPrevMile), 2) / 2 / dRadius; Console.WriteLine("the elevation is {0:N5}", h); break; } else if (dMile < dNextMile) { h = dCurtElevation + kR * (dMile - dCurtMile) + Math.Sign(omgea) * Math.Pow((dMile - dNextMile), 2) / 2 / dRadius; Console.WriteLine("the elevation is {0:N5}", h); break; } } if ((dPrevTag == 0 && dCurtTag == 1 && dNextTag == -1) || (dPrevTag == 0 && dCurtTag == 1 && dNextTag == -1))///left arc right line { if (dMile < dCurtMile) { h = dCurtElevation + kR * (dMile - dCurtMile) + Math.Sign(omgea) * Math.Pow((dMile - dCurtMile), 2) / 2 / dRadius; Console.WriteLine("the elevation is {0:N5}", h); break; } else if (dMile < dNextMile) { h = dCurtElevation + kR * (dMile - dCurtMile); Console.WriteLine("the elevation is {0:N5}", h); break; } } //Console.WriteLine("neither"); } } return h; } public static double[,] getData(double[,] arrIn) { int iRowsCount = arrIn.GetLength(0); int iColsCount = arrIn.GetLength(1); double[,] arrOut = new double[(iRowsCount - 1) * 3 + 2, 6]; int iOutRowscount = arrOut.GetLength(0); arrOut[0, 0] = arrIn[0, 0]; arrOut[0, 1] = arrIn[0, 1]; arrOut[0, 2] = arrIn[0, 2]; arrOut[0, 3] = 0; arrOut[0, 4] = 0; arrOut[0, 5] = 0; for (int i = 1; i < iRowsCount - 1; i++) { double dMile = arrIn[i, 0]; double dElevation = arrIn[i, 1]; double dRadius = arrIn[i, 2]; double dPreMile = arrIn[i - 1, 0]; double dPreElevation = arrIn[i - 1, 1]; double dNextMile = arrIn[i + 1, 0]; double dNextElevation = arrIn[i + 1, 1]; double dPreSlope = -(dElevation - dPreElevation) / (dPreMile - dMile); double dNextSlope = (dNextElevation - dElevation) / (dNextMile - dMile); double dArcLength = Math.Abs(dRadius * (dNextSlope - dPreSlope)); double dTangentLength = dArcLength / 2; arrOut[3 * i - 2, 0] = dMile - dTangentLength; arrOut[3 * i - 1, 0] = dMile; arrOut[3 * i - 0, 0] = dMile + dTangentLength; arrOut[3 * i - 2, 1] = dElevation - dTangentLength * dPreSlope; arrOut[3 * i - 1, 1] = dElevation; arrOut[3 * i - 0, 1] = dElevation + dTangentLength * dNextSlope; arrOut[3 * i - 2, 1] = dElevation - dTangentLength * dPreSlope; arrOut[3 * i - 1, 1] = dElevation; arrOut[3 * i - 0, 1] = dElevation + dTangentLength * dNextSlope; arrOut[3 * i - 2, 1] = dElevation - dTangentLength * dPreSlope; arrOut[3 * i - 1, 1] = dElevation; arrOut[3 * i - 0, 1] = dElevation + dTangentLength * dNextSlope; arrOut[3 * i - 2, 2] = dRadius; arrOut[3 * i - 2, 3] = dPreSlope; arrOut[3 * i - 2, 4] = dNextSlope; arrOut[3 * i - 2, 5] = -1; arrOut[3 * i - 1, 2] = dRadius; arrOut[3 * i - 1, 3] = dPreSlope; arrOut[3 * i - 1, 4] = dNextSlope; arrOut[3 * i - 1, 5] = 0; arrOut[3 * i - 0, 2] = dRadius; arrOut[3 * i - 0, 3] = dPreSlope; arrOut[3 * i - 0, 4] = dNextSlope; arrOut[3 * i - 0, 5] = 1; } arrOut[iOutRowscount - 1, 0] = arrIn[iRowsCount - 1, 0]; arrOut[iOutRowscount - 1, 1] = arrIn[iRowsCount - 1, 1]; arrOut[iOutRowscount - 1, 2] = arrIn[iRowsCount - 1, 2]; arrOut[iOutRowscount - 1, 3] = 0; arrOut[iOutRowscount - 1, 4] = 0; arrOut[iOutRowscount - 1, 5] = 0; return arrOut; } public static double[,] readData(string file_path) { try { //string[] lines = IO.File.ReadAllLines(file_path); string line; int counter = 0; int arrRowsCount = 0; char[] delimiterChars = { '\t' }; StreamReader sr = new StreamReader(file_path); line = sr.ReadLine(); arrRowsCount = int.Parse(line); //read the first line double[,] arr = new double[arrRowsCount, 3]; //read the rest lines untill the end while (line != null && counter < arrRowsCount) { line = sr.ReadLine(); Console.WriteLine(line); string[] numbers = line.Split(delimiterChars); arr[counter, 0] = double.Parse(numbers[0]); arr[counter, 1] = double.Parse(numbers[1]); arr[counter, 2] = double.Parse(numbers[2]); counter++; } sr.Close(); return arr; //Console.ReadKey(); } catch (Exception e) { Console.WriteLine("Exception: " + e.Message); return null; } finally { //Console.WriteLine("Executing finally block."); } } } }