如何在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);
}
    运行效果如下图所示:
 


 
    运行效果


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值