圓填充演算法
① 圓形 最大利用率問題
這是從你遇到的問題中提出的數學模型吧。但是你到底想要什麼呢?1.既然有大小之分那麼N≥2,既然要小遠直徑最大那麼只好等於2了;2.你的提問又要求最大利用率,如wade_freedom 回答一樣,小圓越小越好,N無窮大。1和2是矛盾的,因此你的問題本身就有問題。
② 計算機圖形學 問題 中點圓演算法和掃描線演算法
寫個文檔解釋一下。
③ 區域填充演算法可以填充圓嗎
可以的。在圓規則范圍之內,由圓心至圓上,任意兩條線段(半徑)之間,可以用扇形填充並進行計算。
④ 矩形長寬比變化時矩形里能放最多的圓或者正多邊形(正多邊形面積和圓相同),要寫出函數表達式
⑤ MFC區域填充
無論是對什麼圖形進行填充,或者構造任何區域,其本質就是將這片區域的每一個像素的屬性表達出來。。。
既然你已經確認了5個點的坐標,那麼就是平常人們用手來畫五角星的過程,你應該是會的。一共畫5筆,從最左邊的點開始,先到最右邊的點,再到左下角的點,再到最上面的點,再到右下角的點,最後返回最左邊的點把圖形閉合。如此用LineTo()將五角星閉合。
如此一來,就會形成6個閉合的圖形,分別是5個以5個點為一點的三角形,和中心的5邊型。將這5個圖形中的所有像素全部填充為紅色即可。
填充的演算法有很多,像是三角形和矩形,都有現成的API進行填充。對於中間的五邊形,可以採用矩陣邊緣檢測的方法取得空白矩陣向量然後填色(這也是最有效的演算法);也可以採用接近逼近法來填充,就是在五邊形的內部生成無數個紅色的小三角形,將五邊形填充滿;也可以採用覆蓋法來填充(前提是正五角星),就是用數學公式算出五角星的內接圓,把這個圓形填充為紅色即可。
我建議你將整幅畫布按照矩陣的方式進行操作,最後用BitBlt掃描到前台,這些操作都會異常簡單。。。
⑥ 畫圓為什麼要用Bresenham演算法
演算法引入的本意是解決像素填充的問題的
點和線這種東西在理論上都是沒有寬度的,但是要在屏幕上繪制的時候就要去填充像素以形成痕跡
一行上經常有2個以上的像素都被線所貫穿, 如何填充是個問題
而且像素填充本身是使用非常頻繁的需求,故而畫線的演算法效率是非常重要的,對整個系統影響巨大
Bresenham演算法是通過增量計算的方式快速判別下一個行或者列上的要填充的像素的位置,從計算上來說非常的節省,幾乎都是整數的演算法,速度非常的快
⑦ MATLAB編程問題,要在一個400*400矩形框里隨機的填充圓,要求不能重疊,已知圓的個數N和所有半徑Ri。
N=30;%填充30個
b=round(10+20*rand(1,N));%30個圓半徑在10~30之間(這里用隨機數產生)
S=[400,400];%區域大小
%以上是給定的條件,根據你自己的數據給出
%不過根據半徑數據的大小,N不能太大
%要不然可能要化很多時間,或者找不到填充位置進入死循環
p=b(1)+(S-2*b(1)).*rand(1,2);%差生一個隨機點
A=p';%第一點坐標記錄進矩陣A中
t=0:360;
plot([040040000],[004004000]);holdon%畫區域方框
forii=2:N
p=b(ii)+(S-2*b(ii)).*rand(1,2);%產生一個新隨機點
whileany((A(1,:)-p(1)).^2+(A(2,:)-p(2)).^2<((b(1:ii-1)+b(ii)).^2))
p=b(ii)+(S-2*b(ii)).*rand(1,2);
end%根據距離判斷新的點是否和所有舊的點距離都滿足條件
%如果有一點不滿足條件,重新生成隨機點,知道完全滿足條件
A=[A,p'];%保存新的點到矩陣A中
patch(p(1)+b(ii)*cosd(t),p(2)+b(ii)*sind(t),'r');%填充一個圓
end
holdoff
axisequal
axis([-50450-50450]);
A=[b;A];
%最終A是3xN的矩陣,第一行是半徑,第二行是x坐標,第三行是y坐標
以下是某次填充的結果
不過這個填充的演算法並不健壯,
當圓的半徑較大,或者要填的N數目較多時
留下的縫隙太小,以至隨機產生的坐標經常失敗
甚至很可能留下縫隙不足以再填圓,最終進入死循環
⑧ openGL中的glReadPixels函數問題
了解下glReadPixels參數的含義:
void glReadPixels( GLint x, GLint y, GLsizei width,GLsizei height, GLenum format, GLenum type, GLvoid *pixels) ;
前面幾個參數指定讀取的位置尺寸以及格式, 最後一個參數用來返回結果, 所以像素數據自然是讀到pixels中。