Geometry 判断几何是否被另一个几何/线段分割成多段
如下图,如何判断几何多边形A被多边形B,切割为多段几何?
几何A被几何B切割
1. 获取几何A与几何B的交集C
var intersectGeometry = new CombinedGeometry(GeometryCombineMode.Intersect, geometry1, geometry2);
2.几何A排除交集C,得到余下空白区域D
var combinedGeometry = new CombinedGeometry(GeometryCombineMode.Exclude, geometry1, intersectGeometry);
3.判断几何D区域是否包含多段几何
几何D区分为俩段,获取域的边框近似点集,发现含有俩段线条的描述(俩段M->z的文本),与真实几何分段对应。
所以,可以通过线条终止字符"z"个数,来判断几何的分段数量。
- 获取几何的近似多边形值
- 获取其路径内的点集
- 判断点集中是否含有2个及以上的线条绘制结束字符"z"
1 var flattenedPathGeometry = combinedGeometry.GetFlattenedPathGeometry(); 2 var outerPointsString = flattenedPathGeometry.Figures.ToString(); 3 if (outerPointsString.Length > 2 4 && outerPointsString.Replace("z", string.Empty).Length == outerPointsString.Length - 2) 5 { 6 return true; 7 }
完整函数见下方代码

1 /// <summary> 2 /// 检查几何是否被另一个几何分割成多段 3 /// </summary> 4 /// <param name="geometry1"></param> 5 /// <param name="geometry2"></param> 6 /// <returns></returns> 7 private bool CheckGeometryIsDividedByAnotherGeometry(PathGeometry geometry1, Geometry geometry2) 8 { 9 var intersectGeometry = new CombinedGeometry(GeometryCombineMode.Intersect, geometry1, geometry2); 10 var combinedGeometry = new CombinedGeometry(GeometryCombineMode.Exclude, geometry1, intersectGeometry); 11 var flattenedPathGeometry = combinedGeometry.GetFlattenedPathGeometry(); 12 var outerPointsString = flattenedPathGeometry.Figures.ToString(); 13 var geometryList = outerPointsString.Split(new[] { 'M' }, StringSplitOptions.RemoveEmptyEntries).Where(i => i.Contains("z")).Select(i => $"M{i}").ToList(); 14 if (geometryList.Count >= 2 && HintStrokePath.Data == null) 15 { 16 var a = Geometry.Parse(geometryList[0]); ; 17 var b = Geometry.Parse(geometryList[1]); ; 18 } 19 if (outerPointsString.Length > 2 20 && outerPointsString.Replace("z", string.Empty).Length == outerPointsString.Length - 2) 21 { 22 return true; 23 } 24 return false; 25 }
4. 获取几何被分割后的多段几何内容
解析"M"、"z",分别获取俩段几何数据
1 var geometryList = outerPointsString.Split(new[] { 'M' }, StringSplitOptions.RemoveEmptyEntries).Where(i => i.Contains("z")).Select(i => $"M{i}").ToList(); 2 if (geometryList.Count >= 2) 3 { 4 var geometry1 = Geometry.Parse(geometryList[0]); ; 5 var geometry2 = Geometry.Parse(geometryList[1]); ; 6 }
几何被直线分割
几何被线段分割,如何判断或者获取分割后的多段几何?
直接用线段与几何重复上面的步骤,是有问题的。
线段类似“M150,130L150,1300 150,170z”去与几何去交集,CombinedGeometry中的数据是空的
需要给线条添加1的粗细:
var geometry2 = lineGeometry.GetWidenedPathGeometry(new System.Windows.Media.Pen(System.Windows.Media.Brushes.Black, 1));
结果如下图:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)