namespace Yw.WinFrmUI.Phart
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public partial class UniversalCoordinate
|
{
|
#region 计算显示参数方法
|
|
#region 默认
|
/// <summary>
|
/// 最大X(显示参数)
|
/// </summary>
|
public double DispMaxX()
|
{
|
return this.CoordMinX + this.GridNumberX * this.CoordSpaceX;
|
}
|
|
/// <summary>
|
/// 最小Y(显示参数)
|
/// </summary>
|
public double DispMinY()
|
{
|
return this.CoordMinY + this.StartLineNoY * this.CoordSpaceY;
|
}
|
|
/// <summary>
|
/// 最大Y(显示参数)
|
/// </summary>
|
public double DispMaxY()
|
{
|
return CoordMinY + this.EndLineNoY * this.CoordSpaceY;
|
}
|
|
#endregion
|
|
/// <summary>
|
/// 重置Y坐标
|
/// </summary>
|
public void ResetCoordY(double space, double disMinY, double disMaxY)
|
{
|
this.CoordSpaceY = space;
|
this.EndLineNoY = this.GridNumberY;
|
this.StartLineNoY = this.EndLineNoY - (int)((disMaxY - disMinY) / this.CoordSpaceY);
|
this.CoordMinY = disMaxY - this.EndLineNoY * this.CoordSpaceY;
|
}
|
#endregion
|
|
#region 计算坐标
|
|
/// <summary>
|
/// 计算坐标
|
/// </summary>
|
/// <param name="pt_list">XY线</param>
|
/// <returns></returns>
|
public static UniversalCoordinate CalcCoordinate(List<Yw.Geometry.Point2d> pt_list)
|
{
|
if (pt_list == null)
|
return null;
|
double max_x = 0.0;
|
double min_x = 1000.0;
|
double max_y = 0.0;
|
double min_y = 1000.0;
|
|
CalcMinMaxValue(pt_list, ref max_x, ref min_x, ref max_y, ref min_y);
|
var calc_corrd = CalcCoordinate(min_x, max_x, min_y, max_y);
|
return calc_corrd;
|
}
|
|
/// <summary>
|
/// 计算最大最小值
|
/// </summary>
|
/// <param name="pt_list">XY线</param>
|
/// <param name="max_x">最大X</param>
|
/// <param name="min_x">最小X</param>
|
/// <param name="max_y">最大Y</param>
|
/// <param name="min_y">最小Y</param>
|
/// <returns></returns>
|
public static bool CalcMinMaxValue(List<Yw.Geometry.Point2d> pt_list, ref double max_x, ref double min_x, ref double max_y, ref double min_y)
|
{
|
max_x = 0.0;
|
min_x = 1000.0;
|
max_y = 0.0;
|
min_y = 1000.0;
|
if (pt_list == null)
|
{
|
return false;
|
}
|
min_x = pt_list.Min(x => x.X);
|
max_x = pt_list.Max(x => x.X);
|
if (min_x > max_x)
|
{
|
return false;
|
}
|
min_y = pt_list.Min(x => x.Y);
|
max_y = pt_list.Max(x => x.Y);
|
return true;
|
}
|
|
/// <summary>
|
/// 计算坐标
|
/// </summary>
|
/// <param name="min_x">最小X</param>
|
/// <param name="max_x">最大X</param>
|
/// <param name="min_y">最小Y</param>
|
/// <param name="max_y">最大Y</param>
|
/// <returns></returns>
|
public static UniversalCoordinate CalcCoordinate(double min_x, double max_x, double min_y, double max_y)
|
{
|
if (min_x > max_x - 0.01)
|
return null;
|
|
if (min_y > max_y - 0.01)
|
return null;
|
|
var validGridNumH = 6;
|
var coordinate_paras = new UniversalCoordinate();
|
coordinate_paras.GridNumberX = 10;//10
|
coordinate_paras.GridNumberY = 18;//18
|
CalcCoordinateX(min_x, max_x, ref coordinate_paras, coordinate_paras.GridNumberX);
|
CalcCoordinateH(min_y, max_y, validGridNumH, ref coordinate_paras, out double disMinH, out double disMaxH);
|
|
return coordinate_paras;
|
}
|
|
#endregion
|
|
#region 计算对应线坐标
|
|
/// <summary>
|
/// 计算X坐标
|
/// </summary>
|
/// <param name="min_x">最小X</param>
|
/// <param name="max_x">最大X</param>
|
/// <param name="coordinate_paras">坐标Model</param>
|
/// <param name="validGridNum">有效刻度点</param>
|
/// <param name="default_num">放大系数</param>
|
public static void CalcCoordinateX(double min_x, double max_x, ref UniversalCoordinate coordinate_paras, int validGridNum = 10, double default_num = 1.0)
|
{
|
var coordSpaceX = PhartCoordinateHelper.GetOptimalSpaceMin(min_x / default_num, max_x / default_num, validGridNum, out double disMinX, out double disMaxX) * default_num;
|
coordSpaceX = Math.Max(0.5, coordSpaceX / default_num) * default_num;
|
if (coordSpaceX == 8.0)
|
coordSpaceX = 10.0;
|
|
disMinX *= default_num;
|
//disMaxX *= default_num;
|
var gridNumberX = 0;
|
|
double min_q = disMinX;
|
while (min_q < max_x)
|
{
|
gridNumberX++;
|
min_q = disMinX + gridNumberX * coordSpaceX;
|
}
|
|
if (gridNumberX <= 5)
|
{
|
coordSpaceX *= 0.5;
|
gridNumberX *= 2;
|
}
|
|
coordinate_paras.CoordSpaceX = coordSpaceX;
|
coordinate_paras.CoordMinX = disMinX;
|
coordinate_paras.GridNumberX = gridNumberX;
|
}
|
|
/// <summary>
|
/// 计算Y坐标 含过滤 (Eventech: CalcCoordinateH2)
|
/// </summary>
|
/// <param name="min_y">最小Y</param>
|
/// <param name="max_y">最大Y</param>
|
/// <param name="validGridNumH">有效Y刻度数</param>
|
/// <param name="coordinate_paras">坐标Model</param>
|
/// <param name="disMinH">最小显示Y</param>
|
/// <param name="disMaxH">最大显示Y</param>
|
public static void CalcCoordinateH_Filter(double min_y, double max_y, int validGridNumH, ref UniversalCoordinate coordinate_paras, out double disMinH, out double disMaxH)
|
{
|
if (max_y < 1.0)
|
{
|
disMinH = 0.0;
|
disMaxH = 1.0;
|
coordinate_paras.ResetCoordY(0.1, disMinH, disMaxH);
|
}
|
else if (max_y < 2.0)
|
{
|
disMinH = 0.0;
|
disMaxH = 2.0;
|
coordinate_paras.ResetCoordY(0.2, disMinH, disMaxH);
|
}
|
else if (max_y < 5.0)
|
{
|
disMinH = 0.0;
|
disMaxH = 5.0;
|
coordinate_paras.ResetCoordY(0.5, disMinH, disMaxH);
|
}
|
else if (max_y < 10.0)
|
{
|
disMinH = 0.0;
|
disMaxH = 10.0;
|
coordinate_paras.ResetCoordY(1.0, disMinH, disMaxH);
|
}
|
else if (max_y < 12.0)
|
{
|
coordinate_paras.CoordSpaceY = 1.0;
|
disMinH = 0.0;
|
disMaxH = 12.0;
|
coordinate_paras.ResetCoordY(1.0, disMinH, disMaxH);
|
}
|
else if (max_y < 15.0)
|
{
|
coordinate_paras.CoordSpaceY = 2.0;
|
disMinH = 0.0;
|
disMaxH = 16.0;
|
coordinate_paras.ResetCoordY(2.0, disMinH, disMaxH);
|
}
|
else if (max_y < 20.0)
|
{
|
coordinate_paras.CoordSpaceY = 2.0;
|
disMinH = 0.0;
|
disMaxH = 20.0;
|
coordinate_paras.ResetCoordY(2.0, disMinH, disMaxH);
|
}
|
else
|
{
|
CalcCoordinateH(min_y, max_y, validGridNumH, ref coordinate_paras, out disMinH, out disMaxH);
|
}
|
}
|
|
/// <summary>
|
/// 计算Y坐标
|
/// </summary>
|
/// <param name="min_y">最小Y</param>
|
/// <param name="max_y">最大Y</param>
|
/// <param name="validGridNumH">有效Y刻度数</param>
|
/// <param name="coordinate_paras">坐标Model</param>
|
/// <param name="disMinH">最小显示Y</param>
|
/// <param name="disMaxH">最大显示Y</param>
|
public static void CalcCoordinateH(double min_y, double max_y, int validGridNumH, ref UniversalCoordinate coordinate_paras, out double disMinH, out double disMaxH)
|
{
|
var coordSpaceH = PhartCoordinateHelper.GetOptimalSpaceMax(min_y, max_y, validGridNumH, out disMinH, out disMaxH);
|
int endLineNoH = coordinate_paras.GridNumberY;
|
int stratLineNoH = endLineNoH;
|
|
double max_h = disMaxH;//判断条件
|
while (max_h > min_y * 0.98)
|
{
|
max_h -= coordSpaceH;
|
if (max_h < 0.0)
|
break;
|
stratLineNoH--;
|
}
|
|
coordinate_paras.CoordSpaceY = coordSpaceH;
|
coordinate_paras.EndLineNoY = endLineNoH;
|
coordinate_paras.StartLineNoY = stratLineNoH;
|
coordinate_paras.CoordMinY = disMaxH - endLineNoH * coordSpaceH;
|
}
|
|
|
#endregion
|
|
}
|
}
|