namespace Yw.WinFrmUI
{
///
/// 坐标辅助类
///
public class PhartCoordinateHelper
{
///
/// 获取最小的间隔
///
/// 最小值
/// 最大值
/// 间隔数量
/// 最小显示参数
/// 最大显示参数
///
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) / spaceNum);
if (optimalSpace < 2)
{
minDisplay = Math.Floor(minValue / optimalSpace) * optimalSpace;
maxDisplay = minDisplay + spaceNum * optimalSpace;
}
else
{
minDisplay = Math.Floor(minValue / optimalSpace) * optimalSpace;
maxDisplay = minDisplay + 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) / spaceNum, true);
maxDisplay = Math.Ceiling(maxValue / optimalSpace) * optimalSpace;
minDisplay = maxDisplay - 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)
{
return 0.5;
}
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;
}
///
/// 按指定长度获取
///
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;
}
}
}