namespace Yw.WinFrmUI.Phart
{
///
///
///
public partial class ValveCoordinate
{
#region 计算显示参数方法
#region 默认
///
/// 最大流量(显示参数)
///
public double DispMaxQ()
{
return this.CoordMinQ + (double)this.GridNumberX * this.CoordSpaceQ;
}
///
/// 最小水损(显示参数)
///
public double DispMinL()
{
return this.CoordMinL + (double)this.StartLineNoL * this.CoordSpaceL;
}
///
/// 最大水损(显示参数)
///
public double DispMaxL()
{
return CoordMinL + (double)this.EndLineNoL * this.CoordSpaceL;
}
#endregion
///
/// 重置水损坐标
///
public void ResetCoordL(double space, double disMinL, double disMaxL)
{
this.CoordSpaceL = space;
this.EndLineNoL = this.GridNumberY;
this.StartLineNoL = this.EndLineNoL - (int)((disMaxL - disMinL) / this.CoordSpaceL);
this.CoordMinL = disMaxL - (double)this.EndLineNoL * this.CoordSpaceL;
}
#endregion
#region 计算坐标
///
/// 计算坐标
///
/// 流量水损线
///
public static ValveCoordinate CalcCoordinate(List QL)
{
if (QL == null)
return null;
double max_flow = 0.0;
double min_flow = 1000.0;
double maxL = 0.0;
double minL = 1000.0;
min_flow = QL.Min(x => x.X);
max_flow = QL.Max(x => x.X);
if (min_flow > max_flow)
{
return null;
}
minL = QL.Min(x => x.Y);
maxL = QL.Max(x => x.Y);
if (minL > maxL)
{
return null;
}
return CalcCoordinate(min_flow, max_flow, minL, maxL);
}
///
/// 计算最大最小值
///
/// 流量水损线
/// 最大流量
/// 最小流量
/// 最大水损
/// 最小水损
///
public static bool CalcMinMaxValue(List QL, ref double max_flow, ref double min_flow, ref double maxL, ref double minL)
{
max_flow = 0.0;
min_flow = 1000.0;
maxL = 0.0;
minL = 1000.0;
if (QL == null)
{
return false;
}
min_flow = QL.Min(x => x.X);
max_flow = QL.Max(x => x.X);
if (min_flow > max_flow)
{
return false;
}
minL = QL.Min(x => x.Y);
maxL = QL.Max(x => x.Y);
return true;
}
///
/// 计算坐标
///
/// 最小流量
/// 最大流量
/// 最小水损
/// 最大水损
///
public static ValveCoordinate CalcCoordinate(double min_flow, double max_flow, double minL, double maxL)
{
if (min_flow > max_flow - 0.01)
return null;
if (minL > maxL - 0.01)
return null;
var validGridNumL = 6;
var coordinate_paras = new ValveCoordinate();
coordinate_paras.GridNumberX = 10;
coordinate_paras.GridNumberY = 10;
CalcCoordinateQ(min_flow, max_flow, ref coordinate_paras, coordinate_paras.GridNumberX);
CalcCoordinateL(minL, maxL, validGridNumL, ref coordinate_paras, out double disMinL, out double disMaxL);
return coordinate_paras;
}
#endregion
#region 计算对应线坐标
///
/// 计算流量坐标
///
/// 最小流量
/// 最大流量
/// 坐标Model
/// 有效刻度点
/// 放大系数
public static void CalcCoordinateQ(double min_flow, double max_flow, ref ValveCoordinate coordinate_paras, int validGridNum = 10, double default_num = 1.0)
{
var coordSpaceQ = GetOptimalSpaceMin(min_flow / default_num, max_flow / default_num, validGridNum, out double disMinQ, out double disMaxQ) * default_num;
coordSpaceQ = Math.Max(0.5, coordSpaceQ / default_num) * default_num;
if (coordSpaceQ == 8.0)
coordSpaceQ = 10.0;
disMinQ *= default_num;
//disMaxQ *= default_num;
var gridNumberX = 0;
double min_q = disMinQ;
while (min_q < max_flow)
{
gridNumberX++;
min_q = disMinQ + gridNumberX * coordSpaceQ;
}
if (gridNumberX <= 5)
{
coordSpaceQ *= 0.5;
gridNumberX *= 2;
}
coordinate_paras.CoordSpaceQ = coordSpaceQ;
coordinate_paras.CoordMinQ = disMinQ;
coordinate_paras.GridNumberX = gridNumberX;
}
///
/// 计算水损坐标 含过滤 (Eventech: CalcCoordinateL2)
///
/// 最小水损
/// 最大水损
/// 有效水损刻度数
/// 坐标Model
/// 最小显示水损
/// 最大显示水损
public static void CalcCoordinateL_Filter(double minL, double maxL, int validGridNumL, ref ValveCoordinate coordinate_paras, out double disMinL, out double disMaxL)
{
if (maxL < 1.0)
{
disMinL = 0.0;
disMaxL = 1.0;
coordinate_paras.ResetCoordL(0.1, disMinL, disMaxL);
}
else if (maxL < 2.0)
{
disMinL = 0.0;
disMaxL = 2.0;
coordinate_paras.ResetCoordL(0.2, disMinL, disMaxL);
}
else if (maxL < 5.0)
{
disMinL = 0.0;
disMaxL = 5.0;
coordinate_paras.ResetCoordL(0.5, disMinL, disMaxL);
}
else if (maxL < 10.0)
{
disMinL = 0.0;
disMaxL = 10.0;
coordinate_paras.ResetCoordL(1.0, disMinL, disMaxL);
}
else if (maxL < 12.0)
{
coordinate_paras.CoordSpaceL = 1.0;
disMinL = 0.0;
disMaxL = 12.0;
coordinate_paras.ResetCoordL(1.0, disMinL, disMaxL);
}
else if (maxL < 15.0)
{
coordinate_paras.CoordSpaceL = 2.0;
disMinL = 0.0;
disMaxL = 16.0;
coordinate_paras.ResetCoordL(2.0, disMinL, disMaxL);
}
else if (maxL < 20.0)
{
coordinate_paras.CoordSpaceL = 2.0;
disMinL = 0.0;
disMaxL = 20.0;
coordinate_paras.ResetCoordL(2.0, disMinL, disMaxL);
}
else
{
CalcCoordinateL(minL, maxL, validGridNumL, ref coordinate_paras, out disMinL, out disMaxL);
}
}
///
/// 计算水损坐标
///
/// 最小水损
/// 最大水损
/// 有效水损刻度数
/// 坐标Model
/// 最小显示水损
/// 最大显示水损
public static void CalcCoordinateL(double minL, double maxL, int validGridNumL, ref ValveCoordinate coordinate_paras, out double disMinL, out double disMaxL)
{
var coordSpaceL = GetOptimalSpaceMax(minL, maxL, validGridNumL, out disMinL, out disMaxL);
int endLineNoL = coordinate_paras.GridNumberY;
int stratLineNoL = endLineNoL;
double max_h = disMaxL;//判断条件
while (max_h > minL * 0.98)
{
max_h -= coordSpaceL;
if (max_h < 0.0)
break;
stratLineNoL--;
}
coordinate_paras.CoordSpaceL = coordSpaceL;
coordinate_paras.EndLineNoL = endLineNoL;
coordinate_paras.StartLineNoL = stratLineNoL;
coordinate_paras.CoordMinL = disMaxL - (double)endLineNoL * coordSpaceL;
}
#endregion
#region Space 间隔
///
/// 获取最小的间隔
///
/// 最小值
/// 最大值
/// 间隔数量
/// 最小显示参数
/// 最大显示参数
///
public static double GetOptimalSpaceMin(double minValue, double maxValue, int spaceNum, out double minDisplay, out double maxDisplay)
{
minDisplay = minValue;
maxDisplay = maxValue;
double num = maxValue - minValue;
if (num < 0.0 || spaceNum < 1)
{
return (maxValue - minValue) / 10.0;
}
double optimalSpace = GetOptimalSpace((maxValue - minValue) / (double)spaceNum);
if (optimalSpace < 2.0)
{
minDisplay = Math.Floor(minValue / optimalSpace) * optimalSpace;
maxDisplay = minDisplay + (double)spaceNum * optimalSpace;
}
else
{
minDisplay = Math.Floor(minValue / optimalSpace) * optimalSpace;
maxDisplay = minDisplay + (double)spaceNum * optimalSpace;
}
return optimalSpace;
}
///
/// 获取最大的间隔
///
/// 最小值
/// 最大值
/// 间隔数量
/// 最小显示参数
/// 最大显示参数
///
public static double GetOptimalSpaceMax(double minValue, double maxValue, int spaceNum, out double minDisplay, out double maxDisplay)
{
minDisplay = minValue;
maxDisplay = maxValue;
double num = maxValue - minValue;
if (maxValue > 20)
{
if (num < 0.0 || spaceNum < 1)
{
return (maxValue - minValue) / 5.0;
}
}
else
{
if (num < 0.0 || spaceNum < 1)
{
return (maxValue - minValue) / 10.0;
}
}
double optimalSpace = GetOptimalSpace((maxValue - minValue) / (double)spaceNum, true);
maxDisplay = Math.Ceiling(maxValue / optimalSpace) * optimalSpace;
minDisplay = maxDisplay - (double)spaceNum * optimalSpace;
if (minDisplay > minValue)
{
var diff = minDisplay - minValue;
if (diff < optimalSpace)
{
minDisplay -= optimalSpace;
}
}
return optimalSpace;
}
///
/// 获取最佳间隔 (精细取整)
///
/// 间隔
///
public static double GetOptimalSpace(double refSpace, bool IsAccurate = false)
{
if (refSpace < 1E-06)
{
return 1.0;
}
if (refSpace < 0.01)
{
double refSpace2 = refSpace * 100.0;
return GetOptimalSpace(refSpace2) / 100.0;
}
if (refSpace < 0.1)
{
double refSpace3 = refSpace * 10.0;
return GetOptimalSpace(refSpace3) / 10.0;
}
if (IsAccurate)
{
if (refSpace < 11.0)
{
if (refSpace < 1.35)
{
return 1.0;
}
if (refSpace < 2.2)
{
return 2.0;
}
if (refSpace < 5.5)
{
return 5.0;
}
if (refSpace < 8.5)
{
return 8.0;
}
return 10.0;
}
}
if (refSpace < 1.0)
{
if (refSpace < 0.15)
{
return 0.1;
}
if (refSpace < 0.22)
{
return 0.2;
}
if (refSpace < 0.6)
{
return 0.5;
}
return 1.0;
}
if (refSpace < 1.2)
{
return 1.0;
}
if (refSpace < 3.0)
{
if (refSpace < 1.2)
{
return 1.0;
}
if (refSpace < 2.3)
{
return 2.0;
}
return 3.0;
}
if (refSpace < 11.0)
{
if (refSpace < 1.35)
{
return 1.0;
}
if (refSpace < 2.2)
{
return 2.0;
}
if (refSpace < 5.5)
{
return 5.0;
}
if (refSpace < 8.5)
{
return 8.0;
}
return 10.0;
}
if (refSpace < 16.0)
{
return 15.0;
}
if (refSpace < 22.0)
{
return 20.0;
}
if (refSpace < 35.0)
{
return 25.0;
}
if (refSpace < 41.0)
{
return 40.0;
}
if (refSpace < 51.0)
{
return 50.0;
}
if (refSpace < 61.0)
{
return 60.0;
}
if (refSpace < 71.0)
{
return 70.0;
}
if (refSpace < 78.0)
{
return 75.0;
}
if (refSpace < 150.0)
{
return 100.0;
}
if (refSpace < 230.0)
{
return 200.0;
}
if (refSpace < 270.0)
{
return 250.0;
}
if (refSpace < 1500.0)
{
int num = (int)(refSpace / 100.0);
return num * 100;
}
int num2 = (int)(refSpace / 1000.0);
return num2 * 1000;
}
#endregion
#region 数字辅助方法
///
/// 按指定长度获取
///
public static double GetByPlacesLength(double value, int length)
{
int decimalPlacesLength = GetDecimalPlacesLength(value);
if (decimalPlacesLength > length)
{
return Math.Round(value, length);
}
return value;
}
///
/// 获取小数点长度
///
private static int GetDecimalPlacesLength(double value)
{
string text = value.ToString();
int num = text.IndexOf('.');
if (num >= 0)
{
return text.Length - num - 1;
}
return 0;
}
#endregion
}
}