Ejemplo n.º 1
0
        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;                     
        }
Ejemplo n.º 2
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];
        }