2020年計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書_第1頁
2020年計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書_第2頁
2020年計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書_第3頁
2020年計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書_第4頁
2020年計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

[]第一章計(jì)算機(jī)圖形學(xué)的軟件開發(fā)環(huán)境

計(jì)算機(jī)圖形學(xué)中的程序都是用C語言編寫的,

TurboC和VisualC++常見的兩種C語言開發(fā)環(huán)境,

TurboC是在Dos環(huán)境下開發(fā),而VisualC++是在

Windows環(huán)境下開發(fā)。

1.1、在TurboC環(huán)境下開發(fā)應(yīng)用程序

一些高級語言都擴(kuò)充了圖形功能,這使得用戶能

夠不需配備專門的圖形軟件,就能在計(jì)算機(jī)上進(jìn)行圖

形工作。TurboC2.0包含有460多個(gè)庫函數(shù),其中

有70多個(gè)圖形函數(shù),這些函數(shù)包括了繪圖、處理圖

象及圖素、屏幕及視圖區(qū)控制、顏色及線型設(shè)置、狀

態(tài)查詢和出錯(cuò)處理等,這使得TurboC具有很強(qiáng)的圖

形功能。

1.圖形顯示器的工作方式

IBMPC機(jī)的顯示器能夠在兩種基本視頻方式下

工作:一種是文本方式;另一種是圖形方式。

(1)文本方式

在文本方式下,屏幕上能夠顯示的最小單位是字

符,字符在屏幕上以行、列排列,即我們一般見到的

情況。文本方式不同,屏幕上所顯示字符的行數(shù)和列

數(shù)也不一樣,顏色也會有所區(qū)別。TurboC支持6種

不同的文本顯示方式。

(2)圖形方式

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

在圖形方式下,屏幕上能夠控制的最小單元稱作

像素(pixel),它是組成圖形的基本元素,一般

叫作“點(diǎn)”。一般把屏幕上所包含像素的個(gè)數(shù)叫做分

辨率。分辨率越高,顯示的圖形越細(xì)致、質(zhì)量越好,

這是顯而易見的。在圖形方式下,屏幕上每個(gè)像素的

顯示位置用點(diǎn)坐標(biāo)系來描述。在該坐標(biāo)系中,屏幕左

上角為坐標(biāo)系的原點(diǎn),坐標(biāo)值為(0,0);水平

方向?yàn)閄軸,自左向右;垂直方向?yàn)閅軸,自上向下。

見下圖。

(0,0)XmaxX

Y

''maxY

點(diǎn)坐標(biāo)系中坐標(biāo)值的范圍決定于所用顯示器的

分辨率。分辨率不同,水平方向上和垂直方向上的點(diǎn)

數(shù)也不同,即其maxx、maxy的數(shù)值不同。就我們

常見的VGA顯示器來說,它一般所用的分辨率為

6405480,即它的maxx值為639,maxy的值為

479o

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

2.圖形函數(shù)及其用法

TurboC的圖形函數(shù)均在一個(gè)頭文件

"graphics,h"中定義。因此,凡是在程序中要調(diào)

用這些圖形函數(shù),都必須在源程序的開頭寫上文件包

含命令:

#include<graphics.h>

(1)圖形系統(tǒng)管理

在一般默認(rèn)情況下,顯示器處于文本方式下。在

文本方式下,所有的圖形函數(shù)均不能應(yīng)用。因此在調(diào)

用圖形函數(shù)繪圖之前,必須先將顯示器設(shè)置為圖形模

式,這就是一般所說的圖形方式初始化。在圖形工作

完畢之后,又要使顯示器回到文本方式,以便進(jìn)行程

序文件等的編輯工作。

?圖形方式初始化

圖形方式初始化經(jīng)過函數(shù)initgraph來實(shí)現(xiàn),

它的功能是經(jīng)過從磁盤上裝入一個(gè)圖形驅(qū)動程序來

初始化圖形系統(tǒng),并將系統(tǒng)設(shè)置為圖形模式。其調(diào)用

格式為:initgraph(int*gdriver,int*gmode,char

*path);

調(diào)用該函數(shù)需用的三個(gè)參數(shù)含義為:

gdriver:是一個(gè)整型值,用來指定裝入的驅(qū)動程

序名。

gmode:是一個(gè)整型值,用來設(shè)置圖形顯示模式。

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

path:是一個(gè)字符串,用來指明驅(qū)動程序所在的路

徑。

舉例:假設(shè)使用VGA顯示器,圖形顯示模式為

VGAHI,即高分辨率圖形模式,分辨率為6405480。

則初始化調(diào)用方式如下:

intgdriver=VGA,gmode=VGAHI;

initgraph(&gdriver,&gmode,"c:\\tc");

?關(guān)閉圖形模式

在運(yùn)行圖形程序結(jié)束后,應(yīng)及時(shí)關(guān)閉圖形模式,

回到文本方式,以進(jìn)行其它工作。關(guān)閉圖形模式用函

數(shù)closegraph,其調(diào)用方法為:

closegraph();(該函數(shù)不需參數(shù))

(2)繪圖函數(shù)

從理論上來說,用像素點(diǎn)幾乎能夠畫出任何圖

形,但畢竟是效率太低。為此,TurboC的BGI提

供了一些基本的繪圖函數(shù),以方便圖形設(shè)計(jì)。所有繪

圖函數(shù)調(diào)用時(shí)的參數(shù),其類型均為整型,因此填入?yún)?/p>

數(shù)表的參數(shù),應(yīng)為整數(shù)或整型變量

putpixeI函數(shù):將指定的顏色寫到由坐標(biāo)x,y所

確定的點(diǎn)。如putpixel(x,y,GREEN);

Iine函數(shù):在指定兩點(diǎn)之間畫直線。如:line(xl,

yl,x2,y2);

Iineto函數(shù):從當(dāng)前點(diǎn)畫線到指定點(diǎn)。如:lineto

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

moveto函數(shù):把當(dāng)前點(diǎn)移到指定點(diǎn)(不畫線)。如:

moveto(x,y)

circle函數(shù):指定圓心和半徑畫圓。如:circle

(xc,yc,r);

arc函數(shù):畫一段圓弧。要求指定圓弧所在圓的圓

心、半徑,以及圓弧的起始角和終止角。

如:arc(xc,yc,angs,ange,r);

rectangle函數(shù):指定矩形的兩對角點(diǎn)畫一個(gè)矩

形。如:rectangle(xl,yl,x2,y2);

drawpoly函數(shù):畫一條任意多邊折線。如:

drawpoly(nps,xy);其中,nps為多邊折線的

頂點(diǎn)數(shù);xy為存放頂點(diǎn)坐標(biāo)值的數(shù)組名。如果首尾

兩點(diǎn)重合,則能夠繪制一個(gè)任意多邊形。

(3)圖形屬性控制

圖形的屬性指顏色和線型,顏色又有背景色和前

景色之分。背景色指的是屏幕的顏色,即底色;前景

色指的是繪圖用的顏色。任何繪圖函數(shù)都是在當(dāng)前顏

色(背景色和前景色)和線型的狀態(tài)下作圖的。系統(tǒng)

的默認(rèn)值為:背景色為黑色;前景色為白色;線型為

實(shí)線。

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

?setbkcolor函數(shù):設(shè)置背景顏色。如:setbkcolor

(COLORNAME);

setcolor函數(shù):設(shè)置前景顏色。(用法同上)

setIinestyIe函數(shù):設(shè)置線型。如:setlinestyle

(LSTY,0,WIDTH);

(4)繪圖程序簡例

#include<graphics.h>

main()

|

/*DETECT的含義是自動檢測當(dāng)前顯示器的類型,且選用最大可能的分辨率模式*/

intgd=DETECT,gm;initgraph(&gd,&gm,

“f:\\tc");

setbkcolor(LIGHTBLUE);

setcolor(RED);

circle(320,240,100);

/*getch()的含義是讀入一個(gè)字符,但不回顯在窗口中,加入這句語句的目的是防止顯示的圖像很快消失*/

getch();

closegraph();

)

1.2、在VisualC++環(huán)境下開發(fā)應(yīng)用程序

一.Windows編程基礎(chǔ)

VisualC++是可視化開發(fā)系統(tǒng),一般而言,可視

化開發(fā)系統(tǒng)集成了一系列系統(tǒng)可用資源和開發(fā)工具:

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

程序調(diào)試工具包括源程序語法檢查、可執(zhí)行程序修改

和運(yùn)行監(jiān)視等;可選擇并構(gòu)成具體語句或源程序結(jié)構(gòu)

的例程庫及Help;資源管理器包括圖形化窗口及組成

元素的多種對象的編輯器;應(yīng)用程序Help和Setup

開發(fā)工具包,源程序編輯器和編譯器;系統(tǒng)函數(shù)庫和

系統(tǒng)函數(shù)開發(fā)工具。

在Windows的程序設(shè)計(jì)語言中,VC、VB、VJ都

是“面向?qū)ο蟆钡某绦蛟O(shè)計(jì)語言。對象是Windows的

規(guī)范部件:窗口、菜單、按鈕、對話框、程序模塊都

是對象。編寫Windows程序相當(dāng)一部分工作是在創(chuàng)立

對象和為對象屬性賦值。對象具有規(guī)范形態(tài)和操作模

式的特征。

在用vc進(jìn)行編程時(shí)有兩種方法:傳統(tǒng)的編程方法

方法和交互式編程方法。傳統(tǒng)的編程方法是采用直接

調(diào)用API的方法進(jìn)行編程,API是Win系統(tǒng)與Win應(yīng)

用程序間的標(biāo)準(zhǔn)程序接口,API為應(yīng)用程序提供

Windows系統(tǒng)特殊函數(shù)及數(shù)據(jù)結(jié)構(gòu),而且Win應(yīng)用程

序能夠利用標(biāo)準(zhǔn)大量API函數(shù)調(diào)用系統(tǒng)功能。API函

數(shù)的功能包括:窗口管理函數(shù)實(shí)現(xiàn)窗口的創(chuàng)立、移動

和修改功能;系統(tǒng)服務(wù)函數(shù):實(shí)現(xiàn)與操作系統(tǒng)有關(guān)的

多種功能;圖形設(shè)備(GDI)函數(shù):實(shí)現(xiàn)與設(shè)備無關(guān)的

圖形操作功能。交互式編程方法是采用MFC的方法進(jìn)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

行編程。采用交互式方法時(shí),可視化開發(fā)平臺給出了

許多選用的對象,程序員可選擇所需對象并確定其屬

性,由此搭建起應(yīng)用程序的“大框架”,并可根據(jù)需

要進(jìn)一步編寫必要的細(xì)節(jié)代碼段,最后構(gòu)成完整的應(yīng)

用程序。

利用WindowsAPI函數(shù)編寫Windows應(yīng)用程序必須

首先了解以下內(nèi)容:

(1)窗口的概念

(2)事件驅(qū)動的概念

⑶句柄

(4)消息

