蘇百兗
貝濟埃曲線是以法國數學家皮埃爾•貝濟埃命名的,它首先描述了這種曲線的性質。在一條貝塞爾曲線上,兩個中點控制柄的位置足以描述一條不平滑曲線的總體形狀。在計算機圖形應用程序中,用戶操縱的控制柄通常在屏幕上顯示爲小框。用鼠標單擊或牽引這些點就可以控制曲線的複雜度和形狀。 在VC++生成的Windows窗口中,單擊鼠標四下,即立刻繪製出一條貝濟埃曲線。如果想調整該曲線,只要對準貝濟埃曲線的四個折點中的一個,按下鼠標右鍵,拖動鼠標到你需要的位置,貝濟埃曲線亦隨着移動,直到滿意爲止。下面介紹VC++下繪製能移動的貝濟埃曲線的步驟: 步驟1.啓動VC++6.0,生成名爲DrawBez的工程。選中File→New菜單,單擊Project標籤,選擇MFC AppWizard[exe],輸入工程名DrawBez,在第一步中選擇Single Document,其他各步都用默認設置,最後點擊finsh,完成工程的建立。 步驟2.在CDrawBezView類中添加如下數據成員: public: POINT BezierPoint[4]; int DotNo; int Index; 步驟3.在CDrawBezView類的構造函數CDrawBezView()中初始化DotNo=0。 步驟4.在OnDraw函數中添加如下代碼: void CDrawBezView::OnDraw(CDC* pDC) { CDrawBezDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(DotNo==4) { CPen* pen1; CPen* pen2; pen2=new CPen(PS_SOLID,1,RGB(255,0,0)); pen1=new CPen(PS_SOLID,1,RGB(0,0,255)); CPen* oldpen; oldpen=pDC->SelectObject(pen1); for(int i=0;i<4;i++) { pDC->Ellipse(BezierPoint[i].x-2,BezierPoint[i].y-2,BezierPoint[i].x+2,BezierPoint[i].y+2); if(i>=1) { pDC->MoveTo(BezierPoint[i-1].x,BezierPoint[i-1].y); pDC->LineTo(BezierPoint[i].x,BezierPoint[i].y); } } pDC->SelectObject(pen2); pDC->PolyBezier(BezierPoint,4); delete pen1; delete pen2; pDC->SelectObject(oldpen); } } 步驟5.用ClassWizard給CDrawBezView類分別添加鼠標左鍵單擊、右鍵按下、鼠標拖動、右鍵擡起消息處理函數OnLButtonDown( ),OnRButtonDown( ),OnMouseMove( ), OnRButtonUp( )。 步驟6.給OnLButtonDown( ),OnRButtonDown( ),OnMouseMove( ), OnRButtonUp( )函數中分別添加代碼如下: void CDrawBezView::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC* pDC=new CClientDC(this); if(DotNo<4) { BezierPoint[DotNo].x=point.x; BezierPoint[DotNo].y=point.y; if(DotNo>=1) { pDC->MoveTo(point.x,point.y); pDC->LineTo(BezierPoint[DotNo-1].x,BezierPoint[DotNo-1].y); } DotNo++; } if(DotNo==4) Invalidate(); delete pDC;
CView::OnLButtonDown(nFlags, point); }
void CDrawBezView::OnRButtonDown(UINT nFlags, CPoint point) { for(int j=0;j<4;j++) { CRect rect; rect=CRect(BezierPoint[j].x-3,BezierPoint[j].y-3,BezierPoint[j].x+3,BezierPoint[j].y+3); if(rect.PtInRect(point)) { Index=j; break; } } CView::OnRButtonDown(nFlags, point); }
void CDrawBezView::OnMouseMove(UINT nFlags, CPoint point) { if(Index>=0&&Index<=3) { BezierPoint[Index].x=point.x; BezierPoint[Index].y=point.y; Invalidate(); } CView::OnMouseMove(nFlags, point); } void CDrawBezView::OnMouseMove(UINT nFlags, CPoint point) { if(Index>=0&&Index<=3) { BezierPoint[Index].x=point.x; BezierPoint[Index].y=point.y; Invalidate(); } CView::OnMouseMove(nFlags, point); }
void CDrawBezView::OnRButtonUp(UINT nFlags, CPoint point) { Index=-1; CView::OnRButtonUp(nFlags, point); } 運行效果如下圖所示:
運行效果
|