/// <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); }
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); }
/// <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)); }