![2020年計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書_第1頁](http://file4.renrendoc.com/view/b7be141b87e8b93e481256816ec1066b/b7be141b87e8b93e481256816ec1066b1.gif)
![2020年計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書_第2頁](http://file4.renrendoc.com/view/b7be141b87e8b93e481256816ec1066b/b7be141b87e8b93e481256816ec1066b2.gif)
![2020年計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書_第3頁](http://file4.renrendoc.com/view/b7be141b87e8b93e481256816ec1066b/b7be141b87e8b93e481256816ec1066b3.gif)
![2020年計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書_第4頁](http://file4.renrendoc.com/view/b7be141b87e8b93e481256816ec1066b/b7be141b87e8b93e481256816ec1066b4.gif)
![2020年計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書_第5頁](http://file4.renrendoc.com/view/b7be141b87e8b93e481256816ec1066b/b7be141b87e8b93e481256816ec1066b5.gif)
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國塑料鏡片拋光劑市場調(diào)查研究報(bào)告
- 2025年輕紡機(jī)械襯套項(xiàng)目可行性研究報(bào)告
- 2025至2030年中國雙軸玻璃鋼管纏繞機(jī)數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國包銅箱數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025年中國計(jì)算機(jī)數(shù)據(jù)信號電涌保護(hù)器市場調(diào)查研究報(bào)告
- 2025年中國牙膏蠟市場調(diào)查研究報(bào)告
- 創(chuàng)意產(chǎn)業(yè)對城市社區(qū)的影響和改造考核試卷
- 2025-2030年戶外瑜伽平臺行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年手術(shù)顯微鏡行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年即飲花果茶系列企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 精神科患者服藥依從性健康宣教
- 2024年湖南省普通高中學(xué)業(yè)水平考試政治試卷(含答案)
- 零售企業(yè)加盟管理手冊
- 設(shè)備維保的維修流程與指導(dǎo)手冊
- 招標(biāo)代理服務(wù)的關(guān)鍵流程與難點(diǎn)解析
- GB/T 5465.2-2023電氣設(shè)備用圖形符號第2部分:圖形符號
- 材料預(yù)定協(xié)議
- 2023年河北省中考數(shù)學(xué)試卷(含解析)
- 《學(xué)習(xí)的本質(zhì)》讀書會活動
- 高氨血癥護(hù)理課件
- 物流營銷(第四版) 課件 胡延華 第3、4章 物流目標(biāo)客戶選擇、物流服務(wù)項(xiàng)目開發(fā)
評論
0/150
提交評論