275 lines
9.0 KiB
C#
275 lines
9.0 KiB
C#
|
|
using MetroGauges.General;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.ComponentModel;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Runtime.CompilerServices;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
|
|||
|
|
namespace MetroGauges.Model
|
|||
|
|
{
|
|||
|
|
public class LiEquiModel : DataModel
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 所在位置
|
|||
|
|
/// </summary>
|
|||
|
|
public override PositionII Position2
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (StrPosition == "受电弓")
|
|||
|
|
{
|
|||
|
|
return PositionII.Pantograph;
|
|||
|
|
}
|
|||
|
|
else if (StrPosition == "车体顶部")
|
|||
|
|
{
|
|||
|
|
return PositionII.TopBody;
|
|||
|
|
}
|
|||
|
|
else if (StrPosition == "车体底架边梁以上")
|
|||
|
|
{
|
|||
|
|
return PositionII.UpChassis;
|
|||
|
|
}
|
|||
|
|
else if (StrPosition == "车体底架边梁及以下")
|
|||
|
|
{
|
|||
|
|
return PositionII.LowChassis;
|
|||
|
|
}
|
|||
|
|
else if (StrPosition == "转向架")
|
|||
|
|
{
|
|||
|
|
return PositionII.Bogie;
|
|||
|
|
}
|
|||
|
|
else if (StrPosition == "车下轨内吊挂")
|
|||
|
|
{
|
|||
|
|
return PositionII.InnerBodyHanger;
|
|||
|
|
}
|
|||
|
|
else if (StrPosition == "车下轨外吊挂")
|
|||
|
|
{
|
|||
|
|
return PositionII.InnerBodyHanger;
|
|||
|
|
}
|
|||
|
|
else if (StrPosition == "轮对")
|
|||
|
|
{
|
|||
|
|
return PositionII.Wheelset;
|
|||
|
|
}
|
|||
|
|
//else if (StrPosition == "车下轨内")
|
|||
|
|
//{
|
|||
|
|
// return PositionII.InnerOthers;
|
|||
|
|
//}
|
|||
|
|
//else if (StrPosition == "车下轨外")
|
|||
|
|
//{
|
|||
|
|
// return PositionII.InnerOthers;
|
|||
|
|
//}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return PositionII.INVAIL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
private static double δX_a;
|
|||
|
|
private static double δY_a;
|
|||
|
|
private static double δY_b;
|
|||
|
|
private static double δX_c;
|
|||
|
|
private static double δX_d;
|
|||
|
|
private static double δY_d;
|
|||
|
|
private static double δX_e;
|
|||
|
|
private static double δY_e;
|
|||
|
|
private static double δX_f;
|
|||
|
|
private static double δY_f;
|
|||
|
|
private static double δY_g;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 受电弓
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔX_a { get => δX_a; set { δX_a = value; OnPropertyChanged(); } }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 受电弓
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔY_a { get => δY_a; set { δY_a = value; OnPropertyChanged(); } }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 车顶
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔY_b { get => δY_b; set { δY_b = value; OnPropertyChanged(); } }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 底架边梁以上
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔX_c { get => δX_c; set { δX_c = value; OnPropertyChanged(); } }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 底架边梁及以下
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔX_d { get => δX_d; set { δX_d = value; OnPropertyChanged(); } }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 底架边梁及以下
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔY_d { get => δY_d; set { δY_d = value; OnPropertyChanged(); } }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 转向架
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔX_e { get => δX_e; set { δX_e = value; OnPropertyChanged(); } }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 转向架
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔY_e { get => δY_e; set { δY_e = value; OnPropertyChanged(); } }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 车下吊挂
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔX_f { get => δX_f; set { δX_f = value; OnPropertyChanged(); } }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 车下轨外吊挂
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔY_f { get => δY_f; set { δY_f = value; OnPropertyChanged(); } }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 车下轨内吊挂
|
|||
|
|
/// </summary>
|
|||
|
|
public double ΔY_g { get => δY_g; set { δY_g = value; OnPropertyChanged(); } }
|
|||
|
|
///// <summary>
|
|||
|
|
///// 车下轨内
|
|||
|
|
///// </summary>
|
|||
|
|
//private static double δY_h;
|
|||
|
|
//public double ΔY_h { get => δY_h; set { δY_h = value; OnPropertyChanged(); } }
|
|||
|
|
///// <summary>
|
|||
|
|
///// 车下轨外
|
|||
|
|
///// </summary>
|
|||
|
|
//private static double δY_i;
|
|||
|
|
//public double ΔY_i { get => δY_i; set { δY_i = value; OnPropertyChanged(); } }
|
|||
|
|
|
|||
|
|
public LiEquiModel()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
public LiEquiModel(string strPosition, string name, double x, double y)
|
|||
|
|
{
|
|||
|
|
StrPosition = strPosition;
|
|||
|
|
Name = name;
|
|||
|
|
X = x;
|
|||
|
|
Y = y;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 直线设备限界-偏移x偏移值
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="x1"></param>
|
|||
|
|
/// <param name="y1"></param>
|
|||
|
|
/// <param name="x2"></param>
|
|||
|
|
/// <param name="y2"></param>
|
|||
|
|
/// <param name="C"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public double X_(double x1, double y1, double x2, double y2, double C)
|
|||
|
|
{
|
|||
|
|
if (y1 == y2)
|
|||
|
|
return 0;
|
|||
|
|
else
|
|||
|
|
return C / Math.Sqrt(1 + (x2 - x1) * ((x2 - x1)) / ((y2 - y1) * (y2 - y1)));
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 直线设备限界-偏移y偏移值
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="x1"></param>
|
|||
|
|
/// <param name="y1"></param>
|
|||
|
|
/// <param name="x2"></param>
|
|||
|
|
/// <param name="y2"></param>
|
|||
|
|
/// <param name="C"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public double Y_(double x1, double y1, double x2, double y2, double C)
|
|||
|
|
{
|
|||
|
|
if (y1 == y2)
|
|||
|
|
{
|
|||
|
|
return C;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return Math.Abs((x2 - x1) / (y2 - y1)) * C / Math.Sqrt(1 + (x2 - x1) * ((x2 - x1)) / ((y2 - y1) * (y2 - y1)));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 交点横坐标
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="x1"></param>
|
|||
|
|
/// <param name="y1"></param>
|
|||
|
|
/// <param name="x2"></param>
|
|||
|
|
/// <param name="y2"></param>
|
|||
|
|
/// <param name="x3"></param>
|
|||
|
|
/// <param name="y3"></param>
|
|||
|
|
/// <param name="x4"></param>
|
|||
|
|
/// <param name="y4"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public double x0(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
|
|||
|
|
{
|
|||
|
|
double x_0, y_0, x_1, y_1;
|
|||
|
|
x_0 = (y2 - y1) / (x2 - x1); //a1
|
|||
|
|
y_0 = -(x1 * y2 - x2 * y1) / (x2 - x1); //b1
|
|||
|
|
|
|||
|
|
x_1 = (y4 - y3) / (x4 - x3); //a2
|
|||
|
|
y_1 = -(x3 * y4 - x4 * y3) / (x4 - x3); //b2
|
|||
|
|
return (y_1 - y_0) / (x_0 - x_1);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 交点纵坐标
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="x1"></param>
|
|||
|
|
/// <param name="y1"></param>
|
|||
|
|
/// <param name="x2"></param>
|
|||
|
|
/// <param name="y2"></param>
|
|||
|
|
/// <param name="x3"></param>
|
|||
|
|
/// <param name="y3"></param>
|
|||
|
|
/// <param name="x4"></param>
|
|||
|
|
/// <param name="y4"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public double y0(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
|
|||
|
|
{
|
|||
|
|
double x_0, y_0, x_1, y_1;
|
|||
|
|
x_0 = (y2 - y1) / (x2 - x1); //a1
|
|||
|
|
y_0 = -(x1 * y2 - x2 * y1) / (x2 - x1); //b1
|
|||
|
|
|
|||
|
|
x_1 = (y4 - y3) / (x4 - x3); //a2
|
|||
|
|
y_1 = -(x3 * y4 - x4 * y3) / (x4 - x3); //b2
|
|||
|
|
|
|||
|
|
return (x_0 * y_1 - x_1 * y_0) / (x_0 - x_1);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 偏移x偏移值
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="x1"></param>
|
|||
|
|
/// <param name="y1"></param>
|
|||
|
|
/// <param name="x2"></param>
|
|||
|
|
/// <param name="y2"></param>
|
|||
|
|
/// <param name="C"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public double ΔX(double x1, double y1, double x2, double y2, double C)
|
|||
|
|
{
|
|||
|
|
if (y1 == y2)
|
|||
|
|
return 0;
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
double θ = Math.Atan(Math.Abs((y2 - y1) / (x2 - x1)));
|
|||
|
|
return C * Math.Sin(θ);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 偏移y偏移值
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="x1"></param>
|
|||
|
|
/// <param name="y1"></param>
|
|||
|
|
/// <param name="x2"></param>
|
|||
|
|
/// <param name="y2"></param>
|
|||
|
|
/// <param name="C"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public double ΔY(double x1, double y1, double x2, double y2, double C)
|
|||
|
|
{
|
|||
|
|
if (y1 == y2)
|
|||
|
|
{
|
|||
|
|
return C;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
double θ = Math.Atan(Math.Abs((y2 - y1) / (x2 - x1)));
|
|||
|
|
return Math.Abs((x2 - x1) / (y2 - y1)) * C * Math.Sin(θ);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public static LiEquiModel Copy(LiEquiModel lieq)
|
|||
|
|
{
|
|||
|
|
return new LiEquiModel(lieq.StrPosition, lieq.Name, lieq.X, lieq.Y);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|