基本圖形的光柵化算法

如何在指定的輸出設備上根據坐標描述構造基本二維幾何圖形(點、直線、圓、橢圓、多邊形域、字符串及其相關屬性等)。

圖形生成的概念
圖形的生成:是在指定的輸出設備上,根據坐標描述構造二維幾何圖形。
圖形的掃描轉換:在光柵顯示器等數字設備上確定一個最佳逼近于圖形的象素集的過程。

直線段的掃描轉換
直線的繪制要求

(1)直線要直;

(2)直線的端點要準確,無定向性無斷裂;

(3)直線的亮度、色澤要均勻;

(4)畫線的速度要快;

(5)具有不同的色澤、亮度、線型等。
解決的問題:給定直線兩端點P0(x0,y0)和P1(x1,y1),畫出該直線。

逐點比較法:

數值微分法(DDA法):
增量算法
直觀、易實現
不利于用硬件實現
x(i+1) = x(i) + 1

y(i+1) = y(i) + k

中點Bresenhan算法:
算法原理:根據直線的斜率確定或選擇變量在x或y方向上每次遞增一個單位,而另一方向的增量為1或0,它取決于實際直線與相鄰象素點的距離,這一距離稱為誤差項。

中點Bresenham算法——算法步驟
輸入直線的兩端點P0(x0,y0)和P1(x1,y1)。
計算初始值△x、△y、D=△x-2△y、x=x0、y=y0。
繪制點(x,y)。判斷D的符號。若D<0,則(x,y)更新為(x+1,y+1),D更新為D+2△x-2△y;否則(x,y)更新為(x+1,y), D更新為D-2△y。
當直線沒有畫完時,重復上一步驟,否則結束。

改進的Bresenhan算法——算法步驟
1.輸入直線的兩端點P0(x0,y0)和P1(x1,y1)。
2.計算初始值△x、△y、e=-△x、x=x0、y=y0。
3.繪制點(x,y)。
4.e更新為e+2△y,判斷e的符號。若e>0,則(x,y)更新為(x+1,y+1),同時將e更新為e-2△x;否則(x,y)更新為(x+1,y)。
5.當直線沒有畫完時,重復步驟3和4。否則結束。

圓的掃描轉換
解決的問題:繪出圓心在原點,半徑為整數R的圓x2+y2=R2。

簡單方程產生圓弧:
算法原理:利用其函數方程,直接離散計算。

中點Bresenham畫圓——算法步驟
1.輸入圓的半徑R。
2.計算初始值d=1-R、x=0、y=R。
3.繪制點(x,y)及其在八分圓中的另外七個對稱點。
4.判斷d的符號。若d<0,則先將d更新為d+2x+3,再將(x,y)更新為(x+1,y);否則先將d更新為d+2(x-y)+5,再將(x,y)更新為(x+1,y-1)。
5.當x<y時,重復步驟3和4。否則結束。

多邊形的掃描轉換與區域填充:
多邊形的掃描轉換主要是通過確定穿越區域的掃描線的覆蓋區間來填充。
區域填充是從給定的位置開始涂描直到指定的邊界條件為止。

多邊形的掃描轉換:
頂點表示用多邊形的頂點序列來刻劃多邊形。
點陣表示是用位于多邊形內的象素的集合來刻劃多邊形。
掃描轉換多邊形:從多邊形的頂點信息出發,求出位于其內部的各個象素,并將其顏色值寫入幀緩存中相應單元的過程。

X-掃描線算法——原理
基本思想:按掃描線順序,計算掃描線與多邊形的相交區間,再用要求的顏色顯示這些區間的所有象素。

X-掃描線算法——算法步驟
1.確定多邊形所占有的最大掃描線數,得到多邊形頂點的最小和最大y值(ymin和ymax)。
2.從y=ymin到y=ymax,每次用一條掃描線進行填充。
3.對一條掃描線填充的過程可分為四個步驟:

求交;排序;交點配對;區間填色。

