Geometry 判斷幾何是否被另一個幾何/線段分割成多段

来源:https://www.cnblogs.com/kybs0/archive/2019/11/19/11892539.html
-Advertisement-
Play Games

如下圖,如何判斷幾何多邊形A被多邊形B,切割為多段幾何? 幾何A被幾何B切割 1. 獲取幾何A與幾何B的交集C var intersectGeometry = new CombinedGeometry(GeometryCombineMode.Intersect, geometry1, geometr ...


如下圖,如何判斷幾何多邊形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     }
View Code

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

結果如下圖:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 章文件操作 文件的基本介紹 文件的概念 文件,對我們並不陌生,文件是數據源(保存數據的地方)的一種,比如大家經常使用的 word 文檔,txt 文 件,excel 文件...都是文件。文件最主要的作用就是保存數據,它既可以保存一張圖片,也可以保持視頻,聲 音... 輸入流和輸出流 os.File 封 ...
  • 定義(以下是百度百科中的定義): Java介面:Java介面是一系列方法的聲明,是一些方法特征的集合,一個介面只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。 個人補充:Java介面中也可以有屬性,只不過必須為 靜態常量(由public ...
  • 背景 1. 硬體的極速發展,多核心CPU司空見慣;分散式的軟體架構司空見慣; 2. 功能API大多採用混聚的方式把基礎服務的內容鏈接在一起,方便用戶生活。 拋出了兩個問題: 1. 如何發揮多核能力; 2. 切分大型任務,讓每個子任務並行運行; 併發和並行的區別 |項目|區別1|實現技術| | | | ...
  • 十大經典排序演算法 為了方便大家查找,我這裡弄一個偽目錄。 選擇排序 插入排序 冒泡排序 非優化版本 優化版本 希爾排序 歸併排序 遞歸式歸併排序 非遞歸式歸併排序 快速排序 堆排序 基數排序 非優化版本 優化版本 桶排序 基數排序 java編寫較好鏈接https://www.cnblogs.com/ ...
  • 28.模塊當腳本執行 !!!! 註意 這是分兩個文件的 一個是student.py和app3.py student.py name = "Song Ke" name_list = ["張三", "李四", "王五"] def who_am_i(myName): print(f'my name is ...
  • MATLAB實例:求相關係數、繪製熱圖並找到強相關對 作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/ 用MATLAB編程,求給定數據不同維度之間的相關係數,並繪製熱圖,保存圖片,找到強相關的維度對。 數據集來自UCI中的wine:https://arc ...
  • 來源:濟南小老虎 .NET Core是一個開源通用的開發框架,具有跨平臺能力,我們在享受其性能飆升的同時,也面臨了一些問題。通過觀察 NetCore 程式的線上運行情況發現 ,負載高的情況下應用程式占用記憶體較大,本文將針對這個問題展開討論,對比分析不同GC工作模式下的.NetCore性能與記憶體管理的 ...
  • 一、Asp.net Core基礎 微軟中文官網:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/ 微軟英文官網:https://docs.microsoft.com/en-us/aspnet/core/ .NET Core:h ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...