(D窗口

一個(gè)應(yīng)用程序的窗口一般包含下列成分:

編寫一個(gè)Windows應(yīng)用程序首先應(yīng)創(chuàng)立一個(gè)或多個(gè)

窗口,隨后應(yīng)用程序的運(yùn)行過程即是窗口內(nèi)部、

窗口與窗口之間、窗口與系統(tǒng)之間進(jìn)行數(shù)據(jù)處理與數(shù)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

據(jù)交換的過程。

⑵事件驅(qū)動

Windows程序設(shè)計(jì)是針對事件或消息的處理進(jìn)

行,消息是指描述事件發(fā)生的信息(如按下鼠標(biāo)或鍵

盤)。Windows程序的執(zhí)行順序取決于事件發(fā)生的順

序,程序的執(zhí)行順序是由順序產(chǎn)生的消息驅(qū)動的,可

是消息的產(chǎn)生往往并不要求有次序之分。事件驅(qū)動編

程方法對于編寫交互式程序很有用處,它避免了死板

的操作模式。

(3)句柄

句柄是一個(gè)4字節(jié)長的數(shù)值,用于標(biāo)識應(yīng)用程序

中不同的對象和同類對象中不同的實(shí)例,應(yīng)用程

序經(jīng)過句柄訪問相應(yīng)的對象信息。以下是常見句柄類

型及其說明:

HWND窗口句柄HDC設(shè)備

環(huán)境句柄

HBITMAP位圖句柄HCURSOR光標(biāo)

句柄

EICON圖標(biāo)句柄HFONT字體

句柄

HMENU菜單句柄HPEN回筆

句柄

HFILE文件句柄HBRUSH畫刷

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

句柄

HINSTANCE當(dāng)前實(shí)例句柄

(4)消息

Windows應(yīng)用程序利用Windows消息(Message)與

應(yīng)用程序及系統(tǒng)進(jìn)行信息交換。消息由三部分組成,

①消息號:由事先定義好的消息名標(biāo)識;

②字參數(shù)(wParam):用于提供消息的附加信息;

③長字參數(shù)(IParam):用于提供消息的附加信

息,附加信息與具體消息號的值有關(guān)

在Win中消息用結(jié)構(gòu)體MSG表示:

typedefstructtagMSG

{HWNDhwnd;窗口句柄,為null,則可檢索所有駐

留在消息隊(duì)列中的消息

UINTmessage;消息值,由Windows,h頭文件中的

宏定義來標(biāo)識

WPARAMwPara叫包含有關(guān)消息的附加信息,不同

消息其值有所不同

LPARAMIParam;

DWORDtime;指定消息送至隊(duì)列的時(shí)間

POINTpt;指定消息發(fā)送時(shí)屏幕光標(biāo)的位置,其數(shù)

據(jù)類型歿幽也是一個(gè)結(jié)構(gòu)體

}MSG;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

typedefstructtagPOINT

{LONGx;

LONGy;

}POINT;

VC中存在幾種系統(tǒng)定義的消息分類,不同的前綴符

號經(jīng)常見于消息宏識別消息附屬的分類,系統(tǒng)定義的

消息宏前綴如下:

BM表示按鈕控制消息

CB表示組合框控制消息

DM表示默認(rèn)下壓式按鈕控制消息

EM表示編輯控制消息

LB表示列表框控制消息

SBM表示滾動條控制消息

WM表示窗口消息

Windows編程常見消息包括:窗口管理消息,初始

化消息,輸入消息,系統(tǒng)消息,剪貼板消息,控制處

理消息,控制通知消息,滾動條通知消息,非用戶區(qū)

消息,MDI消息,DDE消息,應(yīng)用程序自定義的消息。

二、Windows應(yīng)用程序常見消息

1.WM.LBUTTONDOWN:產(chǎn)生單擊鼠標(biāo)左鍵的消息。

IParam:低字節(jié)包含當(dāng)前光標(biāo)的X坐標(biāo)值高字節(jié)包

含當(dāng)前光標(biāo)的Y坐標(biāo)值;wParam包含一整數(shù)值以標(biāo)識

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

鼠標(biāo)鍵的按下狀態(tài);MK_LBUTTON按下鼠標(biāo)左

鍵,MK_MBUTTON按下鼠標(biāo)中鍵,MK_RBUTTON按下

鼠標(biāo)右鍵.另外,相似的消息還有:

WM_LBUTTONUP:放開鼠標(biāo)左鍵時(shí)產(chǎn)生;

WM_RBUTTONDOWN:單擊鼠標(biāo)右鍵時(shí)產(chǎn)生;

WM_RBUTTONUP:放開鼠標(biāo)右鍵時(shí)產(chǎn)生;

WM_LBUTTONDBLCLK:雙擊鼠標(biāo)左鍵時(shí)產(chǎn)生;

WM_RBUTTONDBLCLK:雙擊鼠標(biāo)右鍵時(shí)產(chǎn)生

2.WM_KEYDOWN:按下一個(gè)非系統(tǒng)鍵時(shí)產(chǎn)生的消息。

系統(tǒng)鍵是指實(shí)現(xiàn)系統(tǒng)操作的組合鍵,例如Alt與某個(gè)

功能鍵的組合以實(shí)現(xiàn)系統(tǒng)菜單操作等。wParam:按下

鍵的虛擬鍵碼,用以標(biāo)識按下或釋放的鍵(如F1的

虛擬鍵碼在Windows,h文件中定義為VK_F1);

IParam:記錄了按鍵的重復(fù)次數(shù)、掃描碼、轉(zhuǎn)移代碼、

先前鍵的狀態(tài)等信息。

相似的消息還有WM.KEYUP,在放開非系統(tǒng)鍵時(shí)產(chǎn)

3.WM_CHAR:按下一個(gè)非系統(tǒng)鍵時(shí)產(chǎn)生的消息。

WParam:為按鍵的ASCH碼;IParam:與WM_KEYDOWN

的相同。

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

4.WM_CREATE:由CreateWindow函數(shù)發(fā)出的消息。

wParam:未用;IParam:包含一個(gè)指向CREATESTRUCT

數(shù)據(jù)結(jié)構(gòu)的指針。

5.WM_CLOSE:關(guān)閉窗口時(shí)產(chǎn)生的消息。wParam和

IParam均未用。

6.WM_DESTROY:由DestroyWiodow函數(shù)發(fā)出的消息。

wParam和IParam均未用。

7.WM_QUIT:由PostQuitMessage函數(shù)發(fā)出的消息,

退出應(yīng)用程序時(shí)發(fā)出的消息。wParam:含退出代碼,

標(biāo)識程序退出運(yùn)行時(shí)的有關(guān)信息;IParam:未用

8.WM_PAINT:以下情況時(shí)將產(chǎn)生WM_PAINT消息。用

戶區(qū)移動或顯示,用戶窗口改變大小,程序經(jīng)過滾動

條滾動窗口,下拉式菜單關(guān)閉并需要恢復(fù)被覆蓋的部

分,Windows清除對話框等對象,并需要恢復(fù)被覆蓋

的部分均產(chǎn)生WM_PAINT消息。

三Windows中的事件驅(qū)動程序設(shè)計(jì)

過程驅(qū)動程序設(shè)計(jì)和事件驅(qū)動程序設(shè)計(jì)的區(qū)別

如下圖:

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

四'Windows應(yīng)用程序組成及編程步驟

1.應(yīng)用程序的組成

一個(gè)完整的Windows應(yīng)用程序一般由五種類型的文件

組成。

1.C語言源程序文件

2.頭文件

3.模塊定義文件

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

4.資源描述文件

5.項(xiàng)目文件

2.源程序組成結(jié)構(gòu)

WinMain和WndProc是Windows應(yīng)用程序的主體,

Windows應(yīng)用程序由這兩個(gè)函數(shù)構(gòu)成基本框架。入口

函數(shù)WinMain:1.是所有應(yīng)用程序的入口,類似Main

函數(shù),2.完成一系列的定義和初始化,并產(chǎn)生消息

循環(huán)。窗口函數(shù)WndProc包含各種數(shù)據(jù)類型、數(shù)據(jù)結(jié)

構(gòu)與函數(shù)等。

(1)WinMain函數(shù)

WinMain函數(shù)的功能是注冊窗口類,建立窗口及執(zhí)

行必要的初始化。并進(jìn)入消息循環(huán),據(jù)接受的消息調(diào)

用相應(yīng)的處理過程,當(dāng)消息循環(huán)檢索到WM_QUIT時(shí)終

止程序運(yùn)行。WinMain函數(shù)由三個(gè)基本的組成部分:

函數(shù)說明、初始化和消息循環(huán)。

WinMain函數(shù)的說明如下:

intWINAPIWinMain

(HINSTANCEhThisInst,〃應(yīng)用程序當(dāng)前實(shí)例句

HINSTANCehPrevInst,〃應(yīng)用程序其它實(shí)例句

LPSTRIpszCmdLine,//指向程序命令行參數(shù)

的指針

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

IntnCmdShow〃應(yīng)用程序開始執(zhí)行時(shí)窗口顯

示方式的整數(shù)值標(biāo)識

)

注意!Win是多任務(wù)管理的,同一應(yīng)用程序的多個(gè)窗

口可能會同時(shí)存,Win系統(tǒng)對每個(gè)窗口的執(zhí)行稱為一

個(gè)實(shí)例,并用一個(gè)實(shí)例句柄來唯一標(biāo)識

(2)初始化

初始化包括四個(gè)步驟。窗口類的定義:定義窗口的

形式與功能;窗口類的注冊:窗口類必須先注冊后使

用;創(chuàng)立窗口實(shí)例;顯示窗口。

(a)窗口類定義

經(jīng)過給窗口類數(shù)據(jù)結(jié)構(gòu)WNDCLASS賦值完成,該數(shù)據(jù)

結(jié)構(gòu)中包含窗口類的各種屬性。窗口類定義常見以下

函數(shù):

Loadicon:作用是在應(yīng)用程序中加載一個(gè)窗口圖

標(biāo)。其原型為:

EICONLoadicon(HINSTANCEhlnstance,//hlnstance

圖標(biāo)資源所在的模塊句柄,NULL則使用系統(tǒng)預(yù)

〃定義圖標(biāo),

LPCTSTRIpIconName//

IpIconName圖標(biāo)資源名或系統(tǒng)預(yù)定義圖標(biāo)標(biāo)識名。)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

LoadCursor:作用是在應(yīng)用程序中加載一個(gè)窗口光

標(biāo)。其原型為:

HCURSORLoadCursor(HINSTANCEhlnstance,//

hlnst

ance

光標(biāo)

資源

所在

的模

塊句

柄,

NULL

則使

用系

〃統(tǒng)預(yù)

定義光標(biāo)

LPCTSTRIpCursorName)//

IpCursorName光標(biāo)資源名或系統(tǒng)預(yù)定義光標(biāo)標(biāo)識

〃名

GetStockObject:作用是獲取系統(tǒng)提供的背景刷,

其原型為:

HBRUSHGetStockObject(intnBrush);//nBrush刷

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。一

子的類型

(b)注冊窗口類

Win系統(tǒng)本身提供部分預(yù)定義的窗口類,程序員也

能夠自定義窗口類,窗口類必須先注冊后使用。窗口

類的注冊由函數(shù)RegisterClass()實(shí)現(xiàn)。

RegisterClass(&wndclass);//wndclass為窗口

類結(jié)構(gòu)

RegisterClass函

數(shù)的返回為布爾

值,注

〃冊成功則返回真

(C)創(chuàng)立窗口實(shí)例

創(chuàng)立一個(gè)窗口類的實(shí)例由函數(shù)CreateWindow()

實(shí)現(xiàn),函數(shù)原型如下:

HWNDCreateWindow

(LPCTSTRIpszClassName,〃窗口類名

LPCTSTRIpszTitle,〃窗口標(biāo)題名

DWORDdwStyle,〃創(chuàng)立窗口的樣式

intx,y,〃窗口左上角坐標(biāo)

intnWidth,nHeight,〃窗口寬度和度高

HWNDhwndParent,〃該窗口的父窗口句柄

HWENUhMenu,〃窗口主菜單句柄

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

HINSTANCEhlnstance,〃創(chuàng)立窗口的應(yīng)用程序

當(dāng)前句柄

LPVOIDIpParam〃指向一個(gè)傳遞給窗口的

參數(shù)值的指針

)

常用窗口樣式

說明

WS_BORDER包犍一帶邊框的窗口

WS_CAPTION年犍一帶標(biāo)題欄的窗口

WS_VSCROLL包犍一帶垂直滾動條的窗口

WS_MAXIMIZEBOX創(chuàng)犍一帶最大化框的窗口

WS_MAXIMIZE包犍一最大尺寸的窗口

WS_MINIMIZEBOX毒犍一帶最小化框的窗口

WS_MINIMIZE包犍一最小尺寸的窗口

WS_OVERLAPPED包犍一帶邊框和標(biāo)J8的窗口

WS_OVERLAPPEDWINDOW包惚一帶邊框、標(biāo)題欄、系皖單及最大、

最小化框的窗口

WS_POPUP卷犍一彈出式窗口

WS_POPUPWIND0W含犍一帶邊框和系紜單的彈出式窗口

WS_SYSMENU包犍一帶系皖單的窗口

WS_HSCROLL包犍一帶水平滾動條的菜單

(d)顯示窗口

窗口類的顯示由ShowWindow和UpdateWindow函數(shù)

實(shí)現(xiàn)。應(yīng)用程序調(diào)用ShowWindow函數(shù)在屏幕上顯示

窗口:

ShowWindow(hwnd,nCmdshow);//nCmdshow為窗口

顯示形式標(biāo)識

SW-HIDE隱豪窗口

SW_SHOWNORMAL顯示并激活窗口

SW_SHOWMINIMIZE顯示并最小化窗口

S\VSHOWMAXMIZE顯示并最大化窗口

SW-SHOWNOACTIVE顯示但不激活窗口

SM「RESTORE恢復(fù)窗口的原來位置及尺寸

顯示窗口后,應(yīng)用程序調(diào)用UpdateWindow更新并

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

繪制用戶區(qū),并發(fā)出WM_PAINT消息。

UpdateWindow(hwnd);

(3)消息循環(huán)

消息循環(huán)的過程如下圖所示:

將消息傳遞給

窗口函數(shù)的相

Windows來

產(chǎn)生的消息

消息循環(huán)的常見格式如下:

MSGMsg;

while(GetMessage(&Msg,NULL,0,0))〃從消息隊(duì)列

中讀取一條消息,并將消息放在MSG結(jié)構(gòu)中

{TranslateMessage(&Msg);//將消息的虛擬鍵轉(zhuǎn)換

為字符信息

DispatchMessage(&Msg);}〃將消息傳送到指定窗

口函數(shù)

其中函數(shù)GetMessage形式為:

GetMessage

IpMSG,〃指向MSG結(jié)構(gòu)的指針

hwnd,

nMsgFilteMin,〃用于消息過濾的最小消息號值

nMsgFilterMax〃用于消息過濾的最大消息號值

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

)