X-掃描線算法——取整規則
交點的取整規則:使生成的像素全部位于多邊形之內。(用于直線等圖元掃描轉換的四舍五入原則可能導致部分像素位于多邊形之外,從而不可用)。
假定非水平邊與掃描線y=e相交,交點的橫坐標為x,規則如下:

規則1:X為小數,即交點落于掃描線上兩個相鄰像素之間時:
交點位于左邊界之上,向右取整;
交點位于右邊界之上,向左取整;

規則2:邊界上象素的取舍問題,避免填充擴大化。規定落在右邊邊界上的像素不予填充。(具體實現時,只要對掃描線與多邊形的相交區間左閉右開)
規則3:當掃描線與多邊形頂點相交時,交點的取舍,保證交點正確配對。
解決方法:

當掃描線與多邊形的頂點相交時,
若共享頂點的兩條邊分別落在掃描線的兩邊,交點只算一個;
若共享頂點的兩條邊在掃描線的同一邊,這時交點作為零個或兩個。

實際處理:只要檢查頂點的兩條邊的另外兩個端點的Y值,兩個Y值中大于交點Y值的個數是0,1,2,來決定取0,1,2個交點。

改進的有效邊表算法:
改進原理:
處理一條掃描線時,僅對有效邊求交。
利用掃描線的連貫性。
利用多邊形邊的連貫性。

改進的有效邊表算法(Y連貫性算法)
有效邊(Active Edge):指與當前掃描線相交的多邊形的邊,也稱為活性邊。
有效邊表(Active Edge Table, AET):把有效邊按與掃描線交點x坐標遞增的順序存放在一個鏈表中,此鏈表稱為有效邊表。
有效邊表的每個結點:

x
ymax
1/k
next

改進的有效邊表算法——構造邊表
首先構造一個縱向鏈表,鏈表的長度為多邊形所占有的最大掃描線數,鏈表的每個結點,稱為一個桶,則對應多邊形覆蓋的每一條掃描線


將每條邊的信息鏈入與該邊最小y坐標(ymin )相對應的桶處。也就是說,若某邊的較低端點為ymin,則該邊就放在相應的掃描線桶中。
每條邊的數據形成一個結點,內容包括:該掃描線與該邊的初始交點x(即較低端點的x值),1/k,以及該邊的最大y值ymax。
x|ymin
ymax
1/k
NEXT
同一桶中若干條邊按X|ymin由小到大排序,若X|ymax 相等,則按照1/k由小到大排序。

改進的有效邊表算法——算法步驟
(1)初始化:構造邊表,AET表置空;
(2)將第一個不空的ET表中的邊與AET表合并;
(3)由AET表中取出交點對進行填充。填充之后刪除y=ymax的邊;
(4)yi+1=yi+1,根據xi+1=xi+1/k計算并修改AET表,同時合并ET表中y=yi+1桶中的邊,按次序插入到AET表中,形成新的AET表;
(5)AET表不為空則轉(3),否則結束。

邊緣填充算法:
基本思想:按任意順序處理多邊形的每條邊。處理時,先求出該邊與掃描線的交點,再對掃描線上交點右方的所有象素取反。
算法簡單,但對于復雜圖型,每一象素可能被訪問多次

柵欄填充算法:
柵欄指的是一條過多邊形頂點且與掃描線垂直的直線。它把多邊形分為兩半。
基本思想:按任意順序處理多邊形的每一條邊,但處理每條邊與掃描線的交點時,將交點與柵欄之間的象素取反。
這種算法盡管減少了被重復訪問象素的數目,但仍有一些象素被重復訪問。

邊標志算法:
基本思想:先用特殊的顏色在幀緩存中將多邊形的邊界勾畫出來,然后將著色的象素點依x坐標遞增的順序配對,再把每一對象素構成的區間置為填充色。
分為兩個步驟:打標記;填充。
當用軟件實現本算法時,速度與改進的有效邊表算法相當,但本算法用硬件實現后速度會有很大提高。

