Files

275 lines
9.0 KiB
C#
Raw Permalink Normal View History

2026-02-23 17:02:55 +08:00
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);
}
}
}