如何在VC 6.0下實現貝濟埃曲線的繪製

 

如何在VC 6.0下實現貝濟埃曲線的繪製
 

蘇百兗

    貝濟埃曲線是以法國數學家皮埃爾•貝濟埃命名的,它首先描述了這種曲線的性質。在一條貝塞爾曲線上,兩個中點控制柄的位置足以描述一條不平滑曲線的總體形狀。在計算機圖形應用程序中,用戶操縱的控制柄通常在屏幕上顯示爲小框。用鼠標單擊或牽引這些點就可以控制曲線的複雜度和形狀。
    在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);
}
    運行效果如下圖所示:
 


 
    運行效果


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章