區域填充
基本概念:
區域填充是指從區域內的某一個象素點(種子點)開始,由內向外將填充色擴展到整個區域內的過程。
區域是指已經表示成點陣形式的填充圖形,它是相互連通的一組像素的集合。

區域的表示方法:
邊界表示法:把位于給定區域的邊界上的象素一一列舉出來的方法。
邊界表示法中,由于邊界由特殊顏色指定,填充算法可以逐個象素地向外處理,直到遇到邊界顏色為止,這種方法稱為邊界填充算法(Boundary-fill Algorithm)。

內點表示法:枚舉出給定區域內所有象素的表示方法。以內點表示法為基礎的區域填充算法稱為泛填充算法(Flood-fill Algorithm)。

區域的分類:
4-連通區域:從區域上的一點出發,通過訪問已知點的4-鄰接點,在不越出區域的前提下,遍歷區域內的所有象素點。
8-連通區域:從區域上的一點出發,通過訪問已知點的8-鄰接點,在不越出區域的前提下,遍歷區域內的所有象素點。

4連通與8連通區域的區別:
連通性: 4連通可看作8連通區域,但對邊界有要求。
對邊界的要求。

區域填充算法:
區域填充算法(邊界填充算法和泛填充算法)是根據區域內的一個已知象素點(種子點)出發,找到區域內其他象素點的過程,所以把這一類算法也成為種子填充算法。

算法的輸入:種子點坐標(x,y),填充色以及邊界顏色。
利用堆棧實現簡單的種子填充算法

算法從種子點開始檢測相鄰位置是否是邊界顏色,若不是就用填充色著色,并檢測該像素點的相鄰位置,直到檢測完區域邊界顏色范圍內的所有像素為止。

棧結構實現4-連通邊界填充算法的算法步驟為:

種子象素入棧;當棧非空時重復執行如下三步操作:

(a)棧頂象素出棧;

(b)將出棧象素置成填充色;

(c)檢查出棧象素的4-鄰接點,若其中某個象素點不是邊界色且未置成多邊形色,則把該象素入棧。

棧結構實現8-連通邊界填充算法的算法步驟為:

種子象素入棧;當棧非空時重復執行如下三步操作:

(a)棧頂象素出棧;

(b)將出棧象素置成填充色;

(c)檢查出棧象素的8-鄰接點,若其中某個像素點不是邊界色且未置成多邊形色,則把該像素入棧。可以用于填充帶有內孔的平面區域。
把太多的像素壓入堆棧,降低了效率,同時需要較大的存儲空間。
遞歸執行,算法簡單,但效率不高,區域內每一像素都引起一次遞歸,進/出棧費時費內存。
通過沿掃描線填充水平象素段,來代替處理4-鄰接點和8-鄰接點。

掃描線種子填充算法:掃描線通過在任意不間斷掃描線區間中只取一個種子像素的方法使堆棧的尺寸極小化。不間斷區間是指在一條掃描線上的一組相鄰像素。

基本過程:當給定種子點時,首先填充種子點所在的掃描線上的位于給定區域的一個區段,然后確定與這一區段相通的上下兩條掃描線上位于給定區域內的區段,并依次保存下來。反復這個過程,直到填充結束。

區域填充算法——泛填充算法
算法的輸入:種子點坐標(x,y),填充色和內部點的顏色。
算法原理:算法從指定的種子(x,y)開始,用所希望的填充顏色賦給所有當前為給定內部顏色的象素點。種子象素入棧;棧非空時重復執行如下三步操作:

(1)棧頂象素出棧;

(2)將出棧象素置成填充色;

(3)檢查出棧象素的8-鄰接點,若其中某個象素點不是給定內部點的顏色且未置成新的填充色,則把該象素入棧。

當以邊界表示時,4-連通邊界填充算法只能填充4-連通區域,8-連通邊界填充算法也只能填充8-連通區域。
當以內點表示時,8-連通泛填充算法可以填充8-連通區域也可以填充4-連通區域,當然4-連通泛填充算法還是只能填充4-連通區域。

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

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

