internal ChannelMark(int chnlCount) { value = float.MinValue; showText = false; showMarkShape = true; markType = MarkType.mrkNormal; searchType = MarkSearchType.schPoint; markShape = MarkShape.markPloygon; markColor = Color.White; sequence = new int[chnlCount]; for (int i = 0; i < chnlCount; i++) sequence[i] = -1; //默认,仅在channels[0]中,进行MARK点搜索 sequence[0] = 0; }
//在chnl的源数据中,搜索MARK点 private static PointF Search2(Channel chnl, AixsVisibleArea ava, ChannelPictureArea cpa, MarkSearchType schType, float value) { int i, k; float Vcurr, Vmin; PointF pMin = new PointF(float.MinValue, float.MinValue); //获取chnl拥有的第一段数据和最后一段数据 PointF[] src1 = chnl.DataOf(0); PointF[] src2 = chnl.DataOf(chnl.MaxIndex); //chnl中包含的源数据为空 if ((src1 == null) || (src2 == null)) return pMin; //若value在chnl数据之外 if ((value < src1[0].X) || (value > src2[src2.Length - 1].X)) return pMin; //若value在坐标轴之外 if ((value < ava.xBegin) || (value > ava.xEnd)) return pMin; //查找与value最接近的段 PointF[] src; k = -1; Vmin = float.MaxValue; for (i = 0; i <= chnl.MaxIndex; i++) { src = chnl.DataOf(i); if (src == null) continue; Vcurr = Math.Min(Math.Abs(value - src[0].X), Math.Abs(src[src.Length - 1].X - value)); if (Vcurr < Vmin) { k = i; Vmin = Vcurr; } } //找不到源数据所在的数据段 if (k < 0) return pMin; //若MarkSearchType.schValue,则在chnl.DataOf(k)中搜索 //否则将对chnl.DataOf(k)进行采样,再在采样返回的点集中进行搜索 src = chnl.DataOf(k); if (schType == MarkSearchType.schPoint) src = DataSampling.SamplingFrom(src, ava.xBegin, ava.xEnd, cpa.N0); if (src == null) return pMin; //在src中,查找一个点,其X坐标与value相差最小 k = -1; Vmin = float.MaxValue; for (i = 0; i < src.Length; i++) { Vcurr = Math.Abs(src[i].X - value); if (Vcurr < Vmin) { Vmin = Vcurr; k = i; } } //使用yUnitOffset修正src的Y方向的值 src[k].Y = src[k].Y + chnl.UnitOffset; return src[k]; }