返回零值,即檢索到WM_QUIT消息,程序結(jié)束循環(huán)并

退出

2.窗口函數(shù)WinProc

WinProc定義了應(yīng)用程序?qū)邮盏降牟煌⒌捻?/p>

應(yīng),包含了對各種可能接收到的消息的處理過程。

WinProc函數(shù)由一個(gè)或多個(gè)switch語句組成。每一條

case語句對應(yīng)一種消息,當(dāng)應(yīng)用程序接收到一個(gè)消息

時(shí),相應(yīng)的case語句被激活并執(zhí)行相應(yīng)的響應(yīng)程序

模塊。

窗口函數(shù)的一般形式如下:

LRESULTCALLBACKWndProc(HWNDhwnd,UINT

messgae,WPARAMwParam,LPARAMIParam)

{…

switch(message)//message為標(biāo)識的消息

{case…

???

break;

caseWM_DESTROY:

PostQuitMessage(0);

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

default:

return

DefWindowProc(hwnd,message,wParam,1Param);

)

return(0);

)

在消息處理程序段中一般都有對WM_DESTROY的處

理,該消息是關(guān)閉窗口時(shí)發(fā)出的。它向應(yīng)用程序發(fā)出

WM_QUIT消息,請求退出處理函數(shù):

voidPostQuitMessage(intnExitCode)

