OpenGL研究3.0 多邊形區域填充

OpenGL研究3.0 多邊形區域填充

DionysosLai(906391500@qq.com)2014-06-22

???????? 所謂多邊形區域填充。就是將多邊形內部區域,所有已相同色塊填充。注意:這里討論的多邊形是簡單多邊形(即不考慮諸如五角星這樣的相交多邊形)。簡單多邊形,分為凹多邊形和凸多邊形。

???????? 多邊形區域填充有下面幾種方法:

1.??????逐點掃描方法:

? ? ? ? ?原理:掃描多邊形區域,逐點推斷點是否在多邊形內。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ?難點:在于怎樣推斷點是否在區域內;

? ? ? ? ?經常使用怎樣推斷點是否在區域內方法:射線法、面積法。

? ? ? ? ?面積法原理:取一個點。連接多邊形各個點,依據三個點形成一個三角形原理,我們能夠求得三角形面積。推斷面積的大小,就能夠推斷該店是否在多邊形內了。

???????? 射線法:這種方法。是我們這里要重點解說的一個方法。原理:取一個點。向左或者向右做一條射線過去,推斷射線與多邊形的交點。依據多邊形交點熟練和本身多邊形邊情況,推斷點是否在多邊形內。

???????? 首先,射線從左向右,最左邊點肯定在多邊形區域為(我們這里假定射線方向水平向左)。那么與多邊形相交第一個點,必定表明射線右部分在多變形內,與多邊形相交第二個點。表明射線右部分在多邊形外面。因此。通過推斷射線與多變的交點奇偶性。推斷點是否在多邊形內。

? ? ? ? ?這里。有幾種特殊情況,例如以下圖所看到的:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ?圖a,射線與多變形頂點相交,頂點算一個;圖b。射線與多邊形頂點的交點。不被計算在內(注意圖a和圖b的差別->頂點縱坐標大小差別);圖c和圖d,射線與多邊形一條邊重合,這條邊被忽略不計。

? ? ? ? ?因此。我們能夠設計例如以下:取點向左做一條射線,1. 對于水平邊不做考慮;2. 對于多邊形頂點與射線交點情況。假設其縱坐標是所屬邊較大頂點,則計數(參考圖a),否則不計數(圖b)。3.對于點在多邊形上情況,可直接推斷點在多邊形內。

? ? ? ? ?偽代碼例如以下:

count ← 0;
以P為端點。作從右向左的射線L; 
for 多邊形的每條邊sdo if P在邊s上 then return true;if s不是水平的then if s的一個端點在L上if 該端點是s兩端點中縱坐標較大的端點then count ← count+1else if s和L相交then count ← count+1;
if count mod 2 = 1 then return true;
else return false;

? ? ? ? ?對應代碼例如以下:注:我是在coco2dx2.3版本號內測試的。因此可能移植要改些類名。

///@brief 推斷點是否在多邊形
///@param[in] p0--要推斷點, poly--多邊形點集合, numberOfPoints--多邊形點數量
///@return 2---點在多邊形內, 1---點在多邊邊上,0---點不在多邊形內
///@author DionysosLai,906391500@qq.com
///@retval 
///@post
///@version 1.0
///@data 2014-04-11
int HelloWorld::pointIsInPolygon(const CCPoint& p0, const CCPoint* poly, const unsigned int numberOfPoints)
{unsigned int count  = 0;		///< 用來標記射線L與多邊形的交點數;CCSize	winsize = CCDirector::sharedDirector()->getWinSize();/// 已點p0向左向右做一條射線L;CCPoint leftPoint = ccp(-100.0f, p0.y);CCPoint rightPoint = ccp(winsize.width+100.0f, p0.y);/// 推斷每條邊for (unsigned int i = 0; i < numberOfPoints-1; i++){/// 先推斷點p0是否在邊s上;if (pointIsAtLine(p0, poly[i], poly[(i+1)%(numberOfPoints)])){CCLOG("Point is at the %dth line", i);return 1;}/// 推斷邊s是否是平行線;if (poly[i].y != poly[(i+1)%(numberOfPoints)].y){		do {/// 推斷邊s的是否有端點在L上 同一時候 再推斷該點是否是邊s縱坐標較大的一個點if (pointIsAtLine(poly[i], leftPoint, rightPoint)){if (poly[i].y > poly[(i+1)%(numberOfPoints)].y){count += 1;}break;}	if (pointIsAtLine(poly[(i+1)%(numberOfPoints)], leftPoint, rightPoint)){if (poly[i].y < poly[(i+1)%(numberOfPoints)].y){count += 1;}break;}	/// 假設邊s沒有端點在L上,則推斷s與L是否相交if (segmentLineIsIntersect(leftPoint, rightPoint, poly[i], poly[(i+1)%(numberOfPoints)])){count += 1;}	} while (0);}}if (1 == count%2){CCLOG("Point is not in polygon!");return 0;}else{CCLOG("Point is in  polygon!");return 2;}
}

