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