〃nExitCode為應(yīng)用程序的退出,為未定義處理過程

//消

息提供缺省處理

3.數(shù)據(jù)類型

在Windows,h中定義了Windows應(yīng)用程序中包含

種類繁多的數(shù)據(jù)類型

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

期頻說明

WORD16位無符號整數(shù)

LONG32位有符號整數(shù)

DWORD32位無符號整數(shù)

HANI>LE句柄

PINT32位無符號整數(shù)

BOOL布爾值

LPTSTR指向字符串的32位指針

LPCTSTR指向字符串常量的32位指針

4.一些重要的數(shù)據(jù)結(jié)構(gòu)

MSG:包含一個(gè)消息的全部信息,是消息發(fā)送的格式

WINDCLASS:包含一個(gè)窗口類的全部信息及屬性

POINT:定義了屏幕上或窗口中的一個(gè)點(diǎn)的X和Y坐

標(biāo)

RECT:定義了一個(gè)矩形區(qū)域及其左上角和右下角的坐

標(biāo)

五、應(yīng)用程序

【例2-1]創(chuàng)立應(yīng)用程序框架。本例的目的在于說明

創(chuàng)立Windows應(yīng)用程序的方法及過程,程序的效果如

下圖所示。

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

#include<windows.h>〃包含應(yīng)用程序中所需的數(shù)據(jù)

類型和數(shù)據(jù)結(jié)構(gòu)的定義

LRESULTCALLBACK

WndProc(HWND,UINT,WPARAM,LPARAM);〃窗

口函數(shù)說明

//.........以下初始化窗口類...............

intWINAPIWinMain(HINSTANCEhlnstance,

HINSTANCEhPrevInst,LPSTR

lpszCmdLine,intnCmdShow)

HWNDhwnd;

MSGMsg;

WNDCLASSwndclass;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。.

charIpszClassName[]="窗口";〃窗口類

charlpszTitle[]=nMy_Windowsn;〃窗口標(biāo)

題名

〃窗口類的定義

wndclass.style=O;〃窗口類

型為缺省類型

wndclass.IpfnWndProc=WndProc;〃定義窗

口處理函數(shù)

wndclass.cbClsExtra=O;〃窗口類無

擴(kuò)展

wndclass.cbWndExtra=O;〃窗口實(shí)

