計算機圖形學學習心得【新版多篇】

計算機圖形學學習心得【新版多篇】

計算機圖形學學習心得 篇一

一、實驗目的

瞭解樑友棟算法和編碼裁剪算法並利用該算法思想實現某一圖形或直線段的裁剪,加深對樑友棟算法和編碼裁剪算法的理解。

二、實驗內容

利用樑友棟算法(參數化線段裁剪算法)或編碼裁剪算法變成實現對直線段或者任一圖形的裁剪。

三、實驗原理

樑友棟算法簡介如下:

設線段兩端點座標分別為P1(x1,y1)和P2(x2,y2),則其參數化直線方程可寫成下列形式:

0≤u≤1

當u=0時,得點P1,當u=1時,得點P2。線段的裁剪條件可以由下面的不等式表示: Wxl≤x1﹢uΔx≤Wxr;Wyb≤y1﹢uΔy≤Wyt

這四個不等式可以表示為:upk≤qk k=1,2,3,4

其中,參數p,q定義為:

p1﹦-Δx, q1﹦x1﹣Wxl

p2﹦Δx, q2﹦Wxr﹣x1

p3﹦-Δy, q3﹦y1﹣Wyb

p4﹦Δy, q4﹦Wyt﹣y1

下標k=1,2,3,4分別對應裁剪窗口的左、右、下、上四條邊界線。如果線段平行於裁剪窗口的某兩邊界,則必有相應的pk﹦0,如果還滿足qk<0,則線段的端點位於窗口外部,即線段在窗口外,應該捨棄。如果qk≥0,線段在窗口內。當pk<0時,直線是從裁剪窗口第k條邊界線的外部延伸到內部。當pk>0時,直線是從裁剪窗口第k條邊界線的內部延伸到外部。當pk不等於零時,可以計算出線段與第k條裁剪窗口邊界線的交點參數: 根據定義,對於每條線段,pk中必有兩個小於零,而另兩個大於零。對於小於零的pk,直線同第k條裁剪窗口邊線是從外到內相遇的,此時如果線段同第k條裁剪窗口邊界線有交點的話,是參數u從0變大時遇到的,這時計算出相應的rk值,取0和各個rk值之中的最大值記為u1。與此相反,對於大於零的pk,計算出相應的rk值,取1和各個rk值之中的最小值記為u2。兩個參數u1和u2定義了在裁剪窗口內的線段部分。如果u1>u2,則線段完全落在裁剪窗口之外,應被捨棄。否則被裁剪線段可見部分的端點由參數u1和u2計算出來。

四、實驗環境

Windows XP VisualC++6.0

五、實驗步驟

進入VisualC++6.0環境,在菜單中選擇“FileàNewàProjects”,然後選擇“MFCAppWizard(exe)”新建一個工程文件單擊“OK”,在彈出的對話框中選擇“Single document”,單擊“Finish”,在VisualC++6.0編程界面中選擇CMyView單擊右鍵,選擇“Add Member Function”,在彈出的對話框中添寫“void”和函數名。

// 圖形裁減 : implementation of the CMyView class

//

#include “stdafx.h”

#include “圖形裁減。h”

#include “圖形裁減Doc.h”

#include “圖形裁減View.h”

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CMyView

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)

//{{AFX_MSG_MAP(CMyView)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// Standard printing commands

ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)

END_MESSAGE_MAP

/////////////////////////////////////////////////////////////////////////////

// CMyView construction/destruction

CMyView::CMyView

{

// TODO: add construction code here

}

CMyView::~CMyView

{

}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)

{

// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);

}

/////////////////////////////////////////////////////////////////////////////

// CMyView drawing

void CMyView::OnDraw(CDC* pDC)

{

CMyDoc* pDoc = GetDocument;

ASSERT_VALID(pDoc);

LINECLIP;

// TODO: add draw code for native data here

}

/////////////////////////////////////////////////////////////////////////////

// CMyView printing

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)

{

// default preparation

return DoPreparePrinting(pInfo);

}

void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

// TODO: add extra initialization before printing

}

void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

// TODO: add cleanup after printing

}

/////////////////////////////////////////////////////////////////////////////

// CMyView diagnostics

#ifdef _DEBUG

void CMyView::AssertValid const

{

CView::AssertValid;

}

void CMyView::Dump(CDumpContext& dc) const

{

CView::Dump(dc);

}

CMyDoc* CMyView::GetDocument // non-debug version is inline

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));

return (CMyDoc*)m_pDocument;

}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////

// CMyView message handlers

void CMyView::LINECLIP