? ? ? ???這里有個pointIsAtLine。是用來推斷點是否在邊上函數;segmentLineIsIntersect。是用來推斷兩條線段是否相交函數。可參考我的還有一邊博文:http://blog.csdn.net/dionysos_lai/article/details/24418697計算幾何文檔一系列文章(眼下僅僅寫了一篇,實際上是幾乎相同寫了經常使用幾何算法,還沒寫成博文。怪樓主太懶了。)

???????? Ok,逐點掃描推斷方法就是差不都這樣了。

2.???????掃描線算法

? ? ? ???逐點掃描算法,沒有充分考慮到像素之間的連貫性。效率低。

掃描線算法。就是要利用像素之間的連貫性,提高算法效率。

? ? ? ???所謂連貫性:有三個概念,1.邊的連貫性,AB邊與掃描線1相交,也可能與掃描線2相交;2.掃描線連貫性:當前掃描線與多邊形邊交點順序,可能與下一條掃描線交點情況一致或者類似;3.區間連貫性:同一區間像素取同一顏色屬性。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ?掃描線原理:將整個多邊形區域掃描問題分解到一條條掃描線問題。僅僅要完畢每條掃描線的繪制,就實現了多邊形區域填充問題。

一條掃描線與多邊形有偶數個交點(0就不算了),按順序每2個點形成一個區間,僅僅要繪制這個區間就可以。

???????? 難點這與掃描線與多邊形邊交點推斷,這個是高中問題了,通過線段一般方程ax+by+c=0,兩立方程求解。

只是這樣的方法。要計算各種參數,比較費時,更好的方法是分成各種情況分開討論(盡管比較麻煩)。能夠關注我的《計算幾何算法》系類文章。







轉載于:https://www.cnblogs.com/lytwajue/p/6823287.html

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

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

相關文章

[轉]Android筆記:ScrollView嵌套ViewPager的滾動沖突解決方法