例無擴(kuò)展

wndclass.hlnstance=hlnstaiice;〃當(dāng)前實(shí)

例句柄

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICAT

ION);〃窗口的最小化圖標(biāo)為缺省圖標(biāo)

wndclass.hCursor=LoadCursor(NULL,IDC_ARR

OW);〃窗口采用箭頭光標(biāo)

wndclass.hbrBackground=GetStockObject(WHIT

E_BRUSH);〃窗口背景為白色

wndclass.lpszMenuName=NULL;//窗口中無

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

菜單

wndclass.lpszCIassName=lpszClassName;//窗口類

名為“窗口”

//.........以下進(jìn)行窗口類的注冊……

if(!RegisterClass(&wndclass))〃如果注冊失敗則發(fā)

出警告

{MessageBeep(O);

returnFALSE;}

//..........創(chuàng)立窗口.............

hwnd=CreateWindow

(

IpszClassName,〃窗口類名

IpszTitle,〃窗口實(shí)例的標(biāo)題名

WS_OVERLAPPEDWINDOW,〃窗口的風(fēng)格

CW_USEDEFAULT,

CW_USEDEFAULT,〃窗口左上角坐標(biāo)為缺省

CW.USEDEFAULT,

CW_USEDEFAULT?〃窗口的高和寬為缺省值

NULL,〃此窗口無父窗口

NULL,〃此窗口無主菜單

hlnstance,〃創(chuàng)立此窗口的應(yīng)用程序的當(dāng)前

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。一

句柄

NULL〃不使用該值

);

//.........顯示窗口...............

ShowWindow(hwnd,nCmdShow);

//.........繪制用戶區(qū)..............

UpdateWindow(hwnd);

//...........消息循環(huán)...............

while(GetMessage(&Msg,NULL,0,0))

(

TranslateMessage(&Msg);

DispatchMessage(&Msg);

)

returnMsg.wParam;〃消息循環(huán)結(jié)束即程序終止時(shí)

將信息返回系統(tǒng)

)

〃窗口函數(shù)

LRESULTCALLBACKWndProc

(HWNDhwnd,

UINTmessage,

WPARAMwParam,

LPARAMIParam

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

)

switch(message)

{caseWM_DESTROY:

PostQuitMessage(O);

default:〃缺省時(shí)采用系統(tǒng)消息缺省處理函數(shù)

return

DefWindowProc(hwnd,message,wParamJParam);

)

return(O);

)

六、繪圖函數(shù)

在Windows平臺下,常見的繪圖函數(shù)有:

SetPixel:在x,y點(diǎn)畫上相應(yīng)的顏色。例如:

SetPixel(hdc,x,y,crColor),crColor的類型是

COLORREF,COLORREF是一個(gè)32位的無符號整數(shù),代

表一種顏色,常見RGB宏來生成顏色。

#defineRGB(r,g,b)((COLORREF)(((BYTE)(r)|\

((WORD)((BYTE)(g))?8))|\

((DWORD)((BYTE)(b))?16)))

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

MoveToEx:把當(dāng)前點(diǎn)移動到指定點(diǎn),如

MoveToEx(hdc,xBeg,yBeg,NULL);

LineTo:從當(dāng)前點(diǎn)畫線到指定點(diǎn),如

LineTo(hdc,xEnd,yEnd);

當(dāng)要畫圖時(shí),應(yīng)在WM_PAINT消息下編寫程序:

???

switch(message)

(

caseWM_PAINT

hdc=BeginPaint(hwnd,&ps);

GetClientRect(hwnd,&rect);

…〃在此添加繪圖函數(shù)

EndPaint(hwnd,&ps);

return0;

caseWM_DESTROY:

PostQuitMessage(O);

default:〃缺省時(shí)采用系統(tǒng)消息缺省處理函數(shù)

return

DefWindowProc(hwnd,message,wParamJParam);

)

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

第二章計(jì)算機(jī)圖形學(xué)的實(shí)驗(yàn)

2.1直線的生成

(-)直線的DDA算法

1、實(shí)驗(yàn)?zāi)康?/p>

(1)熟悉TurboC或在VisualC++開發(fā)環(huán)境,掌握在

TurboC或在VisualC++環(huán)境下進(jìn)行圖形程序設(shè)計(jì)的

基本方法。

⑵掌握直線的DDA算法

2、實(shí)驗(yàn)內(nèi)容

根據(jù)輸入的直線的端點(diǎn)坐標(biāo)畫出相應(yīng)的直線。

3、獨(dú)立圖形運(yùn)行程序的建立

TurboC對于用initgraph。函數(shù)直接進(jìn)行的圖形初

始化程序,

在編譯和鏈接

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

時(shí)并沒有將相應(yīng)的驅(qū)動程序(*.BGI)裝入到執(zhí)行程序,

當(dāng)程序進(jìn)行到intitgraph()

語句時(shí),

再從該函數(shù)中第三個(gè)形式參數(shù)char*path中所規(guī)定

的路徑中去找相應(yīng)的

驅(qū)動程序。若沒有驅(qū)動程序,則在C:\TC中去找,

如C:\TC中仍沒有或TC不存在,

將會出現(xiàn)錯(cuò)誤:

BGIError:Graphics

notinitialized(use'initgraph')

因此,為了使用方便,

應(yīng)該建立一個(gè)不需要驅(qū)動程序就能獨(dú)立運(yùn)行的可執(zhí)

圖形程序,TurboC中規(guī)定用下述步驟(這里以EGA、

VGA顯示器為例):

1.在C:\TC子目錄下輸入命令:BGIOBJEGAVGA

此命令將驅(qū)動程序EGAVGA.BGI轉(zhuǎn)換成EGAVGA.OBJ的

目標(biāo)文件。

2.

在C:\TC子目錄下輸入命令:TLIB

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

LIB\GRAPHICS.LIB+EGAVGA

此命令的意思是將EGAVGA.OBJ的目標(biāo)模塊裝到

GRAPHICS.LIB庫文件中。

