namespace Yw.WinFrmUI.Phart { /// /// /// public partial class UniversalCoordinate { #region 计算显示参数方法 #region 默认 /// /// 最大X(显示参数) /// public double DispMaxX() { return this.CoordMinX + this.GridNumberX * this.CoordSpaceX; } /// /// 最小Y(显示参数) /// public double DispMinY() { return this.CoordMinY + this.StartLineNoY * this.CoordSpaceY; } /// /// 最大Y(显示参数) /// public double DispMaxY() { return CoordMinY + this.EndLineNoY * this.CoordSpaceY; } #endregion /// /// 重置Y坐标 /// 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 计算坐标 /// /// 计算坐标 /// /// XY线 /// public static UniversalCoordinate CalcCoordinate(List 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; } /// /// 计算最大最小值 /// /// XY线 /// 最大X /// 最小X /// 最大Y /// 最小Y /// public static bool CalcMinMaxValue(List 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; } /// /// 计算坐标 /// /// 最小X /// 最大X /// 最小Y /// 最大Y /// 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 valid_grid_num_h = 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, valid_grid_num_h, ref coordinate_paras, out double disMinH, out double disMaxH); return coordinate_paras; } #endregion #region 计算对应线坐标 /// /// 计算X坐标 /// /// 最小X /// 最大X /// 坐标Model /// 有效刻度点 /// 放大系数 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; } /// /// 计算Y坐标 含过滤 (Eventech: CalcCoordinateH2) /// /// 最小Y /// 最大Y /// 有效Y刻度数 /// 坐标Model /// 最小显示Y /// 最大显示Y public static void CalcCoordinateH_Filter(double min_y, double max_y, int valid_grid_num_h, 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, valid_grid_num_h, ref coordinate_paras, out disMinH, out disMaxH); } } /// /// 计算Y坐标 /// /// 最小Y /// 最大Y /// 有效Y刻度数 /// 坐标Model /// 最小显示Y /// 最大显示Y public static void CalcCoordinateH(double min_y, double max_y, int valid_grid_num_h, ref UniversalCoordinate coordinate_paras, out double disMinH, out double disMaxH) { var coordSpaceH = PhartCoordinateHelper.GetOptimalSpaceMax(min_y, max_y, valid_grid_num_h, 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 } }