圖形基礎算法:如何將點與帶曲線邊的多邊形位置關系算法做穩定

簡介

判斷點與多邊形位置關系算法是幾何算法中最基礎的算法之一,包括布爾運算在內的非常非常多的算法都會用到它。它的穩定是算法庫穩定的關鍵。

下面我們從一個邊都是直線的多邊形開始了解射線法的原理。然后看看引入曲線后會帶來哪些問題,以及在實際應用還有哪些其他問題。最后看看如何實現一個穩定的,支持曲線邊多邊形的點與多邊形位置關系算法。

射線法

講射線法的資料很多,用AI也能輕松查到詳細內容,所以我們只簡單介紹一下重點,為后面內容做個鋪墊。

射線法的實現思路是以被檢測點為起點做一條射線,看和多邊形有幾個交點,奇數個交點說明在內部,偶數個交點說明在外部(0算偶數)。

實際中往往以x軸正方向做射線,這樣計算比較簡單。

交點計數時,要考慮各種相交類型,例如射線和邊重合,射線過頂點等。

有一個已經總結好的的原則可以直接使用(以x軸正方向射線為例):

當邊的一個頂點的y大于參考點的y,另一個頂點的y不大于參考點的y(等于或小于),且邊與x軸交點的x大于參考點的x時計數加一。

如何判斷點是否在多邊形上呢?因為一般這個判斷都需要帶一個精度,所以直接用上面介紹方法中的得到的邊與x軸交點到參考點x的距離是不準確的。

我見過兩種方式:

一種是單獨判斷點是否在邊上。

另一種是點加上精度會得到一個Box,用這個Box的頂點分別做射線法,如果有些頂點為內部,有些頂點為外部則認為是點在多邊形上邊。

兩種方法適用的是不同的場景,大家按需選擇。

曲線邊給基礎射線法穩定性帶來的挑戰

首先曲線與射線相交可能會有多個交點,我們就不能只拿曲線的兩個端點來判斷了,而是要根據交點位置曲線是否穿過射線來判斷是否計數加一。

是否穿過一般用交點處的切線方向來判斷。但如果曲線和切線相切時,就需要根據二階導數甚至更高階導數來判斷穿過關系了。

但相切本身就是個帶精度判斷的問題。一階導數小于多少用二階導數,二階導數小于多少用三階導數。這個沒有唯一的結論。一個場景對了,另一個場景可能就不對了

另外,相切時,因為精度的問題,我們幾乎不可能計算到恰巧相切的點。不是偏左點就是偏右點,甚至參數域上偏很多都有可能。如果曲線曲率很大,這個偏差也可能對切線方向帶來比較大的影響,從而影響穩定性。

還有就是,邊都是直線時,我們可以保證各邊之間無縫連接。是曲線時就很難保證無縫連接了。原因是因為曲線的表示方式導致的。

例如畫圖時我們用三點定義圓弧,但圓弧在內存中存儲時用圓心半徑和角度。那么我們根據三點計算出的圓心半徑和角度再反算回三點時,在特殊場景中是存在誤差的。這個誤差就會導致邊連接處存在一個小小的縫隙,這個小小的縫隙出現在射線附近時就有可能導致錯誤。

有些算法庫,多邊形是其他運算的結果(例如布爾運算),本身可能就帶符合誤差要求的縫隙(因為有可能基于效率原因考慮不做縫隙修復)。

上面提到的情況絕對不是危言聳聽,都是我們在實際項目中碰到過的。算法本身不難,難的是如何在各種場景下都能表現的穩定。

為了給大家對上面說的有個更直觀的認識,我畫了個草圖放到下面。

在這里插入圖片描述

穩定的射線法

基于前面的討論,相切或接近相切時,從理論上就是不能解決的。

一個最簡單的解決思路是,檢測上述情況,發現出現了就再換一條射線。

從概率上,這種算法沒問題。但多邊形復雜時,有可能需要換好幾次射線才能得出結果。另外,如果射線不是x軸或y軸方向時,直線和曲線求交的效率也會下降。

下面介紹一下我們設計的算法思路。

1. y軸正方向做射線,計算所有交點。

2. 根據交點統計計數和可信度,可信度符合要求則直接返回結果。

3. 如果多邊形有順逆時針方向,根據第一個交點的穿過形式和可信度判斷內外,可信度滿足要求直接返回結果。