3.

在程序中initgraph。函數(shù)調(diào)用之前加上一句:

registerbgidriver(EGAVGA_driver):

該函數(shù)告訴連接程序在連接時(shí)把EGAVGA的驅(qū)動程序

裝入到用戶的執(zhí)行程序中。

經(jīng)過上面處理,編譯鏈接后的執(zhí)行程序可在任何

目錄或其它兼容機(jī)上運(yùn)行。

假設(shè)已作了前兩個(gè)步驟,若再向例6中加

registerbgidriver()函數(shù)則變成:

例7:

#include<stdio.h>

#include<graphics.h>

intmain()

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

intgdriver=DETECT,gmode;

registerbgidriver(EGAVGA_driver):/*建立獨(dú)立

圖形運(yùn)行程序*/

initgraph(gdriver,

gmode,"c:\\tc");

bar3d(50,50,250,150,20,1);

getch();

closegraph();

return0;

)

上例編譯鏈接后產(chǎn)生的執(zhí)行程序可獨(dú)立運(yùn)行。

4、參考程序

這里只給出了實(shí)現(xiàn)DDA算法的一個(gè)子函數(shù),當(dāng)上

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

機(jī)調(diào)試時(shí)需根據(jù)所選用的編程環(huán)境自己來成整個(gè)程

序。

#include<gra

phics.h>

#include<ma

th.h>

#include<co

nio.h>

voidLine(int

xO,intyOJnt

x1,inty1,int

value)

{intx;

float

dx,dy,m,y;

dx=x1-x0;

dy=y1-y0;

m=dy/dx;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

y=yo;

for(x=xO;x<=

x1;x++)

{putpixel(x,(i

nt)(y+0.5),valu

e);

y=y+m;

if(getch()==1

7)exit();

}

}

voidmain()

{int

i,driver,mode;

driver=DETE

CT;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

registerbgidr

iver(EGAVGA_

driver);

initgraph(&d

river,&mode,M..

Wbgi-);

printf(Mpress

anykeyto

continue

excpefctrl+Q't

oquit.\nM);

Line(100,100

,500,400,15);

closegraphQ

(二)直線的Breshenham算法

1、實(shí)驗(yàn)?zāi)康?/p>

(1)熟悉TurboC或在VisualC++開發(fā)環(huán)境,掌握在

TurboC或在VisualC++環(huán)境下進(jìn)行圖形程序設(shè)計(jì)的

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

基本方法。

(2)掌握直線的Breshenham算法

2、實(shí)驗(yàn)內(nèi)容

根據(jù)輸入的直線的端點(diǎn)坐標(biāo)畫出相應(yīng)的直線。

3、參考程序

這里只給出了實(shí)現(xiàn)Breshenham算法的一個(gè)子函數(shù),

當(dāng)上機(jī)調(diào)試時(shí)需根據(jù)所選用的編程環(huán)境自己來成整

個(gè)程序。

voidline(x1,y1,x2,y2,c)

intx1,y1,x2,y2,c;

(

intdx;

intdy;

intx;

inty;

intp;

intconstl;

intconst2;

intinc;

inttmp;

dx=x2-x1;

dy=y2-y1;

if(dx*dy>=0)/*準(zhǔn)備x或y的單位遞變值。*/

inc=1;

else

inc=-1;

if(abs(dx)>abs(dy)){

if(dx<0){

tmp=x1;/*將2a,3a象限方向*/

x1=x2;/*的直線變換到1a,4a*/

x2=tmp;

tmp=y1;/*象限方向去7

yi=y2;

dx=-dy;

dy=-dy;

}

p=2*dy-dx;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

const1=2*dy;/*注意此時(shí)誤差的*/

const2=2*(dy-dy);/*變化參數(shù)取值.*/

x=x1;

y=yi;

set_pixel(x,y,c);

while(x<x2){

x++;

if(P<0)

p+=const1;

else{

y+=inc;

p+=const2;

}

set_piexl(x,y,c);

}

}

else{

if(dy<0){

tmp=x1;/*將3b,4b象限方向的

*/

x1=x2;/*直線變換到2b,1b*/

x2=tmp;/*象限方向去.*/

tmp=y1;

yi=y2;

dx=-dy;

dy=-dy;

}

p=2*dx-dy;/*注意此時(shí)誤差的7

const1=2*dx;/*變化參數(shù)取值.

*/

const2=2*(dx-dy);

x=x1;

y=yi;

set_pixel(x,y,c);

while(y<y2){

y++;

if(pvO)

p+=const1;

else{

x+=inc;

p+=const2;

set_pixel(x,y,

c);

}

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。一

}

)

2.2區(qū)域填充

1、實(shí)驗(yàn)?zāi)康?/p>

(1)熟悉TurboC或在VisualC++開發(fā)環(huán)境,掌握在

TurboC或在VisualC++環(huán)境下進(jìn)行圖形程序設(shè)計(jì)的

基本方法。

(2)掌握多邊形的掃描線算法

2、實(shí)驗(yàn)內(nèi)容

根據(jù)輸入的多邊形的頂點(diǎn)的坐標(biāo)對輸入多邊形進(jìn)

行填色。

3、參考程序

這里只給出了實(shí)現(xiàn)掃描線填色算法的子函數(shù),當(dāng)上

機(jī)調(diào)試時(shí)需根據(jù)所選用的編程環(huán)境自己來成整個(gè)程

序。

typedefstruct{

inty_top;

floatx_int;

intdelta_y;

floaatx_change_per_scan;

}EACH_ENTRY;

EACH_ENTRYSIDES[MAX_POINT];

intx[MAX_POINT],y[MAX_POINT];

intside_count,first_s,last_s,scan,bottomscan,x_int_count,r;

fill_area(count,x,y)

intcount,x[],y[];

(

sort_on_bigger_y(count);

first_s=1;

last_s=1;

for(scan=sides[1].y_top;scan>bottomscan?;scan--)

update_first_and_last(count,scan);

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

process_x_intersections(scan,first_s,last_s);

drawjines(scan,x_int_count,first_s);

update-_sides_list();

}

}