{

//使用樑友棟-Basky直線裁剪算法

CDC* pDC=GetDC;//取得繪圖設備環境上下文指針

//設置不同顏色畫筆

CPen newpen1(PS_SOLID,0,RGB(183,198,0));//窗口顏色

CPen newpen2(PS_SOLID,0,RGB(0,0,1));//待裁剪線段顏色

CPen newpen3(PS_SOLID,0,RGB(160,1,255));//裁剪後可見線段顏色

//輔助變量

float p[4],q[4],u[4];

float u1,u2,r[4];

int x1,y1,x2,y2,x0,y0,x3,y3;

int dx,dy,k;

int wxl=300,wxr=450,wyb=100,wyt=400;

//繪製裁剪窗口

pDC->SelectObject(&newpen1);

pDC->Rectangle(wxl,wyt,wxr,wyb);

x1=100;

y1=200;

x2=600;

y2=400;

//繪製被裁剪線段

pDC->SelectObject(&newpen2);

pDC->MoveTo(x1,y1);

pDC->LineTo(x2,y2);

//計算

dx=x2-x1;

dy=y2-y1;

p[0]=(float)-dx;

p[1]=(float)dx;

p[2]=(float)-dy;

p[3]=(float)(dy);

q[0]=(float)(x1-wxl);

q[1]=(float)(wxr-x1);

q[2]=(float)(y1-wyb);

q[3]=(float)(wyt-y1);

for(k=0;k<4;k++)

{

if ((p[k]==0))//垂直或水平線段,由不為0的另外兩個參數確定可見部分

{

u[k]=1000;

}

else

{

r[k]=q[k]/p[k];

if(p[k]<0)

u[k]=(0>r[k])?0:r[k];//取用0與r[k]中的大值

else

u[k]=(r[k]<1)?r[k]:1;//取用1與r[k]中的小值

}

}

//參數在0-1之間變化,超出為無效參數

u1=0.0;

u2=1.0;

for(k=0;k<4;k++)

{

if(p[k]<0)

u1=(u[k]>u1)?u[k]:u1;//取用0與u[k]中的大值

else

u2=(u[k]

}

//滿足條件為可見部分線段

if(u1<=u2)

{

//計算可見部分線段

x0=(int)(x1+u1*dx);

y0=(int)(y1+u1*dy);

x3=(int)(x1+u2*dx);

y3=(int)(y1+u2*dy);

//繪製窗口內可見線段

pDC->SelectObject(&newpen3);

pDC->MoveTo(x0,y0);

pDC->LineTo(x3,y3);

}

}

六、實驗結果與分析

本圖中矩形內紫色線段為裁剪之後可見線段,外部的黑色線段部分為帶裁剪部分。

七、實驗中遇到的問題及解決方法

1.對於VisualC++6.0的工程文件即:MFC的環境不熟悉,開始時編寫視圖View下的程序在步驟上尚有困難,不知道該怎樣使用該環境,再參考了一些相關書籍和求教於其他人之後,這個問題得到了解決。

2.最初只是在後面添加了自編程序,並沒有在“OnDraw”裏面加入該程序的調用,程序編譯沒有錯誤,但運行後只是一個窗口,並沒有圖像,後來在同學的幫助下發現了這個錯誤,改正後程序順利運行。

3.程序編寫過程中的語法不再是問題,偶爾有疏忽的時候,編譯時一般就能改正了。

4.在程序編寫時對於點的座標值不是很注意,隨意定義了一些點,造成直線畫到了圖形的外面。

計算機圖形學學習心得 篇二

計算機圖形學是利用計算機研究圖形的表示、生成、處理和顯示的科學。簡單地説,計算機圖形學的主要研究內容就是研究如何在計算機中表示圖形、以及利用計算機進行圖形的計算、處理和顯示的相關原理與算法。圖形通常由點、線、面、體等幾何元素和灰度、色彩、線型、線寬等非幾何屬性組成。從處理技術上來看,圖形主要分為兩類,一類是基於線條信息表示的,如工程圖、等高線地圖、曲面的線框圖等,另一類是明暗圖,也就是通常所説的真實感圖形。經過30多年的發展,計算機圖形學已成為計算機科學中最為活躍的分支之一,並得到廣泛的應用。

在科技高度發展的今天,計算機在人們之中的作用越來越突出。而C語言作為一種計算機的語言,我們學習它,有助於我們更好的瞭解計算機,更好的學習計算機圖形學。因此,C語言對我們計算機圖形學的學習尤其重要,而我們也需要一定的C語言基礎知識。

在這個學期裏,我們班級的學生在計算機圖形學老師何老師的帶領下進行了計算機圖形學的上機實踐學習。在這之前,我們已經對C語言這門課程學習了一個學期,對其有了一定的瞭解和掌握,這對我們計算機圖形的學習打下了良好的基礎。但是,萬事開頭難,在計算機圖形學的上機實踐的過程中還是遇到了一些問題。

上機實驗是學習計算機圖形學必不可少的實踐環節,上課學習到的知識都需要通過C語言編程做出程序來真正掌握它。對於計算機圖形學的學習目的,可以概括為圖形的表示、圖形的生成、圖形的處理和顯示,這些都必須通過充分的實際上機操作才能完成。我們上機實驗總共包括七個, 每個實驗之前老師都會給我們做詳細的介紹,具體的操作步驟老師也給了一個參考書,這樣的話,我們在上機過程中也省去了很多麻煩,節約了很多時間。因此,我們才有了充裕的時間來理解實驗原理,並結合自己的想象力,編寫出屬於自己的程序。

學習計算機圖形學除了課堂講授以外,必須保證有不少於課堂講授學時的上機時間。因為學時所限,課程安排在週四晚上統一上機實驗,所以我們需要有效地利用上機實驗的機會,儘快掌握理解計算機圖形學的基礎知識,為今後的繼續學習打下一個良好的基礎。課程上機實驗的目的,不僅僅是驗證教材和講課的內

容、檢查自己所編的程序是否正確,課程安排的上機實驗的目的可以概括為如下幾個方面:

加深對課堂講授內容的理解

課堂上要講授許多關於計算機圖形學的知識和原理,聽起來十分枯燥無味,也不容易記住,死記硬背是不可取的。然而要使用C程序這個工具解決實際學習中的問題,通過多次上機練習,,在理解的基礎上就會自然而然地掌握計算機圖形學圖形生成的算法和處理方式。對於一些內容自己認為在課堂上聽懂了,但上機實踐中會發現原來理解的偏差,編寫出來的程序無法運行,這是由於大部分學生C語言基礎只是不夠牢固的原因。

學習計算機圖形學不能停留在學習它的程序語言,而是利用學到的知識編寫C語言程序來驗證自己的想法,深入理解圖形生成的原理,解決實際問題。即把C語言作為工具,描述解決實際問題的步驟,由計算機幫助我們解題。只有通過上機才能檢驗自己是否掌握C語言、自己編寫的程序是否能夠正確運行、對計算機的理解是否到位。

通過上機實驗來驗證自己編制的程序是否正確,恐怕是大多數同學在完成老師作業時的心態。但是在程序設計領域裏這是一定要克服的傳統的、錯誤的想法。因為在這種思想支配下,可能你會想辦法去“掩蓋”程序中的錯誤,而不是儘可能多地發現程序中存在的問題。而且計算機圖形學上機實驗是依附在C語言編程基礎之上的,我們對圖形生成算法的理解要通過C程序才能體現出來。

通過這次為數不多的幾天計算機實踐學習,我們鞏固了一些關於C語言的知識,理解了我們計算機圖形學的理論知識,這對我們將來到社會工作將會有莫大的幫助。同時它讓我知道計算機圖形的強大和瑰麗之處,雖然我們學的都是基本的生成算法,但是通過老師展示的幾個計算機圖形學高級程序,我們才瞭解到計算機圖形學可以做出非常華麗的視覺效果,而且只要你努力,任何東西都不會太難。

最後,還是很慶幸能學到計算機圖形學這樣的一門課程,在學習本課程的同時,已經涉及了很多的學科,讓我們更有能力成為全方位、多特色的新世紀人才。編程能力、思維能力都獲得了提高,真是一舉多得。

計算機圖形學學習心得 篇三

計算機圖形學是20世紀60年代以後,隨着計算機技術(包括計算機硬件技術和軟件技術)的發展和完善而形成的一門新興學科。至今,計算機圖形學已在建築,機械,電子,造船,航空,汽車,輕工,廣告,藝術等領域得到了廣泛的應用。可以説,它幾乎影響了所有涉及領域,衝擊和改變着傳統的設計模式。一打開計算機,人們首先接觸到的就是計算機圖形學的內容,因為計算機的用户界面已廣泛使用了計算機圖形技術。事實上,計算機圖形技術已深入到各個領域。計算機圖形的生成一般包括兩種方法:程序繪圖和交互繪圖。所謂程序繪圖,就是先用計算機語言(例如C語言)編好繪圖程序,然後運行該程序並繪出圖形。而交互繪圖則是應用交互式圖形軟件,通過交互命令(鍵盤命令,菜單命令等)由計算機生成圖形。程序繪圖是交互式繪圖的基礎。

簡單地説,計算機圖形學的主要研究內容就是研究如何在計算機中表示圖形、以及利用計算機進行圖形的計算、處理和顯示的相關原理與算法。圖形通常由點、線、面、體等幾何元素和灰度、色彩、線型、線寬等非幾何屬性組成。從處理技術上來看,圖形主要分為兩類,一類是基於線條信息表示的,如工程圖、等高線地圖、曲面的線框圖等,另一類是明暗圖,也就是通常所説的真實感圖形。 計算機圖形學一個主要的目的就是要利用計算機產生令人賞心悦目的真實感圖形。為此,必須建立圖形所描述的場景的幾何表示,再用某種光照模型,計算在假想的光源、紋理、材質屬性下的光照明效果。所以計算機圖形學與另一門學科計算機輔助幾何設計有着密切的關係。事實上,圖形學也把可以表示幾何場景的曲線曲面造型技術和實體造型技術作為其主要的研究內容。同時,真實感圖形計算的結果是以數字圖像的方式提供的,計算機圖形學也就和圖像處理有着密切的關係。

這學期我們主要學習了MFC圖形編程,學習了《 VC++圖形程序設計基礎》。從中學習瞭如何建立MFC項目和簡單的輸入與輸出。

三視圖即主視圖、俯視圖、側視圖是分別將三維立體對正面、水平面和側面作正投影得到的三個基本視圖。

用計算機繪製立體圖的三視圖的具體步驟:

建立三維空間座標系,這裏定義一個右手直角座標系,即z軸正向朝上。在這個定義的座標系下,確定三維立體上各點的位置座標,同時引入 齊次座標。 求出所作變換相應的四階變換矩陣,一般根據變換前後圖形上點的幾何關係或由已知的變換矩陣求得。

將所作變換寫出矩陣表示式,通過運算求得三維立體上各點(x, y, z)竟變換後的相應點(x’ , y’)或(y’ , z’)或(x’ , z’),一般是二維點的齊次座標。

有變換後的所有二維點繪出三維立體投影后的平面圖形,即為主視圖、俯視圖或側視圖。

在右手直角座標系中,將三維立體向xOz面(正面V)作正投影,得到主視圖。由投影變換前後三維立體上點到主視圖上點的關係,可知此投影變換的變換矩陣為:

⎡1⎢0

Tv=⎢⎢0 ⎢⎣0 000000100⎤0⎥⎥0⎥⎥1⎦

Tv:主視圖的投影變換矩陣,簡稱投影矩陣。

若已知三維立體上 n 個點(xi , yi , zi),則各點的齊次座標可寫成 n⨯4 階矩陣,主視圖的投影變換矩陣表示式為:

⎡x1y1z11⎤⎡1000⎤⎡x10z11⎤⎢⎥⎢x0z1⎥ ⎢x2y2z21⎥⎢2⎥⎢2⎥0000⎥=⎢⋅⋅⋅⋅⎥ ⎢⋅⋅⋅⋅⎥⋅⎢

⎥⎢0010⎥⎢⎥ ⎢⋅⋅⋅⋅⋅⋅⋅⋅⎢⎥⎢⎥⎢⎥ ⎢xyz1⎥⎣0001⎦⎢x0z1⎥nnn⎣n⎦⎣n⎦

在繪圖時,只要取x=xi , y=zi (i=1,2,…,n),,就可在屏幕上繪出三維立體的主視圖

三維立體向xOy面(水平面H)作正投影得到俯視圖。

其投影變換矩陣: ⎡1000⎤ ⎢0100⎥' ⎥T=⎢⎢0000⎥ ⎢⎥ 0001⎣⎦

為了使俯視圖與主視圖也畫在一個平面內,就要使H面繞x軸負方向轉90o,此旋轉變換矩陣為:

⎡1000⎤⎢00-10⎥ ⎥Tx=⎢ ⎢0100⎥ ⎢⎥0001⎦⎣

為了使俯視圖與主視圖間有一定的間距,還要使H面沿負z方向平移一段距離z0。其變換矩陣為: ⎡1000⎤ ⎢0100⎥ ⎥T=⎢⎢0010⎥ ⎢⎥ ⎣00-z01⎦

因此俯視圖的投影變換矩陣為上面三個變換矩陣的連乘積,即:

⎡1000⎤⎡1000⎤⎡1000⎤ ⎥⎢⎥⎢⎥⎢ T=T'⋅T⋅T=⎢0100⎥ ⋅ ⎢00-10⎥⋅⎢0100⎥Hx⎢0000⎥⎢0100⎥⎢0010⎥ ⎥⎢⎥⎢⎥⎢ 00-z100010001⎣⎦⎣⎦⎣0⎦ ⎡1000⎤ ⎢00-10⎥⎥ =⎢⎢0000⎥ ⎢⎥00-z1 0⎣⎦

俯視圖的投影變換矩陣表示為:

⎡x1y1z11⎤⎡x10(-y1-z0)1⎤⎢xyz1⎥⎡1000⎤⎢x0(-y-z)1⎥ 2220⎢2⎥⎢00-10⎥⎢2⎥ ⎥=⎢⋅⋅⎢⋅⋅⋅⋅⎥⋅⎢⋅⋅⎥⎢⎥0000 ⎢⎥⎢⎥⋅⋅⋅⋅⋅⋅⋅⋅⎢⎥⎢⎥00-z1⎢⎥ 0⎣⎦⎢⎢⎣xnynzn1⎥⎦⎣xn0(-yn-z0)1⎥⎦

由此得到三維立體的俯視圖上n個點(xi , -yi-z0) (i=1,2,…,n),取x=xi , y=-yi-z0(i=1,2,…,n),便可繪出三維立體的俯視圖。

將三維立體向yOz面(側面W)作正投影得到俯視圖。

其投影變換矩陣: ⎡0000⎤ ⎢0100⎥' ⎥T=⎢⎢0010⎥ ⎢⎥ 0001⎣⎦為了使俯視圖與主視圖都畫在一個平面內,就要使W面繞z軸轉90o,此旋轉變換矩陣為:

⎡0100⎤⎢-1000⎥⎥Tz=⎢⎢0010⎥⎢⎥0001⎣⎦

第3 / 4頁

為了使側視圖與主視圖間有一定的間距,還要使W面沿負x方向平移一段距離x0。其變換矩陣為:

⎡1000⎤⎢0100⎥ ⎥T=⎢ ⎢0010⎥ ⎢⎥-x0001⎦⎣

因此側視圖的投影變換矩陣為上面三個變換矩陣的連乘積,即:

⎡0000⎤⎡0100⎤⎡1000⎤⎢0100⎥⎢-1000⎥⎢0100⎥ ⎥⎥ ⋅ ⎢⎥⋅⎢Tw=⎢ ⎢0010⎥⎢0010⎥⎢0010⎥ ⎥⎢⎥⎢⎥⎢0001⎦⎣0001⎦⎣-x0001⎦⎣

⎡0000⎤ ⎢-1000⎥ ⎥ =⎢ ⎢0010⎥⎢⎥ -x0010⎣⎦ ⎡x1y1z11⎤⎡(-y1-x0)0z11⎤ 0000⎡⎤⎢xyz1⎥⎢(-y-x)0z1⎥

2222 ⎢⎥⎢-1000⎥⎢20⎥⎢⎥⎢⋅=⎢⋅⋅⋅⋅⎥⋅⋅⋅⋅⎥ ⎢⎥0010⎢⎥⎢⎥ ⋅⋅⋅⋅⋅⋅⋅⋅⎢⎥⎢-x001⎥⎢⎥0⎣⎦ ⎢⎢⎣xnynzn1⎥⎦⎣(-yn-x0)0zn1⎥⎦

由此得到三維立體的側視圖上n個點(-yi-x0 , zi) (i=1,2,…,n),取x= -yi-x0, y=-zi(i=1,2,…,n),便可繪出三維立體的側視圖。

先讓三維立體作投影面,然後旋轉投影面得到平攤在同一個平面上的三個視圖。也可以先把三維立體作旋轉,然後再向投影面作正投影得到同樣的三視圖。

通過這這們課的學習,讓我對計算機的應用有了更新的認識,對於圖形學中基本圖形的生成算法有了一定的瞭解,圖形學是計算機科學與技術學科的活躍前沿學科,被廣泛的應用到生物學、物理學、化學、天文學、地球物理學、材料科學等領域。我深深感到這門學科涉及的領域之廣是驚人的,可以説博大精深。在這個計算機的時代什麼都要用到計算機技術,圖形也是我們生活中重要的部分,好學好圖形學為我以後的就業課成學習及新興科學技術的運用打下了堅實基礎。更為我以後的就業打下了堅實的良好基礎,使我對未來充滿了信心。感謝向華萍老師對我們的認真指導。