4. y軸負方向做射線,計算所有交點。

5. 根據交點統計計數和可信度,可信度符合要求則直接返回結果。

6. 如果多邊形有順逆時針方向,根據第一個交點的穿過形式和可信度判斷內外,可信度滿足要求直接返回結果。

7. 利用交點把多邊形打斷成片段,這些片段是被y軸正負方向射線分開的。

8. 判斷片段的兩個端點是否在x軸方向射線同側,如果在同側不影響計數,直接不用考慮。

9. 如果不在同側,統計在y軸正方向射線的右側片段數,這個片段數就是判斷內外的計數。這步可以通過采用的方式判斷是否在右側。

如下圖所示:

在這里插入圖片描述

總結

這可能就是書本中的算法和在大廠中實際跑的算法的區別。書本中的算法追求理論可行,實際應用的算法追求實踐可行。

雖然我以前寫過好多版這個算法了,但為了寫這篇文章,我又把它實現了一遍,源碼放到星球里了。為了省時間目前只做了直線求交,但算法本身是支持曲線的。

星球中的Demo可直接調試運行,學源碼能看到很多細節,歡迎加入我們的星球,支持一下作者。現有源碼已經很值得加入了。后續算法源碼還會不斷在星球中發布。

在這里插入圖片描述

星球地址:https://t.zsxq.com/bVB9h

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98667.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98667.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react的filber架構

好問題 👍 你問的是 React Fiber 架構。這是 React 16 引入的核心機制,用來解決 React 在大規模更新時的性能問題。下面我給你從 背景 → Fiber 是什么 → 原理 → 優點 → 流程 來系統講。一、為什么需要 Fiber?在 React 15 及以前&#xff…

Lucky STUN穿透結合群暉NAS實現docker下transmission監聽端口動態更新

參考文章 LCUKY系列教程 一 「LUCKY STUN穿透」使用 cURL 自動修改 Transmission 的監聽端口 二 「LUCKY STUN穿透」使用 Webhook 自動修改 qbittorrent 的監聽端口 三 LUCKY STUN穿透在Windows上使用UPnP工具為BT客戶端自動添加內外端口號不同的映射規則 四「LUCKY STUN穿透」…

如何在Ubuntu暢玩鳴潮等游戲

本教程只包括Steam上的游戲。# 更新軟件源 sudo apt update # 安裝Steam sudo apt install steam首先,在Ubuntu的snap商店安裝Steam,啟動,登陸,下載游戲。到這里的操作都比較簡單,對于沒有反作弊的游戲,往往…

機器學習09——聚類(聚類性能度量、K均值聚類、層次聚類)

