锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
錛堟湰鏂囧亣璁懼潗鏍囩郴涓哄乏鎵嬪潗鏍囩郴涓紝鏃嬭漿鏂瑰悜涓洪『鏃墮拡銆傦級
鎵姹傞棶棰橈細
緇欏畾浠繪剰鍗曚綅杞磓(鍚戦噺),姹傚悜閲弍(x,y,z)(鎴栫偣p)楗秖鏃嬭漿theta瑙掑害鐨勫彉鎹㈠悗鐨勬柊鍚戦噺p'(鎴栫偣p')錛?/strong>
1.鐢ㄥ洓鍏冩暟宸ュ叿錛?br />-------------------------------------------------------------------------
緇撹錛氭瀯閫犲洓鍏冩暟鍙樻崲p'= q*p*q-1錛岋紙p,q鏄敱鍚戦噺p,q鎵╁睍鎴愮殑鍥涘厓鏁幫級銆傞偅涔堬紝p'杞崲鑷沖搴旂殑鍚戦噺(鎴栫偣)灝辨槸鍙樻崲鍚庣殑鏂板悜閲弍'(鎴栫偣p')銆?/p>
鍏朵腑錛宲',q,p,q-1鍧囦負鍥涘厓鏁般俼鐢卞悜閲弎鎵╁睍,涓簈=(cos(theta/2),sin(theta/2)*q)錛宲鐢卞悜閲弍鎵╁睍,涓簆=(0,x,y,z),q-1涓簈鐨勯嗭紝鍥犱負q涓哄崟浣嶅洓鍏冩暟錛屾墍浠-1=q*=(cos(theta/2),-sin(theta/2)*q)銆?br />-------------------------------------------------------------------------
錛堣繖涓粨璁虹殑璇佹槑榪囩▼鍙互鍦ㄧ綉涓婃壘鍒般傝繖閲岀暐鍘匯傦級
涓嬮潰鐪嬪叾鏃墮棿澶嶆潅搴︼細
棣栧厛鏈変釜涓夎鍑芥暟鐨勮綆楁椂闂達紝榪欎釜鍙互棰勫厛璁$畻濂斤紝鑺辮垂鏃墮棿涓嶈銆傝冭檻n涓洓鍏冩暟鐩鎬箻闇榪涜4*4*(n-1)=16*(n-1)嬈′箻娉曪紝15*(n-1)嬈″姞娉曪紝鍥犱負鍔犳硶鍖栬垂鏃墮棿杈冨皯錛岃繖閲屼粎鑰冭檻涔樻硶銆傝繖閲屾秹鍙婂埌涓変釜鍥涘厓鏁扮殑涔樻硶錛岃涓嬈′箻娉曠殑鏃墮棿涓篢,鏁呰姳璐?6*2=32T
2.鏃嬭漿鐭╅樀宸ュ叿錛?/strong>
-------------------------------------------------------------------------
緇撹錛氭瀯閫犳棆杞煩闃靛彉鎹rot,鍒欏彉鎹㈠悗鐨勬柊鍚戦噺p'(鎴栫偣p')涓簆'= p*Trot
鍏朵腑錛宲'錛坸',y',z',1錛?p(x,y,z,1)涓哄悜閲弍'錛宲鐨?D榻愭鍧愭爣琛ㄧず錛孴rot =
|t*x*x + c,聽聽聽聽聽聽聽t*x*y + s*z,聽聽聽聽聽聽t*x*z - s*y,聽聽聽聽 0|
|t*x*y - s*z,聽聽聽聽t*y*y + c,聽聽聽聽聽聽聽聽聽聽t*y*z + s*x,聽聽聽聽0|
|t*x*z + s*y,聽聽 t*y*z - s*x,聽聽聽聽聽聽聽t*z*z + c,聽聽聽聽聽聽聽聽0|
|0,聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽0,聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽0,聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽1|聽聽聽
c=cos(theta), s=sin(theta),t=1-c.
-------------------------------------------------------------------------
錛堣繖涓粨璁虹殑璇佹槑榪囩▼鍙互鍦ㄧ綉涓婃壘鍒般傝繖閲岀暐鍘匯傦級
涓嬮潰鐪嬪叾鏃墮棿澶嶆潅搴︼細
涓夎鍑芥暟鐨勮綆楁椂闂翠笉璁°傜煩闃墊湰韜殑鍏冪礌涔樻硶涓昏鏄綆梩*x鍜宻*x涔嬬被錛岄渶榪涜12+3=15嬈′箻娉曘備袱涓煩闃電浉涔樼殑闇榪涜n*n*n嬈′箻娉?榪欓噷n=4錛屾墍浠ヨ姳璐?*4*4=64嬈′箻娉曟椂闂?浣嗚繖閲屾湁涓敞鎰忕殑鍦版柟灝辨槸鏃嬭漿鐭╅樀鐨勭4緇存棤欏昏冭檻錛屽嵆鍙畝鍖栦負3X3鐨勭煩闃點傛晠鑺辮垂3*3*3=27嬈′箻娉曟椂闂達紝鎬誨叡鐨勬椂闂翠負15+27=42嬈′箻娉曟椂闂淬俢ost=42T.
姣旇緝鏉ョ湅錛岃繕鏄嬌鐢ㄥ洓鍏冩暟鐨勬晥鐜囪楂樺嚭涓浜涳紝榪欏湪瑕佸彉鎹㈢殑鐐圭殑鏁扮洰瓚婂ぇ鏃訛紝浣撶幇鐨勮秺鏄庢樉銆傚疄闄呬笂錛屾湁寰堝3D寮曟搸涓轟簡鍒╃敤鍥涘厓鏁拌繍綆楃殑楂樻晥鐜囨э紝涓鑸厛灝嗙煩闃佃漿鎹㈡垚鍥涘厓鏁板悗榪涜榪愮畻鍐嶈漿鍥炰負鐭╅樀鍚庯紝鍐嶄紶緇橠irectX鎴朞penGL搴撳嚱鏁般?br />
鍏充簬鍥涘厓鏁板拰鐭╅樀鍦ㄥ悜閲忥紙鏂瑰悜錛変箣闂寸殑榪涜鎻掑肩殑鏁堢巼姣旇緝錛岃涓嬬瘒錛?br />鎺㈣錛氱墿浣撶粫浠繪剰鍚戦噺鐨勬棆杞?鍥涘厓鏁版硶VS.鏃嬭漿鐭╅樀娉曠殑鎬ц兘姣旇緝
a.閫忚鎶曞獎涓鑸殑瑙嗘櫙浣撲負媯卞彴錛岀浉鏈虹┖闂寸殑鐗╀綋浼氭姇褰卞埌瑙嗗鉤闈=d錛岃繖閲岃冭檻宸︽墜鍧愭爣緋伙紝鐭╅樀浣跨敤琛屼紭鍏堟柟寮忋傚鍥炬墍紺猴紝鐢辯浉浼間笁瑙掑艦鐭ヨ瘑鍙煡鐩告満絀洪棿涓殑鐗╀綋鎶曞獎鍒拌騫抽潰涓婄殑鍧愭爣涓猴細
xp = xc*(dx/zc)
yp = yc*(dy/zc)
鍏朵腑,xc,yc,zc涓虹浉鏈虹┖闂村潗鏍?xp,yp,zp涓鴻騫抽潰鍧愭爣錛宒x錛宒y涓簒,y杞村悜鐨勮璺漹iew distance錛岃騫抽潰鍒癱amera鐨勮窛紱?
鏁呯浉鏈虹┖闂存姇褰卞埌瑙嗗鉤闈笂鐨勭煩闃礣cp涓猴細
|dx 0聽 0 0聽 |
|0聽 dy 0 0聽 |
|0聽 0聽聽 1 1聽 |
|0聽 0聽聽 0 0聽 |
(楠岃瘉:Tcp鍙充箻鐐筽(xc,yc,zc,1)寰楃偣p'(xc*dx, yc*dy, zc, zc),杞崲涓?D鍧愭爣涓?xc*dx/zc, yc*dy/zc, 1),姝g‘銆?
********************************************************************
娉細鍥犱負杞崲榪囩▼涓偣浣跨敤鐨勬槸4D榻愭鍧愭爣,鎵浠ユ渶鍚庨渶杞崲涓?D鍧愭爣銆?D榻愭鍧愭爣(x,y,z,w)杞崲涓?D鍧愭爣鐨勬柟娉曚負闄や互w鍒嗛噺錛屽嵆瀵瑰簲3D鍧愭爣涓?x/w,y/w,z/w)銆?br />********************************************************************
鑰冭檻dx/zc鍜宒y/zc欏癸紝濡傛灉dx != dy,鍒欐姇褰卞悗x,y鐨勬瘮渚嬩細鍙戠敓鍙樺寲錛堝師鍥狅細鎶曞獎鍓嶅潗鏍囨瘮渚嬩負xc/yc,鎶曞獎鍚庝負xp/yp = xc*(dx/zc)/yc*(dy/zc) = xc*dx/yc*dy錛夛紝浠庤屾姇褰卞悗鐨勫浘鍍忕殑x,y姣斾緥浼氬彂鐢熷彉褰€?br />
---------------------------------------------
緇撹1錛氭墍浠ワ紝涓鑸兘浼氫護d=dx=dy,鍗硏,y鍚戠殑瑙嗚窛鐩稿悓銆傚惁鍒欙紝鍥懼儚澶辯湡銆?br />---------------------------------------------
鑰冭檻瑙嗚錛坴iew angle,鎴栬閲巉iled of view錛夌殑闂錛岃瑙掔殑澶у皬涓嶄細褰卞搷鍒扮墿浣撴姇褰卞悗鐨勫潗鏍囷紝鍙細褰卞搷鍙鐨勮寖鍥淬?/p>
鍦ㄨ璺濅竴鏍風殑鎯呭喌涓嬶紝x,y杞寸殑瑙嗚鍙互涓嶄竴鏍楓傚鏋滀竴鏍鳳紝閭d箞瑙嗗鉤闈㈠氨鏄竴涓鏂瑰艦鐨勩備簬鏄湁錛?/p>
tan(theta_x/2) = width_p/d
tan(theta_y/2) = height_p/d聽
鍏朵腑錛宼heta_x錛宼heta_y涓簒,y杞村悜鐨勮瑙掞紝width_p錛宧eight_p涓鴻騫抽潰z=d鐨勫搴︼紙x杞達級鍜岄珮搴?y杞?銆?br />----------------------------------------------------------------
緇撹2錛氳騫抽潰鐨勫楂樻瘮rp=width_p/height_p = tan(theta_x/2)/tan(theta_y/2)銆?br />----------------------------------------------------------------
2.瑙嗗鉤闈㈠埌灞忓箷鐨勫彉鎹?/font>
涓嬮潰灝辨槸瑙嗗鉤闈㈠埌灞忓箷鐨勫彉鎹簡錛岃繖鏄竴涓?D鍒?D鐨勫彉鎹紙瑙嗗鉤闈㈢殑鍧愭爣闇浼哥緝浠ュ~婊℃暣涓睆騫曠┖闂?鍗沖湪瑙嗗鉤闈腑鍑虹幇鐨勬墍鏈夌殑鐐硅鍙樻崲鍒板睆騫曚笂鍘伙紝鍚屾椂x,y杞村悜鐨勬瘮渚嬭繕瑕佺淮鎸佸拰鍙樻崲鍓嶄竴鏍鳳紝浠ュ厤姣斾緥澶辯湡錛屽悓鏃惰騫抽潰鐨勫潗鏍囧師鐐瑰拰灞忓箷涓績鐐癸紙x0=(width_s)/2, y0=(height_s)/2錛夊搴旓級錛屽叾瀹烇紝灝辨槸涓涓潗鏍囩緝鏀懼姞騫崇Щ鐨勮繃紼?
xs = xp*kx + x0
ys = -yp*ky + y0
聽
鐭╅樀Tps涓猴細
|kx聽聽聽聽 0聽聽聽聽聽聽0 0聽 |
|0聽聽聽聽聽 -ky聽聽聽聽0 0聽 |
|0聽聽聽聽聽 0聽聽聽聽聽聽 1 0聽 |
|x0聽聽 y0聽聽聽聽聽聽0 1聽 |
(楠岃瘉:Tps鍙充箻鐐筽(xp,yp,zp,1)寰楃偣p'(xp*kx + x0, -yp*ky + y0, zp, 1),杞崲涓?D鍧愭爣涓?xp*kx + x0, -yp*ky + y0, zp)錛屾紜?
鍏朵腑錛宬x,ky(kx>0,ky>0)涓簒,y杞村悜鐨勭緝鏀懼洜瀛愶紙kx=(width_s)/(width_p)錛?ky = (height_s)/(height_p錛夛紝鍜岃璺濈浉鍚岋紝kx,ky鐨勫煎繀欏諱竴鏍鳳紝鍚﹀垯鍥懼儚鐨剎,y姣斾緥鍙堜細鍙戠敓鍙樺艦銆傝繖閲?yp*ky鏄洜涓轟竴鑸睆騫曠殑y杞存槸鍚戜笅鐨勶紝璺熺浉鏈虹┖闂村拰瑙嗗鉤闈㈠潗鏍囩郴涓殑y杞存柟鍚戠浉鍙嶃?br />------------------------------------------------------------------------------------------------
緇撹3: 涓鑸護k=kx=ky錛屽嵆x,y鍚戠殑緙╂斁鍥犲瓙鐩稿悓銆傚惁鍒欙紝鍥懼儚澶辯湡銆?br />浜庢槸鏈夛紝width_s/width_p = height_s/height_p錛屽彉鍖栫瓑寮忓緱錛宺p = width_p/height_p = width_s/height_s = rs
鎵浠ワ紝鍦▁,y杞磋璺濅竴鏍風殑鎯呭喌涓嬶紝瑕佹兂鏈鍚庡彉鎹㈠埌灞忓箷涓婄殑鍥懼儚x,y姣斾緥涓嶅け鐪燂紝蹇呴』rp=rs,鍗寵騫抽潰鐨勫楂樻瘮鍜屽睆騫曠殑瀹介珮姣斾竴鏍楓?/strong>
-----------------------------------------------------------------------------------------------
********************************************************************
娉細鑻ュ睆騫曞楂樹負W,H錛屽綋W != H錛屽嵆灞忓箷涓嶄負鏂瑰艦鐨勬椂鍊欙紝瑕佺‘淇濇姇褰卞埌灞忓箷涓婄殑鍥懼儚x,y姣斾緥涓嶅け鐪燂紝鍒檟,y杞磋瑙?鎴栬閲嶧OV)鑲畾涓嶈兘鐩哥瓑銆?
鍘熷洜錛?鐢辯粨璁?,3鐭ワ紝rp=width_p/height_p = tan(theta_x/2)/tan(theta_y/2)=width_s/height_s=rs=W/H銆?鏁呯敱W/H != 1 => theta_x != theta_Y.
********************************************************************
3.緇煎悎錛?/font>
鐩告満絀洪棿鐐筽杞崲鍒板睆騫曠┖闂寸偣p'錛屽彉鎹㈠叕寮忎負錛?/p>
xs = xc*(dx/zc)*kx + x0 = xc*(d/zc)*k + x0
ys = -yc*(dy/zc)*ky + y0 = -yc*(d/zc)*k + y0
緇煎悎鍙樻崲鐭╅樀(鐩告満絀洪棿鍒板睆騫曠┖闂?Tcs涓猴細
聽
Tcs = Tcp*Tps =
|d*k聽聽聽 0聽聽聽聽聽聽 0 0聽 |
|0聽聽聽聽聽 -d*k聽聽聽 0 0聽 |
|x0聽聽聽聽 y0聽聽聽聽聽 1 1聽 |
|0聽聽聽聽聽 0聽聽聽聽聽聽聽聽 0聽 0|
聽鍏朵腑錛宒涓鴻璺濓紝k涓哄睆騫曞楂樻瘮鎴栬騫抽潰瀹介珮姣旓紝x0,y0涓哄睆騫曚腑蹇冿紝娉細鏈鍚庨渶杞崲涓?D鍧愭爣銆?/p>
(楠岃瘉:Tcs鍙充箻鐐筽(xc,yc,zc,1)寰楃偣p'(xc*d*k + x0*zc, -yc*d*k + y0*zc, zc, zc),杞崲涓?D鍧愭爣涓?xc*(d/zc)*k + x0, -yc*(d/zc)*k + y0, 1)錛屾紜?
4.涓鑸儏褰細
聽************************************
瑙嗚窛涓?錛寈杞磋瑙掍負90搴︼紝灞忓箷瀹介珮涓篧,H.
************************************
聽
浠e叆d=1錛宼heta_x = PI/2,x0= W/2,y0=H/2,鍒欒騫抽潰瀹介珮涓簑idth_p = 2銆?br />瑕佺‘淇濆睆騫曚笂鐨勫浘鍍弜,y姣斾緥涓嶅け鐪燂紝鍗硆s=rp,鏈?br />height_p = 2/rp=2/rs=2H/W,
k=kx=ky=width_s/width_p = W/2.
浜庢槸,鐭╅樀涓?
Tcs1 =聽
|W/2聽聽聽 0聽聽聽聽聽聽 0 0聽 |
|0聽聽聽聽聽 -W/2聽聽聽 0 0聽 |
|W/2聽聽聽 H/2聽聽 1 1聽 |
|0聽聽聽聽聽 0聽聽聽聽聽聽聽聽 0 0聽 |
鎴?br />
聽聽 |W/2聽聽聽 0聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 0 0聽 |
|0聽聽聽聽聽 -H/2*(W/H)聽聽聽 0 0聽 |
|W/2聽聽聽 H/2聽聽聽聽聽聽聽聽聽聽聽聽聽 1 1聽 |
|0聽聽聽聽聽 0聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽0 0聽 |
(鍙互鐪嬪埌錛寉杞寸殑緙╂斁鍥犲瓙涓箻涓婁簡瀹介珮姣?aspect ratio))
聽榪欎釜鐭╅樀杈冨父鐢ㄣ?br />
---------------------
鏈変粈涔堥棶棰?嬈㈣繋鎺㈣.
聽
// INCLUDES //////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "malloc.h"
// DEFINES //////////////////////////////////////////////////////////////////////////
#define N 4
// TYPES //////////////////////////////////////////////////////////////////////////
typedef struct BLOCK_TYP
{
聽int x,y,z;
聽int area;
聽int height;
聽
聽BLOCK_TYP *pNext;
} BLOCK, *BLOCK_PTR;
typedef struct TOWER_TYP
{
聽int height;
聽int num_block;
聽BLOCK_PTR pTowerTop;
} TOWER, *TOWER_PTR;
// PROTOTYPES //////////////////////////////////////////////////////////////////////////
TOWER_PTR BuildTower(BLOCK_PTR pBlock, int n);
// FUNCTIONS //////////////////////////////////////////////////////////////////////////
int main(int argc, wchar_t* argv[])
{
聽BLOCK blocks[N] = {{1,1,1},{2,2,2},{3,3,3},{4,4,4}};
聽printf("We have %d kinds of blocks, they are:\n", N);
聽int i;
聽for(i = 0; i < N; i++)
聽{
聽 printf("(%d,%d,%d)\n", blocks[i].x, blocks[i].y, blocks[i].z);
聽}
聽printf("Building the tower of babylon...\n");
聽TOWER_PTR pT = BuildTower(blocks, N);
聽printf("The max height of tower is: %d.\nTotally %d blocks are used, they are:\n", pT->height, pT->num_block );
聽BLOCK_PTR pBlock = pT->pTowerTop;
聽for(i = 0; i < pT->num_block; i++)
聽{
聽聽聽聽聽聽聽 printf("(%d) block (%d,%d,%d), area = %d, height = %d\n", i+1, pBlock->x, pBlock->y, pBlock->z, pBlock->area, pBlock->height);聽
聽聽pBlock = pBlock->pNext;
聽}
聽getchar();
聽return 0;
}
////////////////////////////////////////////////////////////////////////////////
// Algorithm of building the Tower Of Babylon.
// Input Parameters: pBlock: pointer variable that identifies blocks sequence.
// n: int variable that identifies how many kinds of blocks.
// Output Parameters: None.
// Return: pointer variable that identifies the built tower.
////////////////////////////////////////////////////////////////////////////////
TOWER_PTR BuildTower(BLOCK_PTR pBlock, int n)
{
聽int index_block = 0;
聽TOWER_PTR pTower = new TOWER();
聽BLOCK_PTR pTop = new BLOCK();聽
聽pTower->pTowerTop = pTop;
聽// initialize tower
聽pTower->pTowerTop->x = pBlock->x;
聽pTower->pTowerTop->y = pBlock->y;
聽pTower->pTowerTop->z = pBlock->z;
聽pTower->pTowerTop->area = (pBlock->x)*(pBlock->y);
聽pTower->pTowerTop->height = pBlock->z;
聽pTower->height = pTower->pTowerTop->height;
聽pTower->num_block = 1;
聽聽聽
聽for(int i = 1; i < 3*n; i++)
聽{
聽 index_block = i/3;
聽 if (i%3 == 0) // condition 1, area = x*y, height = z.
聽 {
聽聽 (pBlock+index_block)->area = ((pBlock+index_block)->x)*((pBlock+index_block)->y);
聽聽 (pBlock+index_block)->height = (pBlock+index_block)->z;
聽 }
聽 else if (i%3 == 1) // condition 2, area = x*z, height = y.
聽 {
聽聽 (pBlock+index_block)->area = ((pBlock+index_block)->x)*((pBlock+index_block)->z);
聽聽 (pBlock+index_block)->height = (pBlock+index_block)->y;
聽 }
聽 else // condition 3, area = y*z, height = z.
聽 {
聽聽 (pBlock+index_block)->area = ((pBlock+index_block)->y)*((pBlock+index_block)->z);
聽聽 (pBlock+index_block)->height = (pBlock+index_block)->x;
聽 }
聽
聽 bool bNeedToBeAdded = true;聽
聽 BLOCK_PTR pB = pTower->pTowerTop;
聽 BLOCK_PTR pPrev = pTower->pTowerTop;
聽 while(pB != NULL)
聽 {
聽聽 if ((pBlock+index_block)->area < (pB->area))
聽聽 {
聽// insert new block
聽BLOCK_PTR pNewBlock = new BLOCK();聽
聽聽聽 *pNewBlock = *(pBlock+index_block);
聽if(pB == pPrev)
聽{
聽聽pNewBlock->pNext = pB;
聽聽pTower->pTowerTop = pNewBlock;
聽}
聽else
聽{
聽聽pNewBlock->pNext = pPrev->pNext;
聽聽pPrev->pNext = pNewBlock;
聽}
聽
聽聽聽 // increase number of blocks
聽聽聽 pTower->num_block++;
聽聽聽 // increase height of tower
聽聽聽 pTower->height += (pBlock+index_block)->height;
聽聽聽
聽聽聽 bNeedToBeAdded = false;
聽聽聽 break;
聽聽 }
聽聽 else if ((pBlock+index_block)->area == (pB->area))
聽聽 {
聽聽聽 if (pB->height < ((pBlock+index_block)->height))
聽聽聽 {
聽聽聽聽 // increase height of tower
聽聽聽聽 pTower->height += (pBlock+index_block)->height - pB->height;
聽聽聽聽 // replace blocks
聽 BLOCK_PTR pNewBlock = new BLOCK();聽
聽 *pNewBlock = *(pBlock+index_block);
聽 if (pB == pPrev)
聽 {
聽聽pNewBlock->pNext = pB->pNext;
聽聽pTower->pTowerTop = pNewBlock;
聽 }
聽 else
聽 {
聽聽 pNewBlock->pNext = pB->pNext;
聽聽 pPrev->pNext = pNewBlock;
聽 }
聽聽聽 }
聽聽聽 bNeedToBeAdded = false;
聽聽聽 break;
聽聽 }
聽聽 pPrev = pB;
聽聽 pB = pB->pNext;
聽 }
聽
聽 if(bNeedToBeAdded)
聽 {
聽聽 // add new block at the end
聽聽 BLOCK_PTR pNewBlock = new BLOCK();聽
聽聽 *pNewBlock = *(pBlock+index_block);
聽聽
聽聽 pPrev->pNext = pNewBlock;
聽聽 pNewBlock->pNext = NULL;
聽聽 // increase number of blocks
聽聽 pTower->num_block++;
聽聽 // increase height of tower
聽聽 pTower->height += (pBlock+index_block)->height;
聽 }
聽}
聽return pTower;
}
聽
聽
聽
聽
// INCLUDES ///////////////////////////////////////////////
#include "stdio.h"
// DEFINES ////////////////////////////////////////////////
#define N 11
// PROTOTYPES /////////////////////////////////////////////
void QuickSort(int *seq, int lenght);
void InsertSort(int *seq, int lenght);
void InsertSort2(int *seq, int lenght);
void ShellSort(int *seq, int lenght);
void IncrementInsertSort(int *seq, int length, int increment);
void HeapSort(int *seq, int length);
void SelectionSort(int *seq, int length);
void BubbleSort(int *seq, int length);
void BiBubbleSort(int *seq, int length);
void AdjustHeap(int *seq, int startIndex, int endIndex);
// GLOBALS ////////////////////////////////////////////////
int nAssignmentOperation = 0; // assignment counter
int nComparsionOperation = 0; // comparsion counter
// FUNCTIONS //////////////////////////////////////////////
int main(int argc, char* argv[])
{
聽printf("0: Original Sequence\n");
聽printf("1: Quick Sort\n");
聽printf("2: Insert Sort\n");
聽printf("3: Shell Sort\n");
聽printf("4: Insert Sort2\n");
聽printf("5: Heap Sort\n");
聽printf("6: Selection Sort\n");
聽printf("7: Bubble Sort\n");
聽printf("8: Bi-Bubble Sort\n");
聽printf("-1: Exit\n");聽
聽int cat = 0;聽
聽while (cat != -1)
聽{
聽聽// clear counter
聽聽nAssignmentOperation = 0;
聽聽nComparsionOperation = 0;
聽聽//int array[N] = {600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,
聽聽//600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1};
聽聽int array[N] = {600, 64,6,78,246,445,345,445,7745,4885,1};
聽聽printf("\nPlease select sort method:");
聽聽scanf("%d", &cat);
聽聽printf("-------------------------------------------------\n");
聽聽switch(cat)
聽聽{
聽聽聽case 0:printf("No Sort. The Original Sequence is\n");
聽聽聽聽break;
聽聽聽case 1:printf("Quick Sort\n"); QuickSort(array, N);
聽聽聽聽break;
聽聽聽case 2:printf("Insert Sort\n"); InsertSort(array, N);
聽聽聽聽break;
聽聽聽case 3:printf("Shell Sort\n"); ShellSort(array, N);
聽聽聽聽break;
聽聽聽case 4:printf("Insert Sort2\n"); InsertSort2(array, N);
聽聽聽聽break;
聽聽聽case 5:printf("Heap Sort\n"); HeapSort(array, N);
聽聽聽聽break;
聽聽聽case 6:printf("Selection Sort\n"); SelectionSort(array, N);
聽聽聽聽break;
聽聽聽case 7:printf("Bubble Sort\n"); BubbleSort(array, N);
聽聽聽聽break;
聽聽聽case 8:printf("Bi-Bubble Sort\n"); BiBubbleSort(array, N);
聽聽聽聽break;
聽聽聽default:printf("Exit...\n");
聽聽聽聽return 0;
聽聽}
聽聽for(int i = 0; i < N; i++)
聽聽{
聽聽聽printf("int = %d\n", array[i]);
聽聽}
聽聽printf("Count of comparsion operation聽 = %d\n", nComparsionOperation);
聽聽printf("Count of assignment operation聽 = %d\n", nAssignmentOperation);
聽聽printf("-------------------------------------------------\n");
聽}
聽return 0;
}
inline void Swap(int *pCurrPost, int *pCurrKey)
{
聽nAssignmentOperation += 3;
聽int temp;
聽//swap value
聽temp = *pCurrPost;
聽*pCurrPost = *pCurrKey;
聽*pCurrKey = temp;
}
////////////////////////////////////////////////////////////////////////////////
// Quick Sort algorithm.聽 (By SoRoMan, 2006.7.31)
// 蹇熸帓搴忕殑鍩烘湰鎬濇兂鏄熀浜庡垎娌葷瓥鐣ョ殑銆傚浜庤緭鍏ョ殑瀛愬簭鍒桳[p..r]錛屽鏋滆妯¤凍澶熷皬鍒欑洿鎺ヨ繘琛屾帓搴忥紙姣斿鐢ㄥ墠榪扮殑鍐掓場銆侀夋嫨銆佹彃鍏ユ帓搴忓潎鍙級錛屽惁鍒欏垎涓夋澶勭悊錛?br />// 1.鍒嗚В(Divide)錛氬皢寰呮帓搴忓垪L[p..r]鍒掑垎涓轟袱涓潪絀哄瓙搴忓垪L[p..q]鍜孡[q+1..r]錛屼嬌L[p..q]涓換涓鍏冪礌鐨勫間笉澶т簬L[q+1..r]涓換涓鍏冪礌鐨勫箋傚叿浣撳彲閫氳繃榪欐牱鐨勯斿緞瀹炵幇錛氬湪搴忓垪L[p..r]涓夋嫨鏁版嵁鍏冪礌L[q]錛岀粡姣旇緝鍜岀Щ鍔ㄥ悗錛孡[q]灝嗗浜嶭[p..r]涓棿鐨勯傚綋浣嶇疆錛屼嬌寰楁暟鎹厓绱燣[q]鐨勫煎皬浜嶭[q+1..r]涓換涓鍏冪礌鐨勫箋?
// 2.閫掑綊姹傝В(Conquer)錛氶氳繃閫掑綊璋冪敤蹇熸帓搴忕畻娉曪紝鍒嗗埆瀵筁[p..q]鍜孡[q+1..r]榪涜鎺掑簭銆?
// 3.鍚堝茍(Merge)錛氱敱浜庡鍒嗚В鍑虹殑涓や釜瀛愬簭鍒楃殑鎺掑簭鏄氨鍦拌繘琛岀殑錛屾墍浠ュ湪L[p..q]鍜孡[q+1..r]閮芥帓濂藉簭鍚庝笉闇瑕佹墽琛屼換浣曡綆桳[p..r]灝卞凡鎺掑ソ搴忥紝鍗寵嚜鐒跺悎騫躲?
// 榪欎釜瑙e喅嫻佺▼鏄鍚堝垎娌繪硶鐨勫熀鏈楠ょ殑銆傚洜姝わ紝蹇熸帓搴忔硶鏄垎娌繪硶鐨勭粡鍏稿簲鐢ㄥ疄渚嬩箣涓銆?br />// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void QuickSort(int *seq, int length)
{
聽if(length <= 1)
聽{
聽聽return;
聽}
聽else
聽{
聽聽int post = *seq; // set post
聽聽int *pCurrPost = seq; // set current position of post
聽聽int *pCurrKey; // current position of key
聽聽for(int j = length - 1, i = 1; i <= j;)
聽聽{
聽聽聽// handle the right sub-sequence
聽聽聽while(i <= j)
聽聽聽{
聽聽聽聽pCurrKey = seq + j;
聽聽聽聽if(*pCurrKey < post)
聽聽聽聽{
聽聽聽聽聽Swap(pCurrPost, pCurrKey);
聽聽聽聽聽pCurrPost = pCurrKey;
聽聽聽聽聽break;
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽j--;
聽聽聽聽}
聽聽聽聽nComparsionOperation ++;
聽聽聽}
聽聽聽// handle the left sub-sequence
聽聽聽while(i <= j)
聽聽聽{
聽聽聽聽pCurrKey = seq + i;
聽聽聽聽if(*pCurrKey > post)
聽聽聽聽{
聽聽聽聽聽Swap(pCurrPost, pCurrKey);
聽聽聽聽聽pCurrPost = pCurrKey;
聽聽聽聽聽break;
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽i++;
聽聽聽聽}
聽聽聽聽nComparsionOperation ++;
聽聽聽}
聽聽}
聽聽// handle two sub sequences recursively
聽聽int lleng = pCurrPost - seq; // left sub sequence
聽聽int rleng = length - lleng - 1; // right sub sequence
聽聽QuickSort(seq, lleng);
聽聽QuickSort(seq + lleng + 1, rleng);
聽}
}
////////////////////////////////////////////////////////////////////////////////
// Insert Sort algorithm (A special increment insert sort, increment = 1).聽 (By SoRoMan, 2006.7.31)
//鎻掑叆鎺掑簭鐨勫熀鏈濇兂鏄紝緇忚繃i-1閬嶅鐞嗗悗,L[1..i-1]宸辨帓濂藉簭銆傜i閬嶅鐞嗕粎灝哃[i]鎻掑叆L[1..i-1]鐨勯傚綋浣嶇疆錛屼嬌寰桳[1..i]鍙堟槸鎺掑ソ搴忕殑搴忓垪銆傝杈懼埌榪欎釜鐩殑錛屾垜浠彲浠ョ敤欏哄簭姣旇緝鐨勬柟娉曘傞鍏堟瘮杈僉[i]鍜孡[i-1]錛屽鏋淟[i-1]鈮?L[i]錛屽垯L[1..i]宸叉帓濂藉簭錛岀i閬嶅鐞嗗氨緇撴潫浜嗭紱鍚﹀垯浜ゆ崲L[i]涓嶭[i-1]鐨勪綅緗紝緇х畫姣旇緝L[i-1]鍜孡[i-2]錛岀洿鍒版壘鍒版煇涓涓綅緗甹(1鈮鈮-1)錛屼嬌寰桳[j] 鈮[j+1]鏃朵負姝€?br />//綆璦涔?鎻掑叆鎺掑簭灝辨槸姣忎竴姝ラ兘灝嗕竴涓緟鎺掓暟鎹寜鍏跺ぇ灝忔彃鍏ュ埌宸茬粡鎺掑簭鐨勬暟鎹腑鐨勯傚綋浣嶇疆錛岀洿鍒板叏閮ㄦ彃鍏ュ畬姣曘傛彃鍏ユ帓搴忔柟娉曞垎鐩存帴鎻掑叆鎺掑簭鍜屾姌鍗婃彃鍏ユ帓搴忎袱縐嶏紝榪欓噷鍙粙緇嶇洿鎺ユ彃鍏ユ帓搴忥紝鎶樺崐鎻掑叆鎺掑簭鐣欏埌鈥滄煡鎵鋸濆唴瀹逛腑榪涜
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void InsertSort(int *seq, int length)
{
聽IncrementInsertSort(seq, length, 1);
}
void InsertSort2(int *seq, int length)
{
聽for(int i = 1; i < length; i++)
聽{
聽聽for (int j = 0; j < i; j++)
聽聽{
聽聽聽if(*(seq + i) < *(seq + j))
聽聽聽{聽
聽聽聽聽int temp = *(seq + i);
聽聽聽聽nAssignmentOperation ++;
聽聽聽聽// insert, move (i-j) items
聽聽聽聽for(int k = i; k > j; k-- )
聽聽聽聽{
聽聽聽聽聽*(seq + k) = *(seq + k - 1);
聽聽聽聽聽nAssignmentOperation ++;
聽聽聽聽}
聽聽聽聽*(seq + k) = temp;
聽聽聽聽nAssignmentOperation ++;
聽聽聽聽nComparsionOperation ++;
聽聽聽聽break;
聽聽聽}
聽聽}
聽}
}
void IncrementInsertSort(int *seq, int length, int increment)
{
聽for(int k = 0; k < increment; k++)
聽{
聽聽for (int i = increment + k; i < length; i+=increment + k)
聽聽{
聽聽聽int temp = *(seq + i);
聽聽聽for (int j = i; j > increment - 1;)
聽聽聽{
聽聽聽聽nComparsionOperation ++;
聽聽聽聽if(temp > *(seq + j - increment))
聽聽聽聽{聽聽聽聽
聽聽聽聽聽*(seq + j) = *(seq + j - increment);
聽聽聽聽聽nAssignmentOperation ++;
聽聽聽聽聽j-=increment;
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽break;
聽聽聽聽}
聽聽聽}
聽聽聽*(seq + j) = temp;
聽聽聽nAssignmentOperation ++;聽聽聽聽
聽聽}
聽}聽
}
////////////////////////////////////////////////////////////////////////////////
// Shell Sort algorithm (Increment insert sort, increment = increment/3 + 1.).聽 (By SoRoMan, 2006.7.31)
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void ShellSort(int *seq, int length)
{
聽for(int increment = length; increment > 1;)
聽{
聽聽increment = increment/3 + 1;
聽聽IncrementInsertSort(seq, length, increment);
聽}
}
////////////////////////////////////////////////////////////////////////////////
// Heap Sort algorithm.聽 (SoRoMan, 2006.7.31)
//
//1.鍫嗙殑姒傚康錛?br />//鍫嗘槸涓涓叧閿瓧搴忓垪{k1,k2,鈥?kn},瀹冨叿鏈夊涓嬬壒鎬э細
//ki 鈮2i, ki 鈮?k2i+1
//鎴杒i 鈮?k2i,ki 鈮?k2i+1(i=1,2,鈥? 鈹攏/2鈹?
//鍫嗙殑鐗規(guī)у湪瀹屽叏浜屽弶鏍戜腑瑙i噴涓猴細瀹屽叏浜屽弶鏍戜腑浠諱竴緇撶偣鐨勫叧閿瓧閮藉皬浜庣瓑浜庯紙鎴栧ぇ浜庣瓑浜庯級瀹冪殑宸﹀彸瀛╁瓙鐨勫叧閿瓧銆?br />//濡備笅鍒楀叧閿瓧搴忓垪鍧囨槸鍫嗭細 {5,23,16,68,94,72,71,73} (灝忛《鍫? {96,83,27,38,11,9} 錛堝ぇ欏跺爢錛?鐢卞爢鐨勫畾涔夊彲鐭ワ細鑻ュ叧閿瓧搴忓垪{k1,k2,鈥?kn}鏄爢錛屽垯鍫嗛《鍏冪礌鏄痭涓厓绱犲簭鍒椾腑鐨勬渶灝忥紙鎴栨渶澶э級鍏冪礌銆?/p>
//2.鍩烘湰鎬濇兂錛?br />//棣栧厛灝嗗垵濮嬪緟鎺掑簭璁板綍搴忓垪寤哄爢錛屽垯鍫嗛《鍏冪礌蹇呬負鍚渶澶у叧閿瓧鎴栨渶灝忓叧閿瓧鐨勮褰曪紝杈撳嚭璇ヨ褰曪紝鐒跺悗灝嗗墿浣欒褰曞啀璋冩暣涓哄爢錛屽姝ゅ弽澶嶏紝鐩磋嚦鎺掑簭緇撴潫銆?br />//鍦ㄥ爢鎺掑簭涓昏闇瑙e喅涓や釜闂錛?br />//鈶?濡備綍寤哄爢錛?鍦ㄥ畬鍏ㄤ簩鍙夋爲涓紝鎵鏈夊簭鍙穒>鈹攏/2鈹樼殑緇撶偣閮芥槸鍙跺瓙錛屽洜姝わ紝浠ヨ繖浜涚粨鐐逛負鏍圭殑瀛愭爲鍧囧凡鏄爢錛岃繖鏍峰彧闇灝嗕互搴忓彿涓衡敂n/2鈹? 鈹攏/2鈹?1, 鈹攏/2鈹?2,鈥?1鐨勭粨鐐逛負鏍廣佺殑瀛愭爲閮借皟鏁翠負鍫嗗嵆鍙傚湪鎸夋嬈″簭璋冩暣姣忎釜緇撶偣鏃訛紝鍏跺乏銆佸彸瀛愭爲鍧囧凡鏄爢銆?br />//鈶?鑻i鐨勫乏銆佸彸瀛愭爲宸茬粡鏄爢錛屽浣曞皢浠i涓烘牴鐨勫畬鍏ㄤ簩鍙夋爲涔熻皟鏁翠負鍫嗭紵 鍥爇i鐨勫乏銆佸彸瀛愭爲宸茬粡鏄爢錛屾墍浠ュ繀欏誨湪ki 鍜屽畠鐨勫乏銆佸彸瀛╁瓙涓夊嚭鏈灝忥紙鎴栨渶澶э級鐨勭粨鐐規(guī)斁鍒発i鐨勪綅緗笂錛屼笉濡ㄨk2I鍏抽敭瀛楁渶灝忥紝灝唊i涓巏2I浜ゆ崲浣嶇疆錛岃屼氦鎹箣鍚庢湁鍙兘瀵艱嚧浠2I涓烘牴鐨勫瓙鏍戜笉鍐嶄負鍫嗭紝浜庢槸鍙噸澶嶄笂榪拌繃紼嬶紝灝嗕互k2I涓烘牴鐨勫瓙鏍戣皟鏁翠負鍫嗭紝鈥︹?濡傛閫愬眰涓嬪幓錛屾渶澶氬彲鑳戒竴鐩磋皟鏁村埌鏍戝彾錛屾鏂規(guī)硶縐頒負"絳涢夋硶"銆?/p>
//3.鎬ц兘鍒嗘瀽錛?br />//鍫嗘帓搴忕殑鏃墮棿涓昏鐢卞緩绔嬪垵濮嬪爢鍜屼笉鏂噸澶嶅緩鍫嗚繖涓ら儴鍒嗙殑鏃墮棿寮閿鏋勬垚銆傚叾涓細寤虹珛鍒濆鍫嗘椂錛屾誨叡闇榪涜鐨勫叧閿瓧姣旇緝嬈℃暟 鈮?4n =O(n) ;鎺掑簭榪囩▼涓繘琛宯-1嬈¢噸寤哄爢鎵榪涜鐨勬繪瘮杈冩鏁頒笉瓚呰繃涓嬪紡錛?2*(鈹?log2(n-1) 鈹?鈹?log2(n-2) 鈹?鈥? 鈹?log22 鈹? < 2n 鈹?log2n 鈹?O(n log2n)鍥犳鍫嗘帓搴忔葷殑鏃墮棿澶嶆潅搴︽槸 O(n+ n log2n)= O(n log2n)銆?br />//鍫嗘帓搴忓湪鏈鍧忔儏鍐典笅鐨勬椂闂村鏉傚害涔熸槸O(nlog2n)錛岀浉瀵逛簬蹇熸帓搴忔潵璇達紝榪欐槸鍫嗘帓搴忕殑鏈澶т紭鐐廣?br />//鍙﹀錛屽爢鎺掑簭浠呴渶涓涓褰曞ぇ灝忎緵浜ゆ崲鐢ㄧ殑杈呭姪絀洪棿銆傜敱浜庡緩鍒濆鍫嗘墍闇鐨勬瘮杈冩鏁拌緝澶氾紝鎵浠ュ爢鎺掑簭涓嶉傚疁浜庤褰曡緝?yōu)畱鐨勬枃錃g錛屼絾瀵筺杈冨ぇ鐨勬枃浠惰繕鏄緢鏈夋晥鐨勩?br />// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void HeapSort(int *seq, int length)
{
聽for(int n = length; n > 0; n--)
聽{
聽聽for(int j = n/2; j > 0; j--)
聽聽{
聽聽聽AdjustHeap(seq, j, n);
聽聽}
聽聽Swap(seq, seq+n-1);聽聽
聽}聽
}
void AdjustHeap(int *seq, int startIndex, int endIndex)
{
聽while(2*startIndex <= endIndex)
聽{
聽聽int i =聽 startIndex - 1;
聽聽startIndex = startIndex*2;
聽聽nComparsionOperation ++;
聽聽if (startIndex < endIndex && *(seq + startIndex -1) < *(seq + startIndex))
聽聽{
聽聽聽startIndex++;
聽聽}
聽聽nComparsionOperation ++;
聽聽if(*(seq + startIndex -1) > *(seq + i))
聽聽{
聽聽聽Swap(seq + startIndex - 1, seq + i);
聽聽}聽聽
聽聽else
聽聽{
聽聽聽break;
聽聽}
聽}
}
////////////////////////////////////////////////////////////////////////////////
// Selection Sort algorithm.聽 (SoRoMan, 2006.7.31)
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void SelectionSort(int *seq, int length)
{
聽for(int i = 0; i < length; i++)
聽{
聽聽int k = i;
聽聽for(int j = i+1; j < length; j++)
聽聽{
聽聽聽nComparsionOperation ++;
聽聽聽if (*(seq + j) < *(seq + k))
聽聽聽{
聽聽聽聽k = j;
聽聽聽}
聽聽}
聽聽Swap(seq + k, seq + i);
聽}
}
////////////////////////////////////////////////////////////////////////////////
// Bubble Sort algorithm.聽 (SoRoMan, 2006.7.31)
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void BubbleSort(int *seq, int length)
{
聽for(int i = 0; i < length; i++)
聽{
聽聽for(int j = length-1; j > i; j--)
聽聽{
聽聽聽nComparsionOperation ++;
聽聽聽if (*(seq + j) < *(seq + j - 1))
聽聽聽{
聽聽聽聽Swap(seq + j, seq + j - 1);
聽聽聽}
聽聽}
聽}
}
////////////////////////////////////////////////////////////////////////////////
// Bi-Directinal Bubble Sort algorithm.聽 (SoRoMan, 2006.7.31)
//鎬濇兂錛?br />//鍩轟簬鍦ㄤ竴瓚熸帓搴忎腑錛屼綅浜庢渶鍚庝竴嬈′氦鎹㈠叧閿瓧鐨勭殑鍚庨潰鐨勫叧閿瓧搴忓垪宸茬粡鏄湁搴忕殑錛屾墍浠ヤ笉鐢ㄥ啀鎺掑簭銆?br />//鐩稿浜庝竴鑸殑鍐掓場鎺掑簭錛屽彲浠ュ噺灝戝叧閿瓧姣旇緝嬈℃暟錛屼絾浜ゆ崲嬈℃暟涓嶅彉銆?br />// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void BiBubbleSort(int *seq, int length)
{
聽int k,low,up;
聽low = 0;
聽up = length-1;
聽while (up > low)
聽{
聽聽k = low;聽聽
聽聽for(int i = low; i < up; i++)
聽聽{
聽聽聽nComparsionOperation ++;
聽聽聽if (*(seq + i) > *(seq + i + 1))
聽聽聽{
聽聽聽聽Swap(seq + i, seq + i + 1);
聽聽聽聽k = i;
聽聽聽}
聽聽}
聽聽up = k;
聽聽for(int j = up; j > low; j--)
聽聽{
聽聽聽nComparsionOperation ++;
聽聽聽if (*(seq + j) < *(seq + j - 1))
聽聽聽{
聽聽聽聽Swap(seq + j, seq + j - 1);
聽聽聽聽k = j;
聽聽聽}
聽聽}聽
聽聽low = k;
聽}
}
聽
聽
聽
鍩烘湰涓夿resenham鐢葷嚎綆楁硶鐨勬濊礬濡備笅:
// 鍋囪璇ョ嚎孌典綅浜庣涓璞¢檺鍐呬笖鏂滅巼澶т簬0灝忎簬1,璁捐搗鐐逛負(x1,y1),緇堢偣涓?x2,y2).
// 鏍規(guī)嵁瀵圭О鎬?鍙帹瀵艱嚦鍏ㄨ薄闄愬唴鐨勭嚎孌?
1.鐢昏搗鐐?x1,y1).
2.鍑嗗鐢諱笅涓偣銆倄鍧愭爣澧?錛屽垽鏂鏋滆揪鍒扮粓鐐癸紝鍒欏畬鎴愩傚惁鍒欙紝鐢卞浘涓彲鐭?涓嬩釜瑕佺敾鐨勭偣瑕佷箞涓哄綋鍓嶇偣鐨勫彸閭繪帴鐐?瑕佷箞鏄綋鍓嶇偣鐨勫彸涓婇偦鎺ョ偣.
2.1.濡傛灉綰挎ax+by+c=0涓巟=x1+1鐨勪氦鐐圭殑y鍧愭爣澶т簬M鐐圭殑y鍧愭爣鐨勮瘽,涓嬩釜鐐逛負U(x1+1,y1+1)
2.2.鍚﹀垯,涓嬩釜鐐逛負B(x1+1,y1+1)
3.鐢葷偣(U鎴栬匓).
4.璺沖洖絎?姝?
5.緇撴潫.
榪欓噷闇瑕佺粏鍖栫殑鏄庝箞鍒ゆ柇涓嬩釜瑕佺敾鐨勭偣涓哄綋鍓嶇偣鐨勫彸閭繪帴鐐硅繕鏄綋鍓嶇偣鐨勫彸涓婇偦鎺ョ偣.
璁劇嚎孌墊柟紼嬶細ax+by+c=0(x1<x<x2,y1<y<y2)
浠x=x2-x1,dy=y2-y1
鍒欙細鏂滅巼-a/b = dy/dx.
浠庣涓涓偣寮濮嬶紝鎴戜滑鏈塅(x,1,y1) = a*x1+b*y1+c=0
涓嬮潰姹傜嚎孌礱x+by+c=0涓巟=x1+1鐨勪氦鐐?
鐢盿*(x1+1)+b*y+c = 0, 姹傚嚭浜ょ偣鍧愭爣y=(-c-a(x1+1))/b
鎵浠ヤ氦鐐逛笌M鐨剏鍧愭爣宸糞ub1 = (-c-a(x1+1))/b - (y1+0.5) = -a/b-0.5錛屽嵆Sub1鐨勫濮嬪間負-a/b-0.5銆?/p>
鍒欏彲寰楁潯浠跺綋 Sub1 = -a/b-0.5>0鏃跺?鍗充笅涓偣涓篣.
鍙嶄箣,涓嬩釜鐐逛負B.
浠e叆a/b,鍒橲ub1 = dy/dx-0.5.
鍥犱負鏄釜寰幆涓兘瑕佸垽鏂璖ub,鎵浠ュ緱姹傚嚭寰幆涓嬬殑Sub琛ㄨ揪寮?鎴戜滑鍙互姹傚嚭Sub鐨勫樊鍊肩殑琛ㄨ揪寮?涓嬮潰姹倄=x1+2鏃剁殑Sub錛屽嵆Sub2
1.濡傛灉涓嬩笅涓偣鏄笅涓偣鐨勫彸涓婇偦鎺ョ偣錛屽垯
Sub2 = (-c-a(x1+2))/b - (y1+1.5) = -2a/b - 1.5
鏁匰ub宸糄sub = Sub2 - Sub1 = -2a/b - 1.5 - (-a/b-0.5) = -a/b - 1.浠e叆a/b寰桪sub = dy/dx -1;
2.濡傛灉涓嬩笅涓偣鏄笅涓偣鐨勫彸閭繪帴鐐癸紝
Sub2 = (-c-a(x1+2))/b - (y1+0.5) = -2a/b - 0.5
鏁匰ub宸糄sub = Sub2 - Sub1 = -2a/b - 0.5 - (-a/b-0.5) = -a/b. 浠e叆a/b寰桪sub = dy/dx;
浜庢槸錛屾垜浠湁浜哠ub鐨勫濮嬪糞ub1 = -a/b-0.5 = dy/dx-0.5,鍙堟湁浜哠ub鐨勫樊鍊肩殑琛ㄨ揪寮廌sub = dy/dx -1 錛堝綋Sub1 > 0錛夋垨 dy/dx錛堝綋Sub1 < 0錛?緇嗗寲宸ヤ綔瀹屾垚銆?/p>
浜庢槸pcode鍙互緇嗗寲濡備笅錛?/strong>
// Pcode for Bresenham Line
// By SoRoMan
x=x1;
y=y1;
dx = x2-x1;
dy = y2-y1;
Sub = dy/dx-0.5; // 璧嬪垵鍊鹼紝涓嬩釜瑕佺敾鐨勭偣涓庝腑鐐圭殑宸?/p>
DrawPixel(x, y); // 鐢昏搗鐐?br />while(x<x2)
{
聽x++;
聽if(Sub > 0) // 涓嬩釜瑕佺敾鐨勭偣涓哄綋鍓嶇偣鐨勫彸涓婇偦鎺ョ偣
聽{
聽 Sub += dy/dx - 1; //涓嬩笅涓鐢葷殑鐐逛笌涓偣鐨勫樊鍊?br />聽 y++; // 鍙充笂閭繪帴鐐箉闇澧?
聽}
聽else// 涓嬩釜瑕佺敾鐨勭偣涓哄綋鍓嶇偣鐨勫彸閭繪帴鐐?br />聽{
聽 Sub += dy/dx;聽
聽}
// 鐢諱笅涓偣
DrawPixel(x,y);
}
PS:涓鑸紭鍖栵細
涓洪伩鍏嶅皬鏁拌漿鏁存暟浠ュ強闄ゆ硶榪愮畻錛岀敱浜嶴ub鍙槸鐢ㄦ潵榪涜姝h礋鍒ゆ柇錛屾墍浠ュ彲浠ヤ護Sub = 2*dx*Sub = 2dy-dx,鍒?br />鐩稿簲鐨凞Sub = 2dy - 2dx鎴?dy.
鎬濊?:濡傛灉Sub = 0鏃訛紝浼氫駭鐢熷彇涓や釜鐐歸兘鍙互鐨勯棶棰樸傝繖涓棶棰樿繕娌℃繁鍏ャ?/p>
鎬濊冿細璁$畻鏈哄浘褰㈠涓殑宸︿笂鍍忕礌濉厖綰﹀畾錛坱op-left filling convention for filling geometry錛?/strong>
聽 0 1聽2 D3D, GDI, OpenGL絳夊浘褰㈠簱浣跨敤宸︿笂濉厖綰﹀畾鐨勶紝濡傛灉鎺ヨЕ榪囪繖浜涘浘褰㈠簱錛屼綘鍙兘浼氱煡閬撹繖涓害瀹氥傝繕璁板緱鐢諱竴涓叏灞忓箷鐨勭煩褰㈠惂錛欴rawRectangle(0, 0, Screen_Width-1, Screen_Height-1)銆?br />
鎴戜滑鐭ラ亾鐩墠鏄劇ず鍣ㄦ樉紺虹殑鍘熺悊錛屽厜鏍呭寲鏄劇ず鏈灝忕殑鍗曞厓鏄痯ixel(鎴栬呰綺懼害涓簆iexl錛夛紝涓涓猵ixel鎵鍗犵殑鍖哄煙涓鑸槸涓鏂瑰艦錛屾樉紺哄櫒涓婄殑鐢婚潰灝辯敱涓涓垨澶氫釜榪欐牱鐨勫皬鏂規(guī)牸緇勬垚銆傚鏋滀互姣忎釜灝忔柟鏍間負涓涓崟鍏冩潵鍒跺畾灞忓箷鍧愭爣鐨勮瘽錛岄棶棰樺氨鏉ヤ簡錛屽洜涓烘柟鏍兼湰韜湁澶у皬錛屼笉鏄竴涓弗鏍兼剰涔変笂鐨?鐐?銆?br />
闂鏉ユ簮錛氬睆騫曞潗鏍囩偣鐨勯夊彇浠ュ強鍍忕礌鏂規(guī)牸鏈韓鐨勫ぇ灝?/strong>
濡傛灉浠ユ柟鏍間腑蹇冪偣涓哄熀鍑嗗埗瀹氬潗鏍囩偣錛堝嵆瀵逛簬浠繪剰涓鏁存暟鍧愭爣鐐筽(x,y),p蹇呬負鏌愪釜鍍忕礌鏂規(guī)牸鐨勪腑蹇冿級錛屼互涓涓柟鏍間負璺ㄥ害鏉ュ埗瀹氬睆騫曞潗鏍囩郴鐨勮瘽銆傚鍥撅紝灞忓箷涓?X3鐨勬柟鏍肩粍鎴愪竴涓鏂瑰艦鐨勭敾闈紝濡傛灉鎸夌収鏂規(guī)牸涓績鐐逛負鍩哄噯鍒跺畾鍧愭爣鐐癸紝鍏跺尯鍩熷睆騫曞潗鏍囦負錛?錛?錛?錛?錛夛紙娉ㄦ剰錛?錛?錛?閮戒綅浜庢柟鏍間腑蹇冿紝鍏朵腑錛屽乏涓婅鍧愭爣涓?0,0)錛屽彸涓嬭鍧愭爣涓猴紙2錛?錛夛級錛岃屾寜鐓ф暟瀛﹁繍綆楋紝鍏朵笂涓嬭法璺濆氨鏄?-0 = 2 pixels錛屽乏鍙寵法璺?-0 = 2 pixels錛屽嵆鎬誨叡鍖呭惈2X2=4涓柟鏍?鑰屽疄闄呯敾闈腑鐨勮法璺濇槸3X3錛屽嵆鍏卞寘鍚?涓柟鏍鹼紙浠庢渶宸︿笂绔埌鏈鍙充笅绔級錛岄棶棰樻潵浜嗭紝鍓嶅悗鐭涚浘浜嗐傚乏涓婂儚绱犲~鍏呯害瀹氬彲浠ヨВ鍐寵繖涓棶棰樸?br />
闂瑙e喅錛氬乏涓婂儚绱犲~鍏呯害瀹?/strong>
榪樻槸涓懼垰鎵嶇殑渚嬪瓙錛屽鏋滅粰瀹氬乏涓婅鍧愭爣涓?0,0)錛屽彸涓嬭鍧愭爣涓猴紙2錛?錛夌殑鐭╁艦鍖哄煙錛屽彨鏄劇ず璁懼鍘葷粯鍒剁殑璇濓紝鎸夌収宸︿笂鍍忕礌濉厖綰﹀畾錛屽湪灞忓箷涓婂~鍏呯殑鍍忕礌鐐瑰皢鏄?錛?錛?錛?錛?錛?錛?錛?錛?錛?錛?錛?錛夎繖涓?X2鍖哄煙錛岃岄潪鍥句腑鎵紺虹殑3X3鍖哄煙銆傚弽榪囨潵璇村浘涓墍紺虹殑3X3鍖哄煙瑕佺敤鍧愭爣琛ㄧず鐨勮瘽搴旇鏄紙0錛?錛?錛?錛夈傜畝鍗曟潵璇達紝鍦ㄥ乏涓婂儚绱犲~鍏呯害瀹氫笅錛岃濉厖錛坸1,y1,x2,y2錛夛紙x1,y1,x2,y2涓烘暣鏁幫級鐨勭煩褰紝瀹為檯濉厖鐨勫尯鍩熶細鏄紙x1-0.5,y1-0.5,x2-0.5,y2-0.5錛?榪欎釜鍖哄煙鐨勫乏涓婅鍍忕礌鍧愭爣涓猴紙x1,y1錛?鍙充笅瑙掑儚绱犲潗鏍囦負(x2-1,y2-1)錛屽嵆瀹為檯鐨勫~鍏呭尯鍩熶細鍚戝乏鍜屽悜涓婂悇鍋忕Щ0.5涓儚绱犮傛晠縐板乏涓婂儚绱犲~鍏呯害瀹氥?/p>
聽聽 0 鍙e彛鍙?br />聽聽 1 鍙e彛鍙?br />聽聽 2 鍙e彛鍙?br />
鎯蟲硶涓錛?/strong>鎯沖埌鍒殑濉厖綰﹀畾錛屾瘮濡傚彸涓婏紝宸︿笅錛屽彸涓嬬瓑錛岃繖浜涗笉鐭ラ亾鏈夊摢浜涚郴緇熶嬌鐢ㄣ?br />
鎯蟲硶浜岋細濡傛灉浠ュ儚绱犳柟鏍肩殑宸︿笂瑙掍負鍩哄噯鍒跺畾鍧愭爣鐐癸紙鍗沖浜庝換鎰忎竴鏁存暟鍧愭爣鐐筽(x,y),p蹇呬負鏌愪釜鍍忕礌鏂規(guī)牸鐨勫乏涓婅錛夛紝鎯呭喌鎬庝箞鏍鳳紵榪欐椂錛岀粰瀹氾紙0錛?錛?錛?錛夛紝鍒欏~鍏呮椂鍙互榪樹細閬囧埌涓鏍風殑闂錛屽~鍏咃紙0錛?錛?錛?錛?錛?錛?錛?錛?錛?錛?錛夛紝錛?錛?錛夛紝錛?錛?錛夛紝錛?錛?錛夛紝錛?錛?錛夛紝錛?錛?錛夛紝鏈鍚庤繕鏄寘鍚簡3X3= 9涓儚绱犮?br />
鎯蟲硶涓夛細
to be continued...
]]>