12345678910111213141516171819202122232425262728293031323334/*** 能夠兼容ViewPager的ScrollView * Description: 解決了ViewPager在ScrollView中的滑動反彈問題 */ public class ScrollViewExtend extends ScrollView { // 滑動距離及坐標 private float xDistance, yDista…

android tv 樂視手機,樂視超4系列原生Android TV分享

固件&#xff1a;Official USA Firmware:USA BIN Firmware 5.8.050S_1028://mega.nz/#F!7PhyDI6D!TnwNlMmWXosK1uCUdpyNGg[/url]USA ZIP Firmware 5.8.056S_0420 (OTA ZIP, must be flashed only after flashing the above bin)://drive.google.com/open?id1N9...rNHVB_-VPIad…

ping、網絡抖動與丟包

基本概念&#xff1a; ping: PING指一個數據包從用戶的設備發送到測速點&#xff0c;然后再立即從測速點返回用戶設備的來回時間。也就是俗稱的“網絡延遲” 一般以毫秒&#xff08;ms&#xff09;計算 一般PING在0~100ms都是正常的速度&#xff0c;不會有較為明顯的卡頓。 測試…

Webtask后端即服務:無服務器快速教程

查爾斯厄勒(Charles Ouellet) (By Charles Ouellet) The word serverless is buzzing through dozens of dev circles today.如今&#xff0c; 無服務器一詞正在數十個開發界中流行。 It has been for a while now.已經有一段時間了。 I’ve been meaning to exit my code ed…

leetcode145. 二叉樹的后序遍歷(dfs)

給定一個二叉樹&#xff0c;返回它的 后序 遍歷。示例:輸入: [1,null,2,3] 1\2/3 輸出: [3,2,1]class Solution {List<Integer> listnew ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) {getPostorderTraversal(root);return list;…

[luoguP2801] 教主的魔法(二分 + 分塊)

傳送門 以為對于這類問題線段樹都能解決&#xff0c;分塊比線段樹菜&#xff0c;結果培訓完才知道線段樹是一種特殊的分塊方法&#xff0c;有的分塊的題線段樹不能做&#xff0c;看來分塊還是有必要學的。 對于這個題&#xff0c;先分塊&#xff0c;然后另開一個數組對于每個塊…

鴻蒙系統適配開發,捕獲科技擬建立鴻蒙開發組 為區塊鏈錢包客戶適配鴻蒙系統做籌備...

遭遇美國“實體清單”封殺的第85天&#xff0c;華為“鴻蒙”橫空出世&#xff01;8月9日下午&#xff0c;在華為全球開發者大會上&#xff0c;當余承東正式宣布鴻蒙系統(Harmony OS)發布的時候&#xff0c;全場掌聲雷動&#xff01;世界上第一個由中國企業自主研發的全平臺微內…

[arm驅動]linux內核中斷編程

第一部分獲取中斷(開啟硬件中斷)一、中斷的申請注銷: 1&#xff09;中斷的申請 12int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) 2)中斷的注銷 1void free_irq(unsigned int irq, void *dev_id) 3&am…

關于VCP(Virtual Com Port)拓展的調試經歷(一)

* The Overview 前日&#xff0c;接到老板部署的任務&#xff0c;將現有的基于STM32L151與L432的LoRaWAN程序中添加USB CDC(Communication Device Class)功能&#xff0c;并枚舉為VCP(Virtual Com Port)用以替代以往的串口打印。很疑惑為什么以前架構代碼的時候沒有添加進去。。…

leetcode701. 二叉搜索樹中的插入操作(dfs)

給定二叉搜索樹&#xff08;BST&#xff09;的根節點和要插入樹中的值&#xff0c;將值插入二叉搜索樹。 返回插入后二叉搜索樹的根節點。 輸入數據保證&#xff0c;新值和原始二叉搜索樹中的任意節點值都不同。注意&#xff0c;可能存在多種有效的插入方式&#xff0c;只要樹在…

三星s6 android 8.0,再見Android 8.0,三星s6全系列系統都停止了,第一代國王已經倒下了嗎?...

對于Android用戶而言&#xff0c;最令人興奮的事情是系統更新&#xff0c;因為該更新意味著更流暢的體驗和更加用戶友好的功能. 但是&#xff0c;舊的三星S6并不是那么幸運&#xff0c;并且不再錯過Android 8.0.三星s6的全系列指的是三星s6&#xff0c;三星s6 edge&#xff0c;…

devise tree_Devise如何確保您的Rails應用密碼安全

devise treeby Tiago Alves由蒂亞戈阿爾維斯(Tiago Alves) Devise如何確保您的Rails應用密碼安全 (How Devise keeps your Rails app passwords safe) Devise is an incredible authentication solution for Rails with more than 40 million downloads. However, since it ab…

Exchange 2010無法安裝問題解決方法

當你在活動目錄(AD)森林中安裝多臺全局編錄服務器(GC)之后,默認情況下你會發現在AD站點里面自動生成二條站點連接,從上面的截圖可以看到目前在AD森林的Default-First-Site-Name(默認站點)里面有6臺GC。 從上面的截圖可以看到目前只有一臺叫做Sh-Site1GC(全局編錄服務器)是處于運…

android edittext 不滾動,EditText 設置可以垂直滑動但是不可輸入

一、前言&#xff1a;android:id"id/edtInput"android:layout_width"match_parent"android:layout_height"60dp"android:background"drawable/round_theme_3_gray"android:gravity"top"android:hint"string/please_inp…

snmpd修改端口

http://blog.csdn.net/cau99/article/details/5077239 http://blog.csdn.net/gua___gua/article/details/48547701轉載于:https://www.cnblogs.com/diyunpeng/p/6829592.html

leetcode LCP 19. 秋葉收藏集(dp)

小扣出去秋游&#xff0c;途中收集了一些紅葉和黃葉&#xff0c;他利用這些葉子初步整理了一份秋葉收藏集 leaves&#xff0c; 字符串 leaves 僅包含小寫字符 r 和 y&#xff0c; 其中字符 r 表示一片紅葉&#xff0c;字符 y 表示一片黃葉。 出于美觀整齊的考慮&#xff0c;小扣…

步進電機 步距角 編碼器_我如何邁出了學習編碼的第一步

步進電機 步距角 編碼器A couple of months ago, I was chatting to a developer at work about how I’ve always wanted to learn to code but never tried.幾個月前&#xff0c;我正在與一個開發人員聊天&#xff0c;討論我一直想學習編碼但從未嘗試過的方法。 Coding alwa…

第五章:配置使用FastJson返回Json視圖

fastJson是阿里巴巴旗下的一個開源項目之一&#xff0c;顧名思義它專門用來做快速操作Json的序列化與反序列化的組件。它是目前json解析最快的開源組件沒有之一&#xff01;在這之前jaskJson是命名為快速操作json的工具&#xff0c;而當阿里巴巴的fastJson誕生后jaskjson就消聲…

一加6android9玩飛車掉,解鎖新速度:一加6T深度評測

解鎖新速度&#xff1a;一加6T深度評測2019-11-02 14:28:595點贊2收藏4評論創作立場聲明&#xff1a;我們只談智能硬件&#xff0c;向改變生活的智能硬件Say“嗨”&#xff01;作為安卓旗艦機成員&#xff0c;一加這個品牌在玩機一類的同學手里可是大放光彩&#xff0c;各種刷機…

設計模式(第十七式:迭代器模式)

概念&#xff1a;  迭代器模式&#xff1a;Provide a way to access the elements of an aggregarte object sequentiaally with exposing its underlying representation. 提供一種訪問容器對象內每個元素的一種方式&#xff0c;并且不暴露對象的一些內部細節。實現&#xf…