相關文章

php左側,php左側補零

在php中有兩個函數——至少有兩個是否有其他的我還不知道&#xff0c;能夠實現數字補零&#xff0c;str_pad(),sprintf()詳細如下str_pad顧名思義這個函數是針對字符串來說的這個可以對指定的字符串填補任何其它的字符串例如:str_pad(帶填補的字符串,填補后的長度&#xff0c;填…

python - work3

# -*- coding:utf-8 -*-project: jiaxyauthor: Jimmyfile: work_20181107.pyide: PyCharm Community Editiontime: 2018-11-07 10:46blog: https://www.cnblogs.com/gotesting/## 1&#xff1a;一個足球隊在尋找年齡在10歲到12歲的小女孩&#xff08;包括10歲和12歲&#xff09…

團隊-中國象棋-最終程序

托管平臺地址:https://gitee.com/zhanghongjian666/ZhongGuoXiangQi 小組名稱:exciting 小組成員合照: 程序運行方法:html 程序運行示例及運行結果:轉載于:https://www.cnblogs.com/qwsa/p/7944093.html

NET CORE 基于緩存策略的SignalR控制推送頻率(每多少秒/多少次)API接口控制(限流)...

ASP.NET Core SignalR 概述&#xff0c;自行去官網搜。SignalR 沒有控制和前端推送頻率的功能&#xff0c;就是后端一旦發送請求&#xff0c;前端立馬響應。或者前端發送請求&#xff0c;后端立馬響應&#xff0c;但是如果誤操作&#xff0c;或者業務原因&#xff0c;對產生的信…

svn 的使用(二)

這篇主要介紹下 svn 鉤子的使用&#xff0c;svn 的安裝以及配置等能夠查看 svn 的使用&#xff08;一&#xff09; 我們能夠在svn創建的倉庫目錄下看到hooks 目錄。這里面就存放這個各種svn操作同一時候會運行的腳本文件。&#xff08;你能夠自己查看每一個腳本文件&#xff0c…

java原子類場景,CAS你知道嗎?原子類AtomicInteger的ABA問題談談?,原子共面問題...

CAS你知道嗎&#xff1f;原子類AtomicInteger的ABA問題談談&#xff1f;&#xff0c;原子共面問題(1)CAS是什么&#xff1f;比較并交換舉例1, CAS產生場景代碼&#xff1f;importjava.util.concurrent.atomic.AtomicInteger;public classCASDemo {public static voidmain(Stri…

ABP Vnext 批量導入用戶,解決密碼加密問題

因為ABP Vnext在密碼加密方面使用的鹽加密的方式&#xff0c;底層的加密方式讓人摸不著頭腦。如何需要批量導入用戶的時候&#xff0c;這個密碼問題就很頭疼。假設&#xff0c;已經有一個集合List<entity>的用戶數據了&#xff0c;此時進行循環取出一條用戶信息&#xff…

深入分析JavaWeb Item7 -- HttpServletResponse詳解

Web服務器收到客戶端的http請求&#xff0c;會針對每一次請求&#xff0c;分別創建一個用于代表請求的request對象、和代表響應的response對象。request和response對象即然代表請求和響應&#xff0c;那我們要獲取客戶機提交過來的數據&#xff0c;只需要找request對象就行了。…

Spring.net學習記錄

Spring.Net功能&#xff1a; 1、控制反轉&#xff08;IOC&#xff09;&#xff1a;就是創建對象的權利由開發人員自己控制New&#xff0c;轉到了有容器來控制 2、依賴注入&#xff08;DI&#xff09;&#xff1a;就是通過容器來創建對象的時候&#xff0c;在對象初始化時給一些…

uAdmin the Golang Web framework

2019獨角獸企業重金招聘Python工程師標準>>> A little over two years ago, I started looking for a web framework like Django for Golang but to my surprise, I couldn’t find anything that even does the basic. My requirements were simple: A standard w…

