版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)?zāi)康模褐本€段的裁剪:編碼裁剪算法,中點(diǎn)分割裁剪算法。二、實(shí)驗(yàn)內(nèi)容://BasicGraph.cpp//請(qǐng)將下列裁剪程序補(bǔ)充完整,并用注釋說明是何種裁剪算法voidEncode(intx,inty,int*code,intXL,intXR,intYB,intYT){//請(qǐng)將此程序補(bǔ)充完整intc=0;if(x<XL)c=c|LEFT;elseif(x>XR)c=c|RIGHT;if(y<YB)c=c|BOTTOM;elseif(y>YT)c=c|TOP;(*code)=c;}//編碼裁剪算法:voidC_S_Line(POINT&p1,POINT&p2,intXL,intXR,intYB,intYT){//請(qǐng)將此程序補(bǔ)充完整intx1,x2,y1,y2,x,y,code1,code2,code;x1=p1.x;x2=p2.x;y1=p1.y;y2=p2.y;Encode(x1,y1,&code1,XL,XR,YB,YT);Encode(x2,y2,&code2,XL,XR,YB,YT);while(code1!=0||code2!=0) {if((code1&code2)!=0)return;code=code1;if(code1==0)code=code2;if((LEFT&code)!=0) {x=XL;y=y1+(y2-y1)*(XL-x1)/(x2-x1);}elseif((RIGHT&code)!=0) {x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x1);}if((BOTTOM&code)!=0) {y=YB;x=x1+(x2-x1)*(YB-y1)/(y2-y1);}elseif((TOP&code)!=0) {y=YT;x=x1+(x2-x1)*(YT-y1)/(y2-y1);}if(code==code1) {x1=x;y1=y;Encode(x,y,&code1,XL,XR,YB,YT);}else {x2=x;y2=y;Encode(x,y,&code2,XL,XR,YB,YT);} }p1.x=x1;p1.y=y1;p2.x=x2;p2.y=y2;}intIsInArea(POINTpoint,intXL,intXR,intYB,intYT){//請(qǐng)將此程序補(bǔ)充完整if(point.x>=XL&&point.x<=XR&&point.y>YB&&point.y<YT)return1;elsereturn0;}intNotIntersect(POINTbegin,POINTend,intXL,intXR,intYB,intYT){ //請(qǐng)將此程序補(bǔ)充完整intmaxx,maxy,minx,miny;maxx=(begin.x>end.x)?begin.x:end.x;minx=(begin.x<end.x)?begin.x:end.x;maxy=(begin.y>end.y)?begin.y:end.y;miny=(begin.y<end.y)?begin.y:end.y;if(maxx<XL||minx>XR||maxy<YB||miny>YT)return1;elsereturn0;}//中點(diǎn)裁剪算法:POINTClipMid(POINTbegin,POINTend,intXL,intXR,intYB,intYT){//請(qǐng)將此程序補(bǔ)充完整POINTmid,temp;if(IsInArea(begin,XL,XR,YB,YT))temp=begin;elseif(NotIntersect(begin,end,XL,XR,YB,YT))temp=begin;else{mid.x=(begin.x+end.x)/2;mid.y=(begin.y+end.y)/2;if(abs(mid.x-end.x)<=1&&abs(mid.y-end.y)<=1)temp=mid;else{if(NotIntersect(begin,mid,XL,XR,YB,YT))temp=ClipMid(mid,end,XL,XR,YB,YT);elsetemp=ClipMid(begin,mid,XL,XR,YB,YT);}}returntemp;}//Liang-Barsky直線裁剪算法:voidClipParameter(POINT&p1,POINT&p2,intXL,intXR,intYB,intYT){ floatu1=0.0,u2=1.0; floatdx=p2.x-p1.x,dy=p2.y-p1.y; if(clipTest(-dx,p1.x-XL,&u1,&u2)) if(clipTest(dx,XR-p1.x,&u1,&u2)) if(clipTest(-dy,p1.y-YB,&u1,&u2)) if(clipTest(dy,YT-p1.y,&u1,&u2)) { if(u2<1.0) { p2.x=p1.x+u2*dx; p2.y=p1.y+u2*dy; } if(u1>0.0) { p1.x=p1.x+u1*dx; p1.y=p1.y+u1*dy; } }}intclipTest(floatp,floatq,float*u1,float*u2){ floatr; intremainFlag=1; if(p<0.0) { r=q/p; if(r>*u2)remainFlag=0; elseif(r>*u1)*u1=r; } elseif(p>0.0) { r=q/p; if(r<*u1)remainFlag=0; elseif(r<*u2)*u2=r; }else//*p=0 if(q<0.0)remainFlag=0;returnremainFlag;}//逐邊裁剪算法://typedefstructtRes{intyes,isIn;POINTpout;}Res;ResTestIntersect(intedge,inttype,POINTp1,POINTp2){//判斷p2是否在所裁剪的窗邊edge的內(nèi)側(cè),是否與p1點(diǎn)分別在窗邊edge的異側(cè)floatdx,dy,m;Resres;intisIn=0,yes=0;POINTpout;dy=p2.y-p1.y;dx=p2.x-p1.x;m=dy/dx;switch(type){case1:/*right*/ if(p2.x<=edge){isIn=1;if(p1.x>edge)yes=1;} elseif(p1.x<=edge)yes=1;break;case2:/*bottom*/ if(p2.y>=edge){isIn=1;if(p1.y<edge)yes=1;} elseif(p1.y>=edge)yes=1;break;case3:/*left*/ if(p2.x>=edge){isIn=1;if(p1.x<edge)yes=1;} elseif(p1.x>=edge)yes=1;break;case4:/*top*/ if(p2.y<=edge){isIn=1;if(p1.y>edge)yes=1;} elseif(p1.y<=edge)yes=1;default:break;}if(yes){ if((type==1)||(type==3)) {pout.x=edge;pout.y=p1.y+m*(pout.x-p1.x);} if((type==2)||(type==4)) {pout.y=edge;pout.x=p1.x+(pout.y-p1.y)/m;}}res.isIn=isIn;res.yes=yes;res.pout=pout;returnres;}intclipSingleEdge(intedge,inttype,intnin,POINTpin[50],POINTpout[50])/*對(duì)多邊形pin與窗邊edge進(jìn)行裁剪,返回裁剪后的多邊形pout及點(diǎn)數(shù)*/{inti,k=0;POINTp;Resres;p.x=pin[nin-1].x;p.y=pin[nin-1].y;for(i=0;i<nin;i++){ res=TestIntersect(edge,type,p,pin[i]); if(res.yes) {pout[k].x=res.pout.x;pout[k].y=res.pout.y;k++;} if(res.isIn) {pout[k].x=pin[i].x;pout[k].y=pin[i].y;k++;} p.x=pin[i].x;p.y=pin[i].y;}returnk;}voidClipEdgePolygon(POINTps[50],int&n,intXL,intXR,intYB,intYT){/*對(duì)多邊形ps進(jìn)行逐邊裁剪*/ intn1=0,n2=0; POINTpt[50]; n1=clipSingleEdge(XR,1,n,ps,pt); n2=clipSingleEdge(YB,2,n1,pt,ps); n1=clipSingleEdge(XL,3,n2,ps,pt); n2=clipSingleEdge(YT,4,n1,pt,ps); n=n2;}//多邊形編碼裁剪算法:voidClipEncodePolygon(POINTps[50],int&n,intXL,intXR,intYB,intYT){ POINTtp[50]; intk=0,m;intcode1,code2,code; intx,y; for(inti=0;i<n-1;i++) { Encode(ps[i].x,ps[i].y,&code1,XL,XR,YB,YT); Encode(ps[i+1].x,ps[i+1].y,&code2,XL,XR,YB,YT); code=code1;m=i; for(intj=0;j<2;j++) { if((code1&code2)!=0)//線段兩端都在窗口外的同一側(cè) { switch(code) { case1:x=XL;y=ps[m].y;break;case2:x=XR;y=ps[m].y;break; case4:x=ps[m].x;y=YB;break; case5:x=XL;y=YB;break; case6:x=XR;y=YB;break; case8:x=ps[m].x;y=YT;break; case9:x=XL;y=YT;break; case10:x=XR;y=YT;break; } tp[k].x=x;tp[k].y=y;k++; } elseif((code1&code2)==0)//線段兩端不在窗口的同一側(cè) { if(code==0) { tp[k]=ps[m];k++; } elseif((LEFT&code)!=0)//線段與左邊界相交 { x=XL; y=ps[i].y+(ps[i+1].y-ps[i].y)*(XL-ps[i].x)/(ps[i+1].x-ps[i].x); if(y>YB&&y<YT){tp[k].x=x;tp[k].y=y;k++;} } elseif((TOP&code)!=0)//線段與上邊界相交 { y=YT; x=ps[i].x+(ps[i+1].x-ps[i].x)*(YT-ps[i].y)/(ps[i+1].y-ps[i].y); if(x>XL&&x<XR){tp[k].x=x;tp[k].y=y;k++;} } elseif((RIGHT&code)!=0)//線段與右邊界相交 { x=XR; y=ps[i].y+(ps[i+1].y-ps[i].y)*(XR-ps[i].x)/(ps[i+1].x-ps[i].x); if(y>YB&&y<YT){tp[k].x=x;tp[k].y=y;k++;} } elseif((BOTTOM&code)!=0)//線段與下邊界相交 { y=YB; x=ps[i].x+(ps[i+1].x-ps[i].x)*(YB-ps[i].y)/(ps[i+1].y-ps[i].y); if(x>XL&&x<XR){tp[k].x=x;tp[k].y=y;k++;} } } code=code2;m++; }//for(j)}//for(i) for(i=0;i<k;i++) ps[i]=tp[i]; n=k;}//函數(shù)的調(diào)用,裁剪窗口的調(diào)整//DrawView.cpp文件//裁剪窗口的調(diào)整CDrawView::CDrawView(){/************請(qǐng)?jiān)诖撕瘮?shù)中將裁剪窗口大小調(diào)整為長度100單位像素,寬度50單位像素的矩形********/ //TODO:addconstructioncodehere// m_pWidth=1; m_pStyle=PEN_STYLE_SOLID; m_pColor=RGB(0,0,0); m_FFlag=0; m_FColor=RGB(0,0,0); m_HFlag=0;CurrentDraw=DRAW_VCLINE;m_Num=0;m_Drag=0; m_HCursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);// DrawType=0;ClipFlag=0; ClipType=-1; XL=200;XR=300;YB=150;YT=200;//XL=200;XR=500;YB=150;YT=400; ClipWindowColor=RGB(192,192,50);}voidCDrawView::OnDraw(CDC*pDC){ CDrawDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahereif(ClipFlag) { CPenNewPen,*pOldPen; NewPen.CreatePen(PS_DASH,1,ClipWindowColor); pOldPen=pDC->SelectObject(&NewPen); pDC->MoveTo(XL,YB); pDC->LineTo(XR,YB); pDC->LineTo(XR,YT);pDC->LineTo(XL,YT); pDC->LineTo(XL,YB); } intindex; index=pDoc->GetShapeNumber(); for(inti=0;i<index;i++) pDoc->GetShape(i)->Drawing(pDC);}voidCDrawView::OnInitialUpdate(){ CSizesizeTotal; sizeTotal.cx=640; sizeTotal.cy=480; SetScrollSizes(MM_TEXT,sizeTotal); //TODO:Addyourspecializedcodehereand/orcallthebaseclass }voidCDrawView::OnLButtonDown(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultCClientDCdc(this); OnPrepareDC(&dc); dc.DPtoLP(&point); m_pPrev=point; m_pOrigin=point;//點(diǎn)擊鼠標(biāo)左鍵作為拖動(dòng)繪圖的第一點(diǎn) m_Drag=1; SetCapture(); RECTrect; GetClientRect(&rect); ClientToScreen(&rect); ClipCursor(&rect); CScrollView::OnLButtonDown(nFlags,point);}//函數(shù)調(diào)用處voidCDrawView::OnLButtonUp(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault if(m_Drag) {m_Drag=0; ReleaseCapture(); ClipCursor(NULL);CDrawDoc*pDoc=GetDocument();CShape*pShape; POINTp1,p2; if(CurrentDraw==DRAW_VCLINE||CurrentDraw==DRAW_DDALINE|| CurrentDraw==DRAW_MIDLINE||CurrentDraw==DRAW_BSHLINE) { if(ClipFlag) { switch(ClipType) {/****************編碼裁剪函數(shù)調(diào)用處*************/caseCLIP_ENCODE:C_S_Line(m_pOrigin,m_pPrev,XL,XR,YB,YT);break;/****************中點(diǎn)分割裁剪函數(shù)調(diào)用處************/caseCLIP_MIDPOINT:ClipMid(m_pPrev,m_pOrigin,XL,XR,YB,YT); p1=ClipMid(m_pPrev,m_pOrigin,XL,XR,YB,YT);p2=ClipMid(m_pOrigin,m_pPrev,XL,XR,YB,YT); m_pOrigin=p1;m_pPrev=p2; break;caseCLIP_PARAMETER:ClipParameter(m_pOrigin,m_pPrev,XL,XR,YB,YT);break; } } pShape=newCLine(m_pOrigin,m_pPrev,m_pWidth,m_pStyle,m_pColor,DrawType); pDoc->AddShape(pShape); } if(Curr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GAT 1352-2018視頻監(jiān)控鏡頭》專題研究報(bào)告
- 2026 年初中英語《情景交際》專項(xiàng)練習(xí)與答案 (100 題)
- 2026年深圳中考語文培優(yōu)補(bǔ)差綜合試卷(附答案可下載)
- 2026年深圳中考英語二模仿真模擬試卷(附答案可下載)
- 2026年深圳中考物理考綱解讀精練試卷(附答案可下載)
- 廣東省江門市新會(huì)區(qū)2026年九年級(jí)上學(xué)期期末物理試題附答案
- 2026年大學(xué)大二(建筑學(xué))建筑方案設(shè)計(jì)基礎(chǔ)測(cè)試題及答案
- 2026年深圳中考數(shù)學(xué)數(shù)據(jù)的分析專項(xiàng)試卷(附答案可下載)
- 2026年深圳中考生物進(jìn)階提分綜合試卷(附答案可下載)
- 創(chuàng)文辦人員培訓(xùn)課件
- 《砂漿、混凝土用低碳劑》
- 2025年社區(qū)工作總結(jié)及2026年工作計(jì)劃
- 南昌地鐵培訓(xùn)課件
- GB/T 30104.104-2025數(shù)字可尋址照明接口第104部分:一般要求無線和其他有線系統(tǒng)組件
- 三年級(jí)上冊(cè)數(shù)學(xué)第三單元題型專項(xiàng)訓(xùn)練-判斷題(解題策略專項(xiàng)秀場(chǎng))人教版(含答案)
- GB/T 45629.1-2025信息技術(shù)數(shù)據(jù)中心設(shè)備和基礎(chǔ)設(shè)施第1部分:通用概念
- 2025年中考?xì)v史開卷考查范圍重大考點(diǎn)全突破(完整版)
- 學(xué)術(shù)誠信與學(xué)術(shù)規(guī)范研究-深度研究
- 《ETF相關(guān)知識(shí)培訓(xùn)》課件
- DB15-T 3677-2024 大興安嶺林區(qū)白樺樹汁采集技術(shù)規(guī)程
- 2024年《13464電腦動(dòng)畫》自考復(fù)習(xí)題庫(含答案)
評(píng)論
0/150
提交評(píng)論