using FLY.Thick.Base.IService; using Misc; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; namespace FLY.Thick.Base.Server { public class BorderSearchPlastic:BorderSearch { public BorderSearchPlastic() : base() { } public BorderSearchPlastic(string param_path) : base(param_path) { } /// <summary> /// 找空气与膜均值的 中间位置 /// </summary> /// <returns></returns> void FindFilm_Mean(int[] dat, int sensor_grid, int n2_grid, ref int borderbegin_grid, ref int borderend_grid) { Range r1_grid = new Range(); //算膜中间的平均值 r1_grid.Begin = borderbegin_grid + sensor_grid + n2_grid; r1_grid.End = borderend_grid - (sensor_grid + n2_grid); int avg = MyMath.Avg(dat, r1_grid.Begin, r1_grid.End); //算空气的平均值 Range r2_grid = new Range(); r2_grid.Begin = borderbegin_grid - sensor_grid/3; r2_grid.End = borderend_grid + sensor_grid/3; if (r2_grid.Begin < 0) r2_grid.Begin = 0; if (r2_grid.End > dat.Length - 1) r2_grid.End = dat.Length - 1; int avg1 = MyMath.Avg(dat, 0, r2_grid.Begin); int avg2 = MyMath.Avg(dat, r2_grid.End, dat.Length - 1); int threshold; if ((Misc.MyBase.ISVALIDATA(avg1)) && (Misc.MyBase.ISVALIDATA(avg2))) { threshold = (avg + (avg1 + avg2) / 2) / 2; } else if (Misc.MyBase.ISVALIDATA(avg1)) { threshold = (avg + avg1) / 2; } else if (Misc.MyBase.ISVALIDATA(avg2)) { threshold = (avg + avg2) / 2; } else { threshold = (TempAD+avg) / 2; } //左边界 for (int i = r1_grid.Begin; i >= r2_grid.Begin; i--) { if (Misc.MyBase.ISVALIDATA(dat[i])) { if (dat[i] < threshold) { borderbegin_grid = i; } } } //右边界 for (int i = r1_grid.End; i < r2_grid.End; i++) { if (Misc.MyBase.ISVALIDATA(dat[i])) { if (dat[i] < threshold) { borderend_grid = i; } } } } /// <summary> /// 放入grid数据,分析边界 /// </summary> /// <param name="direction"></param> /// <param name="posOfGrid"></param> /// <param name="gridBegin"></param> /// <param name="dat"></param> /// <returns></returns> public override bool FindFilm(DIRECTION direction, int posOfGrid, int gridBegin, int[] dat) { //把数据记录下来 getViewReponse = new BorderSearchGetViewReponse() { direction = direction, posOfGrid = posOfGrid, gridBegin = gridBegin, dat = dat }; UpdateTime = DateTime.Now; //这些是AD值 //转为 dat 的序号 int validbegin_grid = Valid.Begin / posOfGrid - gridBegin; int validend_grid = Valid.End / posOfGrid - gridBegin; if (!FindFilm_Threshold(dat, validbegin_grid, validend_grid, out int borderbegin_grid, out int borderend_grid, out bool isBorderBeginOk, out bool isBorderEndOk)) { return false; } //N2 只是用来判断一下膜够不够宽而已,没用 int N2_grid = (N2 * 3 + SensorWidth) / posOfGrid; if ((borderend_grid - borderbegin_grid) < N2_grid)//膜太短 return false; FindFilm_Mean(dat, SensorWidth / posOfGrid, N2 / posOfGrid, ref borderbegin_grid, ref borderend_grid); int idx = (direction == DIRECTION.FORWARD) ? 0 : 1; var border = borders[idx]; //borderbegin_grid, borderend_grid 是实际边界位置, //border.value 是空气与膜的拐点 //必须外扩 //转为 脉冲 border.value.Begin = (borderbegin_grid + gridBegin) * posOfGrid - SensorWidth / 2; border.value.End = (borderend_grid + gridBegin) * posOfGrid + SensorWidth / 2; border.isBeginOk = true; border.isEndOk = true; border.UpdateReal(SensorWidth); if (borders.All(b => b.value.IsValid)) { Border = new RangeStruct((int)borders.Average(b => b.real.Begin), (int)borders.Average(b => b.real.End)); } else if (border.value.IsValid) { Border = border.real.ToStruct(); } getViewReponse.border = border.real; Width = Border.Width; Mid = Border.Mid; return true; } } }