生活随笔
收集整理的這篇文章主要介紹了
图形学-二维图形的裁剪1.Cohen 2.Liang
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Cohen
創建新類CP2
class CP2 {public:CP2();virtual ~CP2();public:double x
;double y
;UINT rc
;};
右鍵view類,添加如下幾個全局變量。(前面類型,后面名稱)
CP2 p0; CP2 p1; double wyt; double wxr; double wyb; double wxl;在構造函數給后面四個變量賦初始值(可以改一改數值)。
wxl
=300,wyb
=100,wxr
=500,wyt
=200;
在view類中創建函數
DrawClipWindow(CDC *pDC)中的函數代碼為:
CRect
rect(wxl
,wyb
,wxr
,wyt
);pDC
->Rectangle(rect
);
在.cpp文件include“P2.h”,引入剛才第一步創建的類。
然后在OnDraw()函數里面調用。
DrawClipWindow(pDC
);
鼠標傳值:
CDC
*pDC
=GetDC();if(flag
==0){p0
.x
=point
.x
;p0
.y
=point
.y
;flag
=1;}else{p1
.x
=point
.x
;p1
.y
=point
.y
;pDC
->MoveTo(p0
.x
,p0
.y
);pDC
->LineTo(p1
.x
,p1
.y
);flag
=0;}CView::OnLButtonDown(nFlags
, point
);
view類添加全局變量flag,在構造函數初始值為0.創建編碼函數Encode(CP2 &pt)
這些放在整個文件的最上面:
#define LEFT 0x1 #define RIGHT 0x2 #define BOTTOM 0x4 #define TOP 0x8 Encode函數代碼:
void CMy1112View::EnCode(CP2
&pt
){pt
.rc
=0;if(pt
.x
<wxl
)pt
.rc
=pt
.rc
| LEFT
;else if(pt
.x
>wxr
)pt
.rc
=pt
.rc
| RIGHT
;if(pt
.y
<wyb
)pt
.rc
=pt
.rc
| BOTTOM
;else if(pt
.y
>wyt
)pt
.rc
=pt
.rc
| TOP
; }
創建一個裁剪菜單,類向導為:
CDC
*pDC
=GetDC();CPen NewPen
,*pOldPen
;NewPen
.CreatePen(PS_SOLID
,1,RGB(255,255,255));pOldPen
=pDC
->SelectObject(&NewPen
);pDC
->MoveTo(p0
.x
,p0
.y
);pDC
->LineTo(p1
.x
,p1
.y
);pDC
->SelectObject(pOldPen
);CP2 p
;EnCode(p0
);EnCode(p1
);while(p0
.rc
!=0 || p1
.rc
!=0){if((p0
.rc
& p1
.rc
)!=0){return;}if(0==p0
.rc
){CP2 Temp
;Temp
=p0
;p0
=p1
;p1
=Temp
;}UINT RC
=p0
.rc
;double k
=(p1
.y
-p0
.y
)/(p1
.x
-p0
.x
);if(RC
& LEFT
){p
.x
=wxl
;p
.y
=k
*(p
.x
-p0
.x
)+p0
.y
;}else if(RC
& RIGHT
){p
.x
=wxr
;p
.y
=k
*(p
.x
-p0
.x
)+p0
.y
;}else if(RC
& BOTTOM
){p
.y
=wyb
;p
.x
=(p
.y
-p0
.y
)/k
+p0
.x
;} else if(RC
& TOP
){p
.y
=wyt
;p
.x
=(p
.y
-p0
.y
)/k
+p0
.x
;}EnCode(p
);p0
=p
;}pDC
->MoveTo(p0
.x
,p0
.y
);pDC
->LineTo(p1
.x
,p1
.y
);
LB
右鍵ClipeTest()函數,代碼:
double t
;BOOL ReturnValue
=TRUE
;if(u
<0.0){t
=v
/u
;if(t
>tmin
)ReturnValue
=FALSE
;else if(t
>tmax
)tmax
=t
;}else{if(u
>0.0){t
=v
/u
;if(t
<tmax
)ReturnValue
=FALSE
;else if(t
<tmin
)tmin
=t
;}else{if(v
<0.0)ReturnValue
=FALSE
;}}return(ReturnValue
);
菜單LB裁剪函數:
CDC
*pDC
=GetDC();CPen NewPen
,*pOldPen
;NewPen
.CreatePen(PS_SOLID
,1,RGB(255,255,255));pOldPen
=pDC
->SelectObject(&NewPen
);pDC
->MoveTo(p0
.x
,p0
.y
);pDC
->LineTo(p1
.x
,p1
.y
);pDC
->SelectObject(pOldPen
);double tmax
,tmin
,dx
,dy
;dx
=p1
.x
-p0
.x
;dy
=p1
.y
-p0
.y
;tmax
=0.0,tmin
=1.0;if(ClipTest(-dx
,p0
.x
-wxl
,tmax
,tmin
)) {if(ClipTest(dx
,wxr
-p0
.x
,tmax
,tmin
)){ if(ClipTest(-dy
,p0
.y
-wyb
,tmax
,tmin
)){if(ClipTest(dy
,wyt
-p0
.y
,tmax
,tmin
)){if(tmin
<1.0){p1
.x
=p0
.x
+tmin
*dx
;p1
.y
=p0
.y
+tmin
*dy
; }if(tmax
>0.0){p0
.x
=p0
.x
+tmax
*dx
;p0
.y
=p0
.y
+tmax
*dy
; }}}}pDC
->MoveTo(p0
.x
,p0
.y
);pDC
->LineTo(p1
.x
,p1
.y
);}
總結
以上是生活随笔為你收集整理的图形学-二维图形的裁剪1.Cohen 2.Liang的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。