使用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.");
            }

        }
    }
}

  

posted on 2021-12-13 14:50  风中狂笑  阅读(81)  评论(0编辑  收藏  举报

导航