Пример #1
0
        /// <summary>
        /// 在<see cref="srcFigures"/>中过滤出和<see cref="sampleFigure"/>匹配的所有图元
        /// </summary>
        /// <param name="srcFigures"></param>
        /// <param name="sampleFigure"></param>
        /// <returns></returns>
        public List <vdFigure> Filter(List <vdFigure> srcFigures, vdFigure sampleFigure)
        {
            if (srcFigures == null || srcFigures.Count == 0)
            {
                throw new ArgumentNullException(nameof(srcFigures));
            }
            if (sampleFigure == null)
            {
                throw new ArgumentNullException(nameof(sampleFigure));
            }

            var passedSet  = new List <vdFigure>();
            var sampleType = sampleFigure.GetType();

            foreach (vdFigure srcFigure in srcFigures)
            {
                if (srcFigure.GetType() != sampleType)
                {
                    continue;
                }
                if (srcFigure == sampleFigure)
                {
                    continue;
                }
                if (PreFilterFunc != null && !PreFilterFunc.Invoke(srcFigure, sampleFigure))
                {
                    continue;
                }
                if (FilterItem(srcFigure, sampleFigure))
                {
                    passedSet.Add(srcFigure);
                }
            }
            return(passedSet);
        }
Пример #2
0
        private vdFigure FilterFigure(List <vdFigure> srcFigures, vdFigure srcMajor, vdFigure sampleFigure, vdFigure sampleMajor)
        {
            var sampleFigureType             = sampleFigure.GetType();
            var sampleFigureOffsetLenSquared = sampleFigure.BoundingBox.MidPoint.DistanceSquared(sampleMajor.BoundingBox.MidPoint);

            for (var i = 0; i < srcFigures.Count; i++)
            {
                var srcfigure = srcFigures[i];
                if (srcfigure == srcMajor)
                {
                    continue;
                }
                if (srcfigure.GetType() != sampleFigureType)
                {
                    continue;
                }

                var offset = srcfigure.BoundingBox.MidPoint - srcMajor.BoundingBox.MidPoint;
                if (Math.Abs(offset.x * offset.x + offset.y * offset.y - sampleFigureOffsetLenSquared) >= 2)
                {
                    continue;
                }

                var filter = FilterFactory.Get(sampleFigureType);
                if (filter != null)
                {
                    if (filter.IsMatchable(srcfigure, sampleFigure))
                    {
                        return(srcfigure);
                    }
                }
            }
            return(null);
        }
Пример #3
0
 /// <summary>
 /// 判断两个图元是否匹配
 /// </summary>
 /// <param name="figure1"></param>
 /// <param name="figure2"></param>
 /// <returns></returns>
 public bool IsMatchable(vdFigure figure1, vdFigure figure2)
 {
     if (figure1.GetType() != figure2.GetType())
     {
         return(false);
     }
     if (PreFilterFunc != null && !PreFilterFunc.Invoke(figure1, figure2))
     {
         return(false);
     }
     return(FilterItem(figure1, figure2));
 }