計算機圖形學學習心得

  計算機圖形學是20世紀60年代以後,隨著計算機技術***包括計算機硬體技術和軟體技術***的發展和完善而形成的一門新興學科。下面是小編為大家收集整理的,歡迎大家閱讀。

  篇1

  一、實驗目的

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

  二、實驗內容

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

  三、實驗原理

  樑友棟演算法簡介如下:

  設線段兩端點座標分別為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”和函式名。

  // 圖形裁減View.cpp : 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.在程式編寫時對於點的座標值不是很注意,隨意定義了一些點,造成直線畫到了圖形的外面。

  篇2

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

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

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

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

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

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

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

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

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

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

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

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

  篇3

  計算機圖形學是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***,便可繪出三維立體的側檢視。

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

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