voidput_in_sides_list(entry,x1,y1,x2,y2,next_y);

intentry,x1,y1,x2,y2,next_y;

(

intmaxy;

floatx2_temp,x_change_temp;

x_change_temp=(float)(x2-x1)/(float)(y2-y1);

x2_temp=x2;/*以下為退縮一點(diǎn)操作.*/

if((y2>y1)&&(y2<next_y)){

y2--;

x2_temp-=x_change_temp;

)

else{

if((y2<y1)&&(y2>next_y)){

y2++;

x2_temp+=x_change_temp;

}

}

/*以下為插入活性表操作.*/

maxy=(y1>y2)?y1:y2;

while((entry>1)&&(maxy>sides[entry-1].y_top))

(

sides[entry]=sides[entry?];

entry-

}

sides[entry].y_top=maxy;

sides[entry].delta_y=abs(y2-y1)+1;

if(yi>y2)

sides[entry].xjnt=x1;

else{

sides[entry].x_int=x2_temp;

sides[entry].

x_change_per_scan=x_change_temp;

}

voidsort_on_bigger_y(n)

intn;

(

intk,x1,y1;

side_count=0;

yi=y[n];

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

x1=x[n];

bottomscan=y[n];

for(k=1;k<n+1;k++)

(

if(yi!=y[k]){

side_count++;

put_in_sides_list(side_count,x1,y1,

x[k],y[k]);

}

else{

move((short)xl,(short)yl);

line((short)x[k],(short)yl,status);

}

if(y[k]<bottomscan)bottomscan=y[k];

y1=y[k];x1=x[k];

}

}

voidupdate_first_and_last(count,scan)

intcount,scan;

(

while((sides[last_s+1].y_top>=scan)&&(last_s

<count))last_s++;

while(sides[first_s].delta_y==0)first_s++;

}

voidswap(x,y)

EACH_ENTRYx,y;

(

inti_temp;

floatf_temp;

i_temp=x.y_top;x.y_top=y.y_top;y.y_top=i_temp;

f_temp=x.x_int;x.x_int=y.x_int;y.x_int=f_temp;

i_temp=x.delta_y;x.delta=y.delta_y;y.delta_y=i_temp;

f_temp=x.x_change_per_scan;x.

x_change_per_scan=y.x_change_per_scan;y.x.

change_per_scan=f_temp;

}

voidsort_on_x(entry,first_s)

intentry,first_s;

(

while((entry>first_s)&&(sides[entry].xjntv

sides[entry-1].xjnt))

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

swap(sides[entry],sides[entry-1]);

entry-

}

}

voidprocess_x_intersections(scan,first_s,last_s)

intscan,first_s,last_s;

(

intk;

x_int_cout=0;

for(k=first_s;k<last_s+1;k++)

(

if(sides[k].delta_y>0){

x_int_count++;

sort_on_x(k,first_s);

}

}

}

voiddraw_lines(scan,x_int_count,index)

intscan,x_int_count,index;

(

intk,x,x1,x2;

for(k=1;k<(int)(x_int_count/2+1.5);k++)

(

while(sides[index].delta_y==0)index++;

x1=(int)(sides[index].x_int+0.5);

index++;

while(sides[index].delta_y==0)index++;

x2=(int)(sides[index].xjnt+0.5);

move((short)x1,(short)scan);

Iine((short)x2,(short)scan,status);

index++;

}

}

voidupdate_sides_list()

(

intk;

for(k=first_s;k<last_s+1;k++)

(

if(sides[k].delta_y>0)

sides[k].delta_y-

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

sides[k].x_int-=sides[k].

x_change_per_scan;

}

}

}

2.3直線的裁剪

1、實(shí)驗(yàn)?zāi)康?/p>

(1)熟悉TurboC或在VisualC++開發(fā)環(huán)境,掌握在

TurboC或在VisualC++環(huán)境下進(jìn)行圖形程序設(shè)計(jì)的

基本方法。

(2)掌握Cohen-Suther1and直線裁剪算法

2、實(shí)驗(yàn)內(nèi)容

輸入多邊形頂點(diǎn)的坐標(biāo)和待裁剪的直線的端點(diǎn)坐

標(biāo),由多邊形對直線進(jìn)行裁剪。

3^參考程序

這里只給出了實(shí)現(xiàn)Cohen-Sutherland直線裁剪算

法的子函數(shù),當(dāng)上機(jī)調(diào)試時(shí)需根據(jù)所選用的編程環(huán)境

自己來成整個(gè)程序。

clip_a_line(x1,y1,x2,y2,xw_min,xw_max,yw_min,yw_max)

intx1,x2,y1,y2;xw_min,xw_max,yw_min,yw_max;

(

inti,codel[4],code2[4],done,display;

floatm;

intx11,x22,y11,y22,mark;

done=0;

display=0;

while(done==0)

(

x11=x1;x22=x2;y11=y1;y22=y2;

encode(x1,y1,codel,xw_min,xw_max,yw_min,

yw_max);

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

encode(x2,y2,code2,xw_min,xw_max,yw_min,

ywmax);

if(accept(code1,code2))

(

done=1;

display=1;

break;

}

else

if(reject(codel,code2))

(

done=1;

break;

}

mark=swap_if_needed(code1,code2);

if(mark==1)

(

x1=x22;

x2=x11;

y1=y22;

y2=y11;

}

if(x2==x1)m=-1;

else

m=(fIoat)(y2-y1)/(float)(x2-x1);

if(codel[0])

(

x1+=(yw_min-y1)/m;

y1=yw_min;

}

elseif(code1[1])

(

x1-=(y1-yw_max)/m;

y1=yw_max;

}

elseif(code1[2])

(

y1-=(x1-xw_min)*m;

x1=xw_min;

}

elseif(code[3])

(

y1+=(xw_max-x1)*m;

x1=xw_max;

文檔僅供參考,不當(dāng)之處,請聯(lián)系改正。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論