如下图,如何判断几何多边形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"
     var flattenedPathGeometry = combinedGeometry.GetFlattenedPathGeometry();
var outerPointsString = flattenedPathGeometry.Figures.ToString();
if (outerPointsString.Length >
&& outerPointsString.Replace("z", string.Empty).Length == outerPointsString.Length - )
{
return true;
}

完整函数见下方代码

     /// <summary>
/// 检查几何是否被另一个几何分割成多段
/// </summary>
/// <param name="geometry1"></param>
/// <param name="geometry2"></param>
/// <returns></returns>
private bool CheckGeometryIsDividedByAnotherGeometry(PathGeometry geometry1, Geometry geometry2)
{
var intersectGeometry = new CombinedGeometry(GeometryCombineMode.Intersect, geometry1, geometry2);
var combinedGeometry = new CombinedGeometry(GeometryCombineMode.Exclude, geometry1, intersectGeometry);
var flattenedPathGeometry = combinedGeometry.GetFlattenedPathGeometry();
var outerPointsString = flattenedPathGeometry.Figures.ToString();
var geometryList = outerPointsString.Split(new[] { 'M' }, StringSplitOptions.RemoveEmptyEntries).Where(i => i.Contains("z")).Select(i => $"M{i}").ToList();
if (geometryList.Count >= && HintStrokePath.Data == null)
{
var a = Geometry.Parse(geometryList[]); ;
var b = Geometry.Parse(geometryList[]); ;
}
if (outerPointsString.Length >
&& outerPointsString.Replace("z", string.Empty).Length == outerPointsString.Length - )
{
return true;
}
return false;
}

4. 获取几何被分割后的多段几何内容

解析"M"、"z",分别获取俩段几何数据

     var geometryList = outerPointsString.Split(new[] { 'M' }, StringSplitOptions.RemoveEmptyEntries).Where(i => i.Contains("z")).Select(i => $"M{i}").ToList();
if (geometryList.Count >= )
{
var geometry1 = Geometry.Parse(geometryList[]); ;
var geometry2 = Geometry.Parse(geometryList[]); ;
}

几何被直线分割

几何被线段分割,如何判断或者获取分割后的多段几何?

直接用线段与几何重复上面的步骤,是有问题的。

线段类似“M150,130L150,1300 150,170z”去与几何去交集,CombinedGeometry中的数据是空的

需要给线条添加1的粗细:

var geometry2 = lineGeometry.GetWidenedPathGeometry(new System.Windows.Media.Pen(System.Windows.Media.Brushes.Black, ));

结果如下图:

Geometry 判断几何是否被另一个几何/线段分割成多段的更多相关文章

  1. JS判断浏览器是否支持某一个CSS3属性

    1.引子 css3的出现让浏览器的表现更加的丰富多彩,表现冲击最大的就是动画了,在日常书写动画的时候,很有必要去事先判断浏览器是否支持,尤其是在写CSS3动画库的时候.比如transition的ani ...

  2. js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内

    /** * 日期解析,字符串转日期 * @param dateString 可以为2017-02-16,2017/02/16,2017.02.16 * @returns {Date} 返回对应的日期对 ...

  3. Jquery 选择器 详解 js 判断字符串是否包含另外一个字符串

    Jquery 选择器 详解   在线文档地址:http://tool.oschina.net/apidocs/apidoc?api=jquery 各种在线工具地址:http://www.ostools ...

  4. 判断浏览器是否支持某一个CSS3属性

    判断浏览器是否支持某一个CSS3属性 function supportCss3(style) { var prefix = ['webkit', 'Moz', 'ms', 'o'], i, humpS ...

  5. 判断map是否包含另一个map

    判断map是否包含另一个map: map不同与list集合,list集合有直接判断集合是否包含其他集合或者元素的方法. boolean contains(Object o) 如果list包含指定的元素 ...

  6. 字符串A转换到字符串B,只能一次一次转换,每次转换只能把字符串A中的一个字符全部转换成另一个字符,是否能够转换成功

    public class DemoTest { public static void main(String[] args) { System.)); } /** * 有一个字符串A 有一个字符串B ...

  7. 使用List把一个长字符串分解成若干个短字符串

    把一个长字符串分解成若干个固定长度的短字符串,由于事先不知道长字符串的长度,以及短字符串的数量,只能使用List. public static void get_list_sbody(String s ...

  8. C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段

    C 一个字符串有三段,第一段原样输出.第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段 比如:输入abc 11 12.输出abc12121212 #include<stdio.h&g ...

  9. 如何把一个TXT文本文件按行数分割成多个文本文件

    2011-04-27 12:00:24|  分类: 默认分类 |字号 订阅     网上有很多文本分割软件都是按字节大小来分割的,主要用于小说类的文本分割,对于比较有规则的内容按行数进行分割非常不方便 ...

随机推荐

  1. PHP 利用闭包偷窥马对人类的想法

    <?php /** * reference:http://www.php.net/manual/en/reflectionmethod.getclosure.php * Learn this a ...

  2. c++11::std::optional

    std::optional还有一个类似于智能指针的接口, 它可以显式转化为bool来表示std::optional是否有一个值. 指针的解引用操作符*和->都实现了, 但是没有std::bad_ ...

  3. nginx::环境搭建

    ubuntu18.04 环境 1.需要gcc 环境,如果没有gcc环境,则需要安装 apt install gcc .安装pcre依赖库 PCRE(Perl Compatible Regular Ex ...

  4. TensorFlow2.0(9):TensorBoard可视化

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  5. php是做前端的吗?

    php是做前端的吗 不是,php是后台脚本语言,由服务器执行. PHP即“超文本预处理器”,是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语 ...

  6. C#的集合类型及使用技巧

    在日常开发过程中,我们不能避免的要对批量数据处理,这时候就要用到集合.集合总体上分为线性集合和非线性集合.线性集合是指元素具有唯一的前驱和后驱的数据结构类型:非线性集合是指有多个前驱和后驱的数据结构类 ...

  7. 从Go语言编码角度解释实现简易区块链

    区块链技术 人们可以用许多不同的方式解释区块链技术,其中通过加密货币来看区块链一直是主流.大多数人接触区块链技术都是从比特币谈起,但比特币仅仅是众多加密货币的一种. 到底什么是区块链技术? 从金融学相 ...

  8. 深度讲解Linux内存管理和Linux进程调度-打通任督二脉

    我在多年的工程生涯中发现很多工程师碰到一个共性的问题:Linux工程师很多,甚至有很多有多年工作经验,但是对一些关键概念的理解非常模糊,比如不理解CPU.内存资源等的真正分布,具体的工作机制,这使得他 ...

  9. Java基础(四)注释

    1.类注释 类注释必须放在import语句之后,类定义之前.eclipse中使用Shift + Alt + J快捷键添加类注释. 2.方法注释 每一个方法注释必须放在所描述的方法之前.除了通用标记之外 ...

  10. ApplicationContextAware使用理解

    接口的作用 当一个类实现了这个接口(ApplicationContextAware)之后,Aware接口的Bean在被初始之后,可以取得一些相对应的资源,这个类可以直接获取spring 配置文件中 所 ...