ABP Vnext 數據庫表字段存在IsDeleted如何物理刪除HardDeleteAsync

ABP Vnext在寫表實體會繼承 xxxEntity : FullAuditedAggregateRoot<Guid>此時這個聚合根會包含一個 IsDeleted字段屬性&#xff0c;一旦繼承了這個軟刪除字段&#xff0c;你在倉儲對象調用 await _xxxxRepository.DeleteAsync(x > x.Id > 0)時的時候&#xff0c;…

詳解當當網的分布式作業框架elastic-job

詳解當當網的分布式作業框架elastic-job

java條件觸發,條件事件觸發Anylogic

所以首先event.restart()函數僅在事件具有觸發類型時才適用&#xff1a;timeout和mode&#xff1a;user control&#xff0c;否則你的event.restart()函數什么也不做......其次&#xff0c;你需要在有條件的事件上調用你的函數&#xff0c;但是在停車的那一刻......你可以在car…

攻城不易守城更難,匯付天下該如何守住打下來的“江山”?

伴隨著相關監管政策的實施&#xff0c;第三方支付市場儼然已經迎來了“罰單潮”。根據不完全統計&#xff0c;截至2018年10月8日&#xff0c;央行已開出109張支付罰單&#xff0c;國付寶等多家支付機構罰金甚至高達千萬以上&#xff0c;今年累計處罰的金額已超過2億元。照此速度…

1024技術論壇 | C#與.NET技術新發展

主辦方簡介上海維宏電子科技股份有限公司&#xff08;維宏股份&#xff0c;股票代碼&#xff1a;300508&#xff09;&#xff0c;是一家專業提供運動控制系統解決方案的高科技企業&#xff0c;公司擁有雄厚的研發力量和高素質的服務隊伍&#xff0c;我們以快捷的速度&#xff0…

Oracle Code登錄北京 代碼盛宴邀你high起來|免費報名

盛夏北京&#xff0c;將迎來 Oracle Code 北京站活動。作為貫穿全年、橫跨全球的 20 場活動中的一場&#xff0c;北京站汲取各地 Oracle Code 精華&#xff0c;結合國內開發者社區現狀和需求&#xff0c;呈現一場代碼盛宴。 來自 Oracle Code、OTN 及 AppsLap 的大咖們將齊聚北…

簡單的四則運算

// 20163536 楊宇航 獎勵原創 上課未完成原因&#xff1a; 哎&#xff0c;在上那節課時候&#xff0c;我們正在準備程序設計大賽&#xff0c;因為我們團隊當中只有我的電腦有數據庫&#xff0c;所有我只好將我的電腦貢獻給團隊了&#xff0c;不然在10分鐘內完成應該不成問題&a…

導出導入數據庫

一、導出用 mysqldump 備份數據庫 1mysqldump -u用戶 -p密碼 數據庫名 > &#xff08;目錄&#xff09;導出文件名如&#xff1a;mysqldump -uroot -p123 dbname > /root/test.sql 回車就直接完成備份。如果只需要建表指令&#xff0c;則命令如下&#xff1a; shell> …

matlab randn 范圍,請問randn產生的數據在什么范圍內變化

產生均值為0&#xff0c;方差 σ^2 1&#xff0c;標準差σ 1的正態分布的隨機數或矩陣的函數。Example:產生一個隨機分布的指定均值和方差的矩陣&#xff1a;將randn產生的結果乘以標準差&#xff0c;然后加上期望均值即可。例如&#xff0c;產生均值為0.6&#xff0c;方差為…

C#開發串口通信實例及串口基礎

一、串口通信簡介串行接口&#xff08;串口&#xff09;是一種可以將接受來自CPU的并行數據字符轉換為連續的串行數據流發送出去&#xff0c;同時可將接受的串行數據流轉換為并行的數據字符供給CPU的器件。一般完成這種功能的電路&#xff0c;我們稱為串行接口電路。串口通信&a…