① 直線和圓的顯示(在線等答案)
實驗2 圓與橢圓
給出圓心坐標(xc, yc)和半徑r,逐點畫出一個圓周的公式有下列兩種。
一 直角坐標法
直角坐標系的圓的方程為
由上式導出:
當x-xc從-r到r做加1遞增時,就可以求出對應的圓周點的y坐標。但是這樣求出的圓周上的點是不均勻的,| x-xc | 越大,對應生成圓周點之間的圓周距離也就越長。因此,所生成的圓不美觀。
二 中點畫圓法
如圖1所示,函數為F(x, y)=x2+y2-R2的構造圓,圓上的點為F(x, y)=0,圓外的點F(x, y)>0,圓內的點F(x, y)<0,構造判別式:
d=F(M)=F(xp+1, yp-0.5)=(xp+1)2+(yp-0.5)2
若d<0,則應取P1為下一像素,而且下一像素的判別式為
d=F(xp+2, yp-0.5)= (xp+2)2+(yp-0.5)2-R2=d+2xp+3
若d≥0,則應取P2為下一像素,而且下一像素的判別式為
d=F(xp+2, yp-1.5)= (xp+2)2+(yp-1.5)2-R2=d+2(xp- yp)+5
我們討論按順時針方向生成第二個八分圓,則第一個像素是(0, R),判別式d的初始值為
d0=F(1, R-0.5)=1.25-R
三 圓的Bresenham演算法
設圓的半徑為r,先考慮圓心在(0, 0),從x=0、y=r開始的順時針方向的1/8圓周的生成過程。在這種情況下,x每步增加1,從x=0開始,到x=y結束,即有xi+1 = xi + 1;相應的,yi+1則在兩種可能中選擇:yi+1=yi或者yi+1 = yi - 1。選擇的原則是考察精確值y是靠近yi還是靠近yi-1(見圖2),計算式為
y2= r2-(xi+1)2
d1 = yi2-y2 = yi2-r2+(xi+1)2
d2 = y2- (yi - 1)2 = r2-(xi+1)2-(yi - 1)2
令pi=d1-d2,並代入d1、d2,則有
pi = 2(xi+1)2 + yi2+ (yi - 1)2 -2r2 (1.6)
pi稱為誤差。如果pi<0,則yi+1=yi,否則yi+1=yi - 1。
pi的遞歸式為
pi+1 = pi + 4xi +6+2(yi2+1- yi2)-2(yi+1-yi) (1.7)
pi的初值由式(1.6)代入xi=0,yi=r,得
p1 = 3-2r (1.8)
根據上面的推導,圓周生成演算法思想如下:
(1)求誤差初值,p1=3-2r,i=1,畫點(0, r)。
(2)求下一個光柵位置,其中xi+1=xi+1,如果pi<0則yi+1=yi,否則yi+1=yi - 1。
(3)畫點(xi+1, yi+1)。
(4)計算下一個誤差,如果pi<0則pi+1=pi+4xi+6,否則pi+1=pi+4(xi - yi)+10。
(5)i=i+1,如果x=y則結束,否則返回步驟(2)。
程序設計步驟如下。
(1)創建應用程序框架,以上面建立的單文檔程序框架為基礎。
(2)編輯菜單資源。
在工作區的ResourceView標簽中,單擊Menu項左邊"+",然後雙擊其子項IDR_MAINFRAME,並根據表1中的定義添加編輯菜單資源。此時建好的菜單如圖3所示。
表1 菜單資源表
菜單標題 菜單項標題 標示符ID
圓 中點畫圓 ID_MIDPOINTCIRCLE
Bresenham畫圓 ID_BRESENHAMCIRCLE
(3)添加消息處理函數。
利用ClassWizard(建立類向導)為應用程序添加與菜單項相關的消息處理函數,ClassName欄中選擇CMyView,根據表2建立如下的消息映射函數,ClassWizard會自動完成有關的函數聲明。
表2 菜單項的消息處理函數
菜單項ID 消 息 消息處理函數
ID_MIDPOINTCIRCLE CONMMAN OnMidpointcircle
ID_BRESENHAMCIRCLE CONMMAN OnBresenhamcircle
(4)程序結構代碼,在CMyView.cpp文件中的相應位置添加如下代碼。
void CMyView::OnMidpointcircle() //中點演算法繪制圓,如圖4所示
{
// TODO: Add your command handler code here
CDC* pDC=GetDC();
int xc=300, yc=300, r=50, c=0;
int x,y;
float d;
x=0; y=r; d=1.25-r;
pDC->SetPixel ((xc+x),(yc+y),c);
pDC->SetPixel ((xc-x),(yc+y),c);
pDC->SetPixel ((xc+x),(yc-y),c);
pDC->SetPixel ((xc-x),(yc-y),c);
pDC->SetPixel ((xc+y),(yc+x),c);
pDC->SetPixel ((xc-y),(yc+x),c);
pDC->SetPixel ((xc+y),(yc-x),c);
pDC->SetPixel ((xc-y),(yc-x),c);
while(x<=y)
{ if(d<0) d+=2*x+3;
else { d+=2*(x-y)+5; y--;}
x++;
pDC->SetPixel ((xc+x),(yc+y),c);
pDC->SetPixel ((xc-x),(yc+y),c);
pDC->SetPixel ((xc+x),(yc-y),c);
pDC->SetPixel ((xc-x),(yc-y),c);
pDC->SetPixel ((xc+y),(yc+x),c);
pDC->SetPixel ((xc-y),(yc+x),c);
pDC->SetPixel ((xc+y),(yc-x),c);
pDC->SetPixel ((xc-y),(yc-x),c);
}
}
void CMyView::OnBresenhamcircle() //// Bresenham演算法繪制圓,如圖5所示
{
CDC* pDC=GetDC();
int xc=100, yc=100, radius=50, c=0;
int x=0,y=radius,p=3-2*radius;
while(x<y)
{
pDC->SetPixel(xc+x, yc+y, c);
pDC->SetPixel(xc-x, yc+y, c);
pDC->SetPixel(xc+x, yc-y, c);
pDC->SetPixel(xc-x, yc-y, c);
pDC->SetPixel(xc+y, yc+x, c);
pDC->SetPixel(xc-y, yc+x, c);
pDC->SetPixel(xc+y, yc-x, c);
pDC->SetPixel(xc-y, yc-x, c);
if (p<0)
p=p+4*x+6;
else
{
p=p+4*(x-y)+10;
y-=1;
}
x+=1;
}
if(x==y)
pDC->SetPixel(xc+x, yc+y, c);
pDC->SetPixel(xc-x, yc+y, c);
pDC->SetPixel(xc+x, yc-y, c);
pDC->SetPixel(xc-x, yc-y, c);
pDC->SetPixel(xc+y, yc+x, c);
pDC->SetPixel(xc-y, yc+x, c);
pDC->SetPixel(xc+y, yc-x, c);
pDC->SetPixel(xc-y, yc-x, c);
}
四 橢圓掃描轉換中點演算法
下面討論橢圓的掃描轉換中點演算法,設橢圓為中心在坐標原點的標准橢圓,其方 程為
F(x, y)=b2x2+a2y2-a2b2=0
(1)對於橢圓上的點,有F(x, y)=0;
(2)對於橢圓外的點,F(x, y)>0;
(3)對於橢圓內的點,F(x, y)<0。
以弧上斜率為-1的點作為分界將第一象限橢圓弧分為上下兩部分(如圖6所示)。
法向量:
而在下一個點,不等號改變方向,則說明橢圓弧從上部分轉入下部分。
與中點繪制圓演算法類似,一個像素確定後,在下面兩個候選像素點的中點計算一個判別式的值,再根據判別式符號確定離橢圓最近的點。先看橢圓弧的上半部分,具體演算法如下:
假設橫坐標為xp的像素中與橢圓最近點為(xp, yp),下一對候選像素的中點應為(xp+1,yp-0.5),判別式為
,表明中點在橢圓內,應取正右方像素點,判別式變為
若 ,表明中點在橢圓外,應取右下方像素點,判別式變為
判別式 的初始條件確定。橢圓弧起點為(0, b),第一個中點為(1,b - 0.5),對應判別式為
在掃描轉換橢圓的上半部分時,在每步迭代中需要比較法向量的兩個分量來確定核實從上部分轉到下半部分。在下半部分演算法有些不同,要從正上方和右下方兩個像素中選擇下一個像素。在從上半部分轉到下半部分時,還需要對下半部分的中點判別式進行初始化。即若上半部分所選擇的最後一個像素點為(xp, yp),則下半部分中點判別式應在(xp+0.5, yp-1)的點上計算。其在正下方與右下方的增量計算同上半部分。具體演算法的實現請參考下面的程序設計。
程序設計步驟如下。
(1)創建應用程序框架,以上面建立的單文檔程序框架為基礎。
(2)編輯菜單資源。
在工作區的ResourceView標簽中,單擊Menu項左邊"+",然後雙擊其子項IDR_MAINFRAME,並根據表3中的定義添加編輯菜單資源。此時建好的菜單如圖7所示。
表3 菜單資源表
菜單標題 菜單項標題 標示符ID
橢圓 中點畫橢圓 ID_MIDPOINTELLISPE
圖7 程序主菜單
(3)添加消息處理函數。
利用ClassWizard(建立類向導)為應用程序添加與菜單項相關的消息處理函數,ClassName欄中選擇CMyView,根據表4建立如下的消息映射函數,ClassWizard會自動完成有關的函數聲明。
表4 菜單項的消息處理函數
菜單項ID 消 息 消息處理函數
ID_MIDPOINTELLISPE CONMMAN OnMidpointellispe
(4)程序結構代碼如下:
void CMyView:: OnMidpointellispe () //中點演算法繪制橢圓,如圖8所示
{
CDC* pDC=GetDC();
int a=200,b=100,xc=300,yc=200,c=0;
int x,y;
double d1,d2;
x=0;y=b;
d1=b*b+a*a*(-b+0.25);
pDC->SetPixel(x+300,y+200,c);
pDC->SetPixel(-x+300,y+200,c);
pDC->SetPixel(x+300,-y+200,c);
pDC->SetPixel(-x+300,-y+200,c);
while(b*b*(x+1)<a*a*(y-0.5))
{
if(d1<0){
d1+=b*b*(2*x+3);
x++;}
else
{d1+=b*b*(2*x+3)+a*a*(-2*y+2);
x++;y--;
}
pDC->SetPixel(x+xc,y+yc,c);
pDC->SetPixel(-x+xc,y+yc,c);
pDC->SetPixel(x+xc,-y+yc,c);
pDC->SetPixel(-x+xc,-y+yc,c);
}
d2=sqrt(b*(x+0.5))+a*(y-1)-a*b;
while(y>0)
{
if(d2<0){
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++;y--;}
else
{d2+=a*a*(-2*y+3);
y--;}
pDC->SetPixel(x+xc,y+yc,c);
pDC->SetPixel(-x+xc,y+yc,c);
pDC->SetPixel(x+xc,-y+yc,c);
pDC->SetPixel(-x+xc,-y+yc,c);
}
}
實驗一: 直 線
數學上,理想的直線是由無數個點構成的集合,沒有寬度。計算機繪制直線是在顯示器所給定的有限個像素組成的矩陣中,確定最佳逼近該直線的一組像素,並且按掃描線順序,對這些像素進行寫操作,實現顯示器繪制直線,即通常所說的直線的掃描轉換,或稱直線光柵化。
由於一圖形中可能包含成千上萬條直線,所以要求繪制直線的演算法應盡可能地快。本節介紹一個像素寬直線的常用演算法:數值微分法(DDA)、中點畫線法、Bresenham 演算法。
一. DDA(數值微分)演算法
DDA演算法原理:如圖1-1所示,已知過端點 的直線段 ;直線斜率為 ,從 的左端點 開始,向 右端點步進畫線,步長=1(個像素),計算相應的 坐標 ;取像素點 [ , round(y)] 作為當前點的坐標。計算 ,當 ,即當x每遞增1,y遞增k(即直線斜率)。
注意:上述分析的演算法僅適用於k1的情形。在這種情況下,x每增加1, y最多增加1。當 時,必須把x,y地位互換,y每增加1,x相應增加1/k(請參閱後面的Visual C++程序)。
二. 生成直線的中點畫線法
中點畫線法的基本原理如圖1-2所示。在畫直線段的過程中,當前像素點為P,下一個像素點有兩種選擇,點P1或P2。M為P1與P2中點,Q為理想直線與X=Xp+1垂線的交點。當M在Q的下方時,則P2應為下一個像素點;當M在Q的上方時,應取P1為下一點。
中點畫線法的實現:令直線段為L[ p0(x0,y0), p1(x1, y1)],其方程式F(x, y)=ax+by+c=0。
其中,a=y0–y1, b=x1–x0, c=x0y1–x1y0;點與L的關系如下。
在直線上,F(x, y)=0;
在直線上方,F(x, y)>0;
在直線下方,F(x, y)<0。
把M代入F(x, y),判斷F的符號,可知Q點在中點M的上方還是下方。為此構造判別式d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c。
當d < 0,L(Q點)在M上方,取P2為下一個像素。
當d > 0,L(Q點)在M下方,取P1為下一個像素。
當d=0,選P1或P2均可,取P1為下一個像素。
其中d是xp, yp的線性函數。
三. Bresenham演算法
Bresenham演算法是計算機圖形學領域使用最廣泛的直線掃描轉換演算法。由誤差項符號決定下一個像素取右邊點還是右上方點。
設直線從起點(x1, y1)到終點(x2, y2)。直線可表示為方程y = mx+b,其中b=y1–mx1, m = (y2–y1)/(x2–x1)=dy/dx;此處的討論直線方向限於第一象限,如圖1-3所示,當直線光柵化時,x每次都增加1個單元,設x像素為(xi,yi)。下一個像素的列坐標為xi+1,行坐標為yi或者遞增1為yi+1,由y與yi及yi+1的距離d1及d2的大小而定。計算公式為
y = m(xi + 1) + b (1.1)
d1 = y – yi (1.2)
d2=yi+1–y (1.3)
如果d1–d2>0,則yi+1=yi+1,否則yi+1=yi。
式(1.1)、(1.2)、(1.3)代入d1–d2,再用dx乘等式兩邊,並以Pi=(d1–d2),dx代入上述等式,得
Pi = 2xidy–2yidx+2dy+(2b–1)dx (1.4)
d1–d2是用以判斷符號的誤差。由於在第一象限,dx總大於0,所以Pi仍舊可以用做判斷符號的誤差。Pi+1為
Pi+1 = Pi+2dy–2(yi+1–yi)dx (1.5)
求誤差的初值P1,可將x1、y1和b代入式(1.4)中的xi、yi,而得到
P1 = 2dy–dx
綜述上面的推導,第一象限內的直線Bresenham演算法思想如下:
(1)畫點(x1, y1),dx=x2–x1,dy=y2–y1,計算誤差初值P1=2dy–dx,i=1。
(2)求直線的下一點位置xi+1 = xi + 1,如果Pi>0,則yi+1=yi+1,否則yi+1=yi。
(3)畫點(xi+1, yi+1)。
(4)求下一個誤差Pi+1,如果Pi>0,則Pi+1=Pi+2dy–2dx,否則Pi+1=Pi+2dy。
(5)i=i+1;如果i<dx+1則轉步驟(2);否則結束操作。
四. 程序設計
1 程序設計功能說明
為編程實現上述演算法,本程序利用最基本的繪制元素(如點、直線等),繪制圖形。如圖1-4所示,為程序運行主界面,通過選擇菜單及下拉菜單的各功能項分別完成各種對應演算法的圖形繪制。
圖1-4 基本圖形生成的程序運行界面
2 創建工程名稱為「基本圖形的生成」單文檔應用程序框架
(1)啟動VC,選擇「文件」|「新建」菜單命令,並在彈出的新建對話框中單擊「工程」標簽。
(2)選擇MFC AppWizard(exe),在「工程名稱」編輯框中輸入 「基本圖形的生成」作為工程名稱,單擊「確定」按鈕,出現Step 1對話框。
(3)選擇「單個文檔」選項,單擊「下一個」按鈕,出現Step 2對話框。
(4)接受默認選項,單擊「下一個」按鈕,在出現的Step 3~Step 5對話框中,接受默認選項,單擊「下一個」按鈕。
(5)在Step 6對話框中單擊「完成」按鈕,即完成「基本圖形的生成」應用程序的所有選項,隨後出現工程信息對話框(記錄以上步驟各選項選擇情況),如圖1-5所示,單擊「確定」按鈕,完成應用程序框架的創建。
圖1-5 信息程序基本
3 編輯菜單資源
設計如圖1-4所示的菜單項。在工作區的ResourceView標簽中,單擊Menu項左邊「+」,然後雙擊其子項IDR_MAINFRAME,並根據表1-1中的定義編輯菜單資源。此時VC已自動建好程序框架,如圖1-5所示。
表1-1 菜單資源表
菜單標題 菜單項標題 標示符ID
直線 DDA演算法生成直線 ID_DDALINE
Bresenham演算法生成直線 ID_BRESENHAMLINE
中點演算法生成直線 ID_MIDPOINTLINE
4 添加消息處理函數
利用ClassWizard(建立類向導)為應用程序添加與菜單項相關的消息處理函數,ClassName欄中選擇CMyView,根據表1-2建立如下的消息映射函數,ClassWizard會自動完成有關的函數聲明。
表1-2 菜單項的消息處理函數
菜單項ID 消 息 消息處理函數
ID_DDALINE CONMMAN OnDdaline
ID_MIDPOINTLINE CONMMAN OnMidpointline
ID_BRESENHAMLINE CONMMAN OnBresenhamline
5 程序結構代碼,在CMyView.cpp文件中相應位置添加如下代碼:
// DDA演算法生成直線
void CMyView:: OnDdaline()
{
CDC* pDC=GetDC();//獲得設備指針
int xa=100,ya=300,xb=300,yb=200,c=RGB(255,0,0);//定義直線的兩端點,直線顏色
int x,y;
float dx, dy, k;
dx=(float)(xb-xa), dy=(float)(yb-ya);
k=dy/dx, y=ya;
if(abs(k)<1)
{
for (x=xa;x<=xb;x++)
{pDC->SetPixel (x,int(y+0.5),c);
y=y+k;}
}
if(abs(k)>=1)
{
for (y=ya;y<=yb;y++)
{pDC->SetPixel (int(x+0.5),y,c);
x=x+1/k;}
}
ReleaseDC(pDC);
}
說明:
(1)以上代碼理論上通過定義直線的兩端點,可得到任意端點之間的一直線,但由於一般屏幕坐標採用右手系坐標,屏幕上只有正的x, y值,屏幕坐標與窗口坐標之間轉換知識請參考第3章。
(2)注意上述程序考慮到當k1的情形x每增加1,y最多增加1;當k>1時,y每增加1,x相應增加1/k。在這個演算法中,y與k用浮點數表示,而且每一步都要對y進行四捨五入後取整。
//中點演算法生成直線
void CMyView::OnMidpointline()
{
CDC* pDC=GetDC();
int xa=300, ya=200, xb=450, yb=300,c=RGB(0,255,0);
int a, b, d1, d2, d, x, y;
a=ya-yb, b=xb-xa, d=2*a+b;
d1=2*a, d2=2* (a+b);
x=xa, y=ya;
pDC->SetPixel(x, y, c);
while (x<xb)
{ if (d<0) {x++, y++, d+=d2; }
else {x++, d+=d1;}
pDC->SetPixel(x, y, c);
}
ReleaseDC(pDC);
}
說明:
(1)其中d是xp, yp的線性函數。為了提高運算效率,程序中採用增量計算。具體演算法如下:若當前像素處於d>0情況,則取正右方像素P1(xp+1, yp),判斷下一個像素點的位置,應計算d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a;,其中增量為a。若d<0時,則取右上方像素P2(xp+1, yp+1)。再判斷下一像素,則要計算d2 = F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5) + c=d+a+b,增量為a+b。
(2) 畫線從(x0, y0)開始,d的初值d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b,因F(x0, y0)=0,則d0=a+0.5b。
(3)程序中只利用d的符號,d的增量都是整數,只是初始值包含小數,用2d代替d,使程序中僅包含整數的運算。
//Bresenham演算法生成直線
void CMyView::OnBresenhamline()
{
CDC* pDC=GetDC();
int x1=100, y1=200, x2=350, y2=100,c=RGB(0,0,255);
int i,s1,s2,interchange;
float x,y,deltax,deltay,f,temp;
x=x1;
y=y1;
deltax=abs(x2-x1);
deltay=abs(y2-y1);
if(x2-x1>=0) s1=1; else s1=-1;
if(y2-y1>=0) s2=1; else s2=-1;
if(deltay>deltax){
temp=deltax;
deltax=deltay;
deltay=temp;
interchange=1;
}
else interchange=0;
f=2*deltay-deltax;
pDC->SetPixel(x,y,c);
for(i=1;i<=deltax;i++){
if(f>=0){
if(interchange==1) x+=s1;
else y+=s2;
pDC->SetPixel(x,y,c);
f=f-2*deltax;
}
else{
if(interchange==1) y+=s2;
else x+=s1;
f=f+2*deltay;
}
}
}
說明:
(1)以上程序已經考慮到所有象限直線的生成。
(2)Bresenham演算法的優點如下:
① 不必計算直線的斜率,因此不做除法。
② 不用浮點數,只用整數。
③ 只做整數加減運算和乘2運算,而乘2運算可以用移位操作實現。
④ Bresenham演算法的運算速度很快。
② 假設圓的圓心不在原點,試編寫演算法對整個圓進行掃描轉換
掃描轉換是啥意思
③ 在opengl應用框架下圓弧的掃描轉換演算法 怎麼點用輔助函數
在平面解析幾何中,圓的方程可以描述為(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圓心坐標,R是圓的半徑,特別的,當(x0, y0)就是坐標中心點時,圓方程可以簡化為x2 + y2 = R2。在計算機圖形學中,圓和直線一樣,也存在在點陣輸出設備上顯示或輸出的問題,因此也需要一套光柵掃描轉換演算法。為了簡化,我們先考慮圓心在原點的圓的生成,對於中心不是原點的圓,可以通過坐標的平移變換獲得相應位置的圓。
在進行掃描轉換之前,需要了解一個圓的特性,就是圓的八分對成性。
④ 學習計算機圖形學的書籍介紹
目錄
計算機圖形學基礎教程(Visual C++版)
第1章 導論1
1.1 計算機圖形學的應用領域1
1.1.1 計算機輔助設計1
1.1.2 計算機藝術1
1.1.3 虛擬現實3
1.1.4 計算機輔助教學3
1.2 計算機圖形學的概念4
1.3 計算機圖形學的相關學科5
1.4 計算機圖形學的確立和發展5
1.5 圖形顯示器的發展及其工作原理7
1.5.1 陰極射線管7
1.5.2 隨機掃描顯示器8
1.5.3 直視儲存管顯示器8
1.5.4 光柵掃描顯示器9
1.5.5 液晶顯示器13
1.5.6 等離子顯示器15
1.5.7 三維顯示器15
1.6 圖形軟體標準的形成18
1.7 計算機圖形學的最新技術18
1.7.1 交互技術18
1.7.2 造型技術18
1.7.3 真實感圖形顯示技術19
1.8 小結19
習題119第2章 Visual C++6.0繪圖基礎21
2.1 面向對象程序設計基礎21
2.1.1 類和對象21
2.1.2 構造函數和析構函數22
2.1.3 對象的動態建立和釋放24
2.1.4 繼承與派生25
2.2 MFC上機操作步驟28
2.3 基本繪圖函數31
2.3.1 CDC類結構和GDI對象32
2.3.2 映射模式33
2.3.3 CDC類的主要繪圖成員函數34
2.3.4 設備上下文的調用和釋放50
2.3.5 VC++繪制圖形的幾種方法51
2.4 小結52
習題252第3章 基本圖形的掃描轉換55
3.1 直線的掃描轉換55
3.1.1 演算法原理56
3.1.2 構造中點偏差判別式56
3.1.3 遞推公式57
3.2 圓的掃描轉換57
3.2.1 演算法原理58
3.2.2 構造中點偏差判別式59
3.2.3 遞推公式60
3.3 橢圓的掃描轉換60
3.3.1 演算法原理61
3.3.2 構造上半部分I中點偏差判別式62
3.3.3 上半部分I的遞推公式62
3.3.4 構造下半部分II中點偏差判別式64
3.3.5 下半部分II的遞推公式64
3.4 反走樣技術66
3.5 直線距離加權反走樣演算法67
3.5.1 演算法原理67
3.5.2 構造距離判別式69
3.5.3 計算機化69
3.6 小結69
習題369第4章 多邊形填充72
4.1 實面積圖形的概念72
4.1.1 多邊形的定義73
4.1.2 多邊形的表示73
4.1.3 多邊形的填充74
4.1.4 區域填充74
4.2 有效邊表填充演算法75
4.2.1 填充原理75
4.2.2 邊界像素的處理原則75
4.2.3 有效邊和有效邊表76
4.2.4 邊表79
4.3 邊緣填充演算法80
4.3.1 填充原理80
4.3.2 填充過程80
4.4 區域填充演算法82
4.4.1 填充原理82
4.4.2 四鄰接點和八鄰接點82
4.4.3 四連通域和八連通域83
4.4.4 四鄰接點填充演算法和八鄰接點填充演算法84
4.5 小結85
習題485第5章 二維變換和裁剪89
5.1 圖形幾何變換基礎89
5.1.1 規范化齊次坐標89
5.1.2 矩陣相乘89
5.1.3 二維變換矩陣90
5.1.4 二維幾何變換90
5.2 二維圖形基本幾何變換矩陣91
5.2.1 平移變換矩陣91
5.2.2 比例變換矩陣91
5.2.3 旋轉變換矩陣92
5.2.4 反射變換矩陣93
5.2.5 錯切變換矩陣94
5.3 二維復合變換95
5.3.1 復合變換原理95
5.3.2 相對於任一參考點的二維幾何變換95
5.3.3 相對於任意方向的二維幾何變換96
5.4 二維圖形裁剪98
5.4.1 圖形學中常用的坐標系98
5.4.2 窗口和視區及窗視變換99
5.4.3 窗視變換矩陣100
5.5 Cohen-Sutherland直線裁剪演算法101
5.5.1 編碼原理101
5.5.2 裁剪步驟102
5.5.3 交點計算公式102
5.6 中點分割直線裁剪演算法103
5.6.1 中點分割直線裁剪演算法原理103
5.6.2 中點計算公式103
5.7 梁友棟-Barsky直線裁剪演算法103
5.7.1 梁友棟演算法原理103
5.7.2 演算法分析104
5.7.3 演算法的幾何意義104
5.8 小結106
習題5106第6章 三維變換和投影108
6.1 三維幾何變換108
6.1.1 三維變換矩陣108
6.1.2 三維幾何變換108
6.2 三維基本幾何變換矩陣109
6.2.1 平移變換109
6.2.2 比例變換109
6.2.3 旋轉變換110
6.2.4 反射變換111
6.2.5 錯切變換112
6.3 三維復合變換113
6.4 投影變換115
6.4.1 三視圖115
6.4.2 斜等側圖118
6.5 透視變換120
6.5.1 透視變換坐標系120
6.5.2 坐標系變換121
6.5.3 用戶坐標繫到觀察坐標系的變換122
6.5.4 觀察坐標繫到屏幕坐標系的變換124
6.5.5 透視投影分類125
6.6 小結127
習題6128第7章 自由曲線和曲面130
7.1 基本概念130
7.1.1 樣條曲線曲面130
7.1.2 曲線曲面的表示形式130
7.1.3 擬合和逼近131
7.1.4 連續性條件131
7.2 三次參數樣條曲線132
7.2.1 參數樣條曲線定義132
7.2.2 系數求解133
7.2.3 邊界條件133
7.3 Hermite樣條曲線135
7.4 Bezier曲線137
7.4.1 Bezier曲線的定義137
7.4.2 Bezier曲線的性質139
7.4.3 Bezier曲線的可分割性139
7.5 Bezier曲面141
7.5.1 Bezier曲面的定義141
7.5.2 雙三次Bezier曲面的定義141
7.6 B樣條曲線142
7.6.1 B樣條曲線的定義143
7.6.2 二次B樣條曲線143
7.6.3 三次B樣條曲線144
7.6.4 B樣條曲線的性質146
7.6.5 構造特殊的三次B樣條曲線的技巧148
7.7 B樣條曲面149
7.7.1 B樣條曲面的定義149
7.7.2 雙三次B樣條曲面的定義149
7.7.3 雙三次B樣條曲面的連續性150
7.8 小結152
習題7152第8章 分形幾何156
8.1 分形和分維156
8.1.1 分形的誕生156
8.1.2 分形的基本特徵157
8.1.3 分形的定義158
8.1.4 分形維數的定義158
8.2 遞歸模型160
8.2.1 Cantor集160
8.2.2 Koch曲線161
8.2.3 Peano-Hilbert曲線162
8.2.4 Sierpinski墊片、地毯和海綿164
8.2.5 C字曲線168
8.2.6 Caley樹168
8.3 L系統模型169
8.3.1 L系統文法169
8.3.2 Koch曲線170
8.3.3 分形草171
8.3.4 Peano-Hilbert曲線171
8.3.5 分形灌木叢173
8.4 IFS迭代函數系統模型174
8.4.1 仿射變換174
8.4.2 IFS175
8.4.3 Koch曲線178
8.4.4 Sierpinski墊片180
8.4.5 楓葉生成182
8.5 小結183
習題8183第9章 動態消隱187
9.1 圖形的數據結構187
9.1.1 圖形的幾何信息和拓撲信息187
9.1.2 基本圖形的數據結構187
9.1.3 立體表示模型188
9.2 消隱演算法分類190
9.3 隱線演算法190
9.3.1 凸多面體消隱演算法190
9.3.2 曲面體消隱演算法192
9.4 隱面演算法194
9.4.1 Z-Buffer演算法194
9.4.2 畫家演算法197
9.5 小結198
習題9198第10章 真實感圖形201
10.1 顏色模型201
10.1.1 基本概念201
10.1.2 RGB顏色模型202
10.1.3 Gouraud顏色漸變203
10.2 材質模型和光照模型205
10.2.1 物體的材質205
10.2.2 環境光模型206
10.2.3 漫反射光模型206
10.2.4 鏡面反射光模型207
10.2.5 光強的衰減208
10.3 紋理映射209
10.3.1 紋理定義209
10.3.2 紋理映射210
10.4 OpenGL簡介210
10.4.1 案例效果210
10.4.2 TestView.h文件210
10.4.3 TestView.cpp文件213
10.4.4 程序說明220
10.5 小結222
習題10222附錄A 配套實踐教程的案例設置及與本書的對應關系225
⑤ 四道圖像圖像演算法題目
取X=0時,在Y軸上畫點1。
取Y=0時,在X軸上畫點2。
畫直線通過兩點。
你畫的X=0時,Y是幾?自己數手指頭去。
⑥ 詳細論述直線與圓的掃描轉換演算法,並寫出C++的實現代碼。
推薦去CNKI撒,清華搞的撒,那裡面是論文資料庫,可以隨時下載的。你要搞不定的話,去淘寶的///翰林書店///,能下載到論文的
⑦ 計算機圖形學 問題 中點圓演算法和掃描線演算法
寫個文檔解釋一下。
⑧ 跪求一個能畫出彩色花朵的計算機圖形學課程設計源代碼,如圖
目前在電子行業使用比較多的產品主要有ASIC和FPGA,在這兩者之間FPGA是最具有技術優勢的一種產品,並且具有逐漸取代ASIC的趨勢。
ASIC是專用集成電路的英文簡稱。在過去的一段時間中,ASIC設計技術一直是集成電路設計市場的主流。一般說來,ASIC主要針對大批量生產的專用產品,以盡可能的降低生產設計成本。而FPGA由於其良好的可配置特性廣泛應用小批量的產品設計中,尤其是在ASIC的原型驗證階段經常使用FPGA來構建硬體平台。但是隨著FPGA在性能、密度上的提升,以及晶元製造工藝的改進導致的NRE成本激增,使ASIC的市場逐漸被FPGA所佔據。
對於ASIC與沒有使用嵌入式硬核基於LUT的FPGA(圖1-2)而言,ASIC與FPGA的延遲性能大概相差12~14倍,並且該結果針對0.25um~90nm的CMOS工藝都是基本適用的。不考慮性能的情況下,對於實現相同的邏輯功能而言,沒有使用硬核的FPGA比ASIC面積大35倍,動態功耗增加14倍以上。
22fgcfcvg
⑨ 計算機圖形學基礎教程的目錄
第1章 緒論
1.1 計算機圖形學的研究內容
1.2 計算機圖形學發展的歷史回顧
1.3 計算機圖形學的應用及研究前沿
1.3.1 計算機輔助設計與製造
1.3.2 可視化
1.3.3 真實感圖形實時繪制與自然景物模擬
1.3.4 計算機動畫
1.3.5 用戶介面
1.3.6 計算機藝術
1.4 圖形設備
1.4.1 圖形顯示設備
1.4.2 圖形處理器
1.4.3 圖形輸入設備
習題
第2章 光柵圖形學
2.1 直線段的掃描轉換演算法
2.1.1 DDA法
2.1.2 中點畫線法
2.1.3 Bresenham演算法
2.2 圓弧的掃描轉換演算法
2.2.1 圓的特徵
2.2.2 中點畫圓法
2.3 多邊形的掃描轉換與區域填充
2.3.1 多邊形的掃描轉換
2.3.2 區域填充演算法
2.4 字元
2.4.1 點陣字元
2.4.2 矢量字元
2.4.3 字元屬性
2.5 裁剪
2.5.1 直線段裁剪
2.5.2 多邊形裁剪
2.5.3 字元裁剪
2.6 反走樣
2.6.1 提高解析度
2.6.2 區域采樣
2.6.3 加權區域采樣
2.7 消隱
2.7.1 消隱的分類
2.7.2 消除隱藏線
2.7.3 消除隱藏面
習題
第3章 幾何造型技術
3.1 參數曲線和曲面
3.1.1 曲線曲面的表示
3.1.2 曲線的基本概念
3.1.3 插值、擬合和光順
3.1.4 參數化
3.1.5 參數曲線的代數和幾何形式
3.1.6 連續性
3.1.7 參數曲面的基本概念
3.2 Bezier曲線與曲面
3.2.1 Bezier曲線的定義和性質
3.2.2 Bezier曲線的遞推(de Casteljau)演算法
3.2.3 Bezier曲線的拼接
3.2.4 Bezier曲線的升階與降階
3.2.5 Bezier曲面
3.2.6 三邊Bezier曲面片
3.3 B樣條曲線與曲面
3.3.1 B樣條的遞推定義和性質
3.3.2 B樣條曲線的性質
3.3.3 de Boor演算法
3.3.4 節點插入演算法
3.3.5 B樣條曲面
3.4 NURBS曲線與曲面
3.4.1 NURBS曲線的定義
3.4.2 齊次坐標表示
3.4.3 權因子的幾何表示
3.4.4 圓錐曲線的NURBS表洋
3.4.5 NURBS曲線的修改
3.4.6 非均勻有理B樣條(NURBS)曲面
3.5 Coons曲面
3.5.1 基本概念
3.5.2 雙線性Coons曲面
3.5.3 雙三次Coons曲面
3.6 形體在計算機內的表示
3.6.1 引言
3.6.2 形體表示模型
3.6.3 形體的邊界表示模型
3.7 求交分類
3.7.1 求交分類簡介
3.7.2 求交分類策略
3.7.3 基本的求交演算法
3.8 實體造型系統簡介
3.8.1 Parasolid系統
3.8.2 ACIS系統
習題
第4章 真實感圖形學
4.1 顏色視覺
4.1.1 基本概念
4.1.2 三色學說
4.1.3 CIE色度圖
4.1.4 常用的顏色模型
4.2 簡單光照明模型
4.2.1 相關知識
4.2.2 Phong光照明模型
4.2.3 增量式光照明模型
4.2.4 陰影的生成
4.3 局部光照明模型
4.3.1 理論基礎
4.3.2 局部光照明模型
4.4 光透射模型
4.4.1 透明效果的簡單模擬
4.4.2 Whitted光透射模型
4.4.3 Hall光透射模型
4.4.4 簡單反射透射模型
4.5 紋理及紋理映射
4.5.1 紋理概述
4.5.2 二維紋理域的映射
4.5.3 三維紋理域的映射
4.5.4 幾何紋理
4.6 整體光照明模型
4.6.1 光線跟蹤演算法
4.6.2 輻射度方法
4.7 實時真實感圖形學技術
4.7.1 層次細節顯示和簡化
4.7.2 基於圖像的繪制技術
習題
第5章 圖形標准
5.1 Open GL
5.1.1 Open GL概述
5.1.2 Open GL程序結構
5.1.3 基本幾何元素
5.1.4 坐標變換
5.1.5 光照處理
5.2 VRML
5.2.1 VRML簡介
5.2.2 線性變換
5.2.3 場景交互
5.2.4 VRML節點
5.2.5 VRML展望
習題
附錄A 計算機圖形學的數學基礎
附錄B 圖形的幾何變換
附錄C 形體的投影變換
參考文獻