你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
如何在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);
}
    运行效果如下图所示:
 




 
    运行效果
                    

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089