上一章:機器學習08——集成學習 下一章:機器學習10——降維與度量學習 機器學習實戰項目:【從 0 到 1 落地】機器學習實操項目目錄:覆蓋入門到進階,大學生就業 / 競賽必備 文章目錄一、聚類任務(無監督學習…

解決 Docker 構建中 Python 依賴沖突的完整指南

問題背景 在基于 registry.cn-shenzhen.aliyuncs.com/all_dev/dev:invoice-base 鏡像構建 Docker 容器時,我們遇到了一個常見的 Python 依賴管理問題: ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-…

光子計算芯片實戰:Lightmatter Passage互連架構性能評測

點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,H卡級別算力,80G大顯存,按量計費,靈活彈性,頂級配置,學生更享專屬優惠。 摘要 隨著人工智能計算需求呈指數級增長,傳統電子計算…

基于樹莓派與Jetson Nano集群的實驗邊緣設備上視覺語言模型(VLMs)的性能評估與實踐探索

概述 2018年,TensorFlow Lite團隊的Pete Warden曾提出:“機器學習的未來在于微型化”。如今,隨著人工智能向高性能視覺強大的視覺語言模型(Vision-language models, VLMs)發展,對高性能計算資源的需求急劇…

華為Ai崗機考20250903完整真題

華為Ai崗機考20250903 華為自26屆秋招(2025年起)對AI崗位機考進行了改革,考試題型調整為20道選擇題(15道單選(6分)5道不定項選擇(12分))2道編程題(150300)。 題目核心圍繞人工智能技術(如Transformer架構…

k8s+jenkins+harbor構建Devops平臺

一、環境準備1、準備一主一從k8s機器,(設備好可以一主多從也行)2、一臺harbor倉庫機器(dockerhub訪問不了)二、安裝nfs服務1、在k8s機器上yum install nfs-utils -y systemctl start nfs systemctl enable nfs2、創建共…

為什么 socket.io 客戶端在瀏覽器能連上,但在 Node.js 中報錯 transport close?

網羅開發(小紅書、快手、視頻號同名)大家好,我是 展菲,目前在上市企業從事人工智能項目研發管理工作,平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術,包括iOS、前端、Harmony OS、Java、Python等方…

人才教育導向下:老年生活照護實訓室助力提升學生老年照護服務能力

一、老年生活照護實訓室建設背景與意義 (一)適應老齡化社會需求 我國老齡化程度持續加深,老年照護服務人才缺口不斷擴大。培養專業照護人才成為當務之急,職業教育需承擔重要責任。點擊獲取實訓室建設方案 (二&…

我在嘉順達藍海的安全堅守

作為嘉順達藍海的資深安全員,每天清晨 6 點,我都會站在物流基地的入口處,看著一隊隊橙色的嘉順達藍海危險品運輸車整齊列隊。那抹醒目的橙色,不僅是嘉順達藍海的標志,更是我和 200 多名同事堅守 12 年的安全承諾。今天…

云原生監控系統 Prometheus大總結 20250909

本章內容如下: Prometheus 介紹 Prometheus 部署和配置 Node Exporter 采集數據 Pushgateway 采集數據 PromQL 查詢語言 Grafana 圖形化展示 Prometheus 標簽管理 Prometheus 告警機制 Prometheus 服務發現 各種Exporter 高級功能 Prometheus 實現容器監控 Promethe…

EPNN:基于嵌入式偏振神經網絡的水下成像增強方法(未做完)

Enhancing Underwater Imaging for Robot through Embedded Polarization Neural Network EPNN:基于嵌入式偏振神經網絡的水下成像增強方法 1 論文核心概念 本文提出了一種名為嵌入式偏振神經網絡(Embedded Polarization Neural Network, EPNN) 的方法,用于顯著提升水下…

基于單片機冷藏運輸車環境檢測/水產品運輸環境檢測設計

傳送門 👉👉👉👉單片機作品題目速選一覽表🚀 👉👉👉👉單片機作品題目功能速覽🚀 🔥更多文章戳👉小新單片機-CSDN博客&#x1f68…

基于STM32設計的人體健康監護系統(華為云IOT)_280

文章目錄 一、前言 1.1 項目介紹 【1】項目開發背景 【2】設計實現的功能 【3】項目硬件模塊組成 【4】設計意義 【5】國內外研究現狀 【6】摘要 1.2 設計思路 1.3 系統功能總結 1.4 開發工具的選擇 【1】設備端開發 【2】上位機開發 1.5 參考文獻 1.6 系統框架圖 1.7 系統原理…

先買實現煩過

#include <myhead.h> #define ERR_LOG(msg)do{perror(msg);printf("%d %s %s\n",__LINE__,__func__,__FILE__);}while(0) //定義TFTP默認端口號&#xff08;69&#xff09;和數據包大小&#xff08;516字節&#xff09; #define PORT 69 #define N 516 …

ACD智能分配:輪流分配和排序上限分配的設置

在客戶服務中&#xff0c;合理的對話分配是提高服務質量的關鍵。一洽客服系統針對不同業務場景,提供靈活的客服分配策略,幫助企業實現智能化的客戶服務管理&#xff0c;今天我們了解一下對話的輪流分配、排序上限分配、排序優先分配的設置一、輪流分配按照客服登錄系統的先后順…

【postMan / apifox 文件上傳】

apifox 需要提供相關插件 失敗的請求 { “timestamp”: “2025-09-10T14:44:24.91900:00”, “status”: 500, “error”: “Internal Server Error”, “path”: “/student/import” } 錯誤&#xff1a;Post “http://localhost:8080/student/import”: dial tcp [::1]:8080:…

視頻加水印,推薦使用運營大管家-視頻批量加水印軟件

運營大管家-視頻批量加水印軟件介紹“運營大管家-視頻批量加水印”是一款功能強大的桌面應用程序&#xff0c;旨在幫助用戶高效地為多個視頻批量添加自定義水印。無論是品牌宣傳、版權保護&#xff0c;還是個性化展示&#xff0c;本軟件都能提供靈活的文字水印和圖片水印選項&a…