`

MFC下实现图形学之Hermite、Bezier曲线的绘制

阅读更多

//*******************************************************
//捕捉鼠标左键按下消息,获得两个起始控制点的坐标
//*******************************************************
void CDrawCurvesView::OnLButtonDown(UINT nFlags, CPoint point) 
{
 // TODO: Add your message handler code here and/or call default
 oldPoint = point;
 newPoint = point;
 CurveCtrlPoints[count++] = point;
 SetCapture();
 isLButtonDown = true;
 CRect rect;
    GetClientRect(&rect);
 ClientToScreen(&rect);  //用用户区坐标重新计算屏幕坐标
    ClipCursor(&rect);      //限制光标在用户区内
                            //默认处理,调用基类消息处理函数
    CView::OnLButtonDown(nFlags, point);
}
//******************************************
//按下键盘清除客户区的内容,为下次绘制作准备
//******************************************
void CDrawCurvesView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
 // TODO: Add your message handler code here and/or call default
 count = 0;
 Invalidate();
 CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
//******************
//矩阵乘法
//******************
void CDrawCurvesView::MultiMatrix(int a[4][4],double b[4][2])
{
 int i,j,k;
 for(i=0;i<4;i++)
      for(j=0;j<2;j++)
     result[i][j] = 0;

 for(i=0;i<2;i++)
   for(j=0;j<4;j++)
    for(k=0;k<4;k++)
             result[j][i] += a[j][k]*b[k][i]; 
}
//***************************************
// 捕捉鼠标移动消息,绘制橡皮筋线,
//作为Hermite曲线的控制点处的切线
//***************************************
void CDrawCurvesView::OnMouseMove(UINT nFlags, CPoint point) 
{
 // TODO: Add your message handler code here and/or call default
 if(isLButtonDown)
 {
    CView::OnMouseMove(nFlags, point);
    CClientDC dc(this);
    dc.SetROP2(R2_NOT);
    dc.MoveTo(newPoint);
    dc.LineTo(oldPoint);
    dc.MoveTo(newPoint);
    dc.LineTo(point);
    oldPoint = point;
 }
}
//*****************************************************
//捕捉鼠标左键松开消息,并在捕捉到第四个控制点
//后,根据从菜单选择项的不同,开始绘制不同曲线
//******************************************************
void CDrawCurvesView::OnLButtonUp(UINT nFlags, CPoint point) 
{
 // TODO: Add your message handler code here and/or call default
 isLButtonDown=false;//标志鼠标释放
    ReleaseCapture();//释放鼠标捕捉
    ClipCursor(NULL);//
 CurveCtrlPoints[count++] = point;
  if(count == 4)
  { 
  CClientDC dc(this);
  CPen pen;
  pen.CreatePen(PS_SOLID,3,RGB(255,0,0));
  dc.SelectObject(pen);
  switch(type)
  {
    case HERMITE:
             DrawHermiteCurve(dc,200);
    break;
    case BEZIER:
     DrawBezierCurve(dc,400);
     break;
  }
  pen.DeleteObject();
 }
 CView::OnLButtonUp(nFlags, point);
}
//*******************************************
//菜单响应函数,当菜单项选为Hermite时,
//绘制曲线的类型设置为HERMITE
//*******************************************
void CDrawCurvesView::OnHermite() 
{
 // TODO: Add your command handler code here
 type = HERMITE;
}
//******************************************
//菜单响应函数,当菜单项选为Bezier时,
//绘制曲线的类型设置为BEZIER
//******************************************
void CDrawCurvesView::OnBezier() 
{
 // TODO: Add your command handler code here
 type = BEZIER;
}
//**************************
//绘制hermite曲线的函数
//**************************
void CDrawCurvesView::DrawHermiteCurve(CDC &dc,int nPoints)
{
 int a[4][4] =
 {
  {2,-2,1,1},
  {-3,3,-2,-1},
  {0,0,1,0},
  {1,0,0,0}
 };
    double b[4][2] = {
  {CurveCtrlPoints[0].x,CurveCtrlPoints[0].y},
  {CurveCtrlPoints[2].x,CurveCtrlPoints[2].y},
  {CurveCtrlPoints[1].x-CurveCtrlPoints[0].x,CurveCtrlPoints[1].y-CurveCtrlPoints[1].y},
  {CurveCtrlPoints[3].x-CurveCtrlPoints[2].x,CurveCtrlPoints[3].y-CurveCtrlPoints[2].y}
 };
 CPoint *pt=new CPoint[nPoints];
 double delt = 1.0/nPoints;
 double u = 0.0;
    MultiMatrix(a,b);
 for(int i = 0; i < nPoints; i++)
 {
       pt[i].x =(int) (pow(u,3)*result[0][0] + pow(u,2)*result[1][0]
     + u*result[2][0] + result[3][0]);
    pt[i].y =(int) (pow(u,3)*result[0][1] + pow(u,2)*result[1][1]
     + u*result[2][1] + result[3][1]);
    u += delt;
 }
 dc.Polyline(pt,nPoints);
 delete pt;
}
//************************
//绘制Bezier曲线的函数
//************************
void CDrawCurvesView::DrawBezierCurve(CDC &dc,int nPoints)
{
  double t = 0.0,delt = 0.0;
  delt = 1.0/(double)nPoints;
  CPoint *points = new CPoint[nPoints+1]; 
  for(int i=0; i<= nPoints;i++)
  {
   points[i] = Decas(4,t);
   t += delt;
  }
  dc.Polyline(points,nPoints);
}
//********************************
//绘制Bezier曲线的辅助函数,
//主要完成t在某个值时,bezier
//曲线上的一个点的坐标的计算
//*********************************
CPoint CDrawCurvesView::Decas(int ptNum, double t)
{
 CPoint *coeffa = new CPoint[ptNum+1],coeffa0;
    for(int i=0;i<=ptNum;i++)
 {
  coeffa[i] = CurveCtrlPoints[i];
 }
 for(int r = 1;r <= ptNum;r++)
  for(int j = 0;j < ptNum-r;j++)
  {
   coeffa[j].x=(int)(coeffa[j].x+t*(coeffa[j+1].x-coeffa[j].x));
   coeffa[j].y=(int)(coeffa[j].y+t*(coeffa[j+1].y-coeffa[j].y));
  }
     coeffa0 = coeffa[0];
  delete coeffa;
  return coeffa0;
}



分享到:
评论

相关推荐

    Hermite,Bezier,三次B样条曲线的MFC实现

    本项目聚焦于三种常见的曲线表示方法:Hermite曲线、Bezier曲线以及三次B样条曲线,并通过Microsoft Foundation Classes (MFC)进行实现。MFC是微软提供的一种C++类库,用于构建Windows应用程序,它简化了Windows API...

    曲线绘制(Bezier、三次B样条、Hermite)

    总之,掌握Bezier、三次B样条和Hermite曲线的绘制方法对于理解计算机图形学和进行图形编程至关重要。在MFC环境下,开发者可以通过学习和实践这些例子,深入理解曲线的数学原理,提高图形处理能力,为各种图形应用...

    mfc实现绘制Bezier、B样条、Hermite曲线

    本实验基于MFC(Microsoft Foundation Classes)框架,利用C++编程语言实现了三种常见类型的参数曲线:Bezier曲线、B样条曲线以及Hermite曲线。下面将详细解释这三种曲线的原理和实现方法。 **Bezier曲线**: ...

    Hermite曲线和Bezier曲线实现

    在计算机图形学中,曲线是描绘形状和路径的重要工具,Hermite曲线和Bezier曲线是两种常见的非均匀有理B样条(NURBS)曲线。这篇文章将详细讲解这两种曲线的理论基础、实现原理以及如何在VC6.0 MFC环境中进行编程实现...

    计算机图形学MFC.zip

    计算机图形学大作业: 一、主菜单的菜单项 基本图形绘制、图形变换、自由曲线绘制、图形裁剪或图形填充 二、二级子菜单基本图形绘制 1.直线绘制: 1)Bresenham绘制直线 2)DDA绘制直线 3)改进的Bresenham...

    C++ MFC程序设计 Bezier B样条 Hermite曲线 计算机图形学 计算机辅助设计 程序设计 课程设计

    本课程设计的重点是利用C++ MFC进行计算机图形学的程序设计,特别是关于Bezier曲线、B样条和Hermite曲线的实现。 Bezier曲线是计算机图形学中一种基本的参数曲线,由法国工程师Pierre Bezier于1962年提出。它通过一...

    计算机图形学作业-基于C++实现MFC程序源码+项目说明.zip

    计算机图形学作业-基于C++实现MFC程序源码+项目说明.zip 【资源介绍】 MFC程序实现: 1.基本图形绘制: Bresenham、DDA、改进的Bresenham、系统库函数四种方法画直线, Bresenham画圆,Bresenham画椭圆,绘制矩形,...

    计算机图形学实验4HermiteBezierB样条三种曲线的绘制.pdf

    计算机图形学实验四 Hermite Bezier B样条三种曲线的绘制 本实验的目的在于了解和学习 Hermite、Bezier、B样条三种曲线算法,并掌握基于 Win32、Visual C++ 环境 MFC 绘制图形配置过程。在实验中,我们将学习如何...

    Coons曲面与hermite、bezier、B样条曲线标准化函数及应用程序源代码(VC6.0下编写)

    在VC6.0 MFC下编写的源代码中,Bezier曲线的实现允许用户通过控制点轻松调整和绘制曲线。 B样条曲线(B-Spline Curve)是另一种常用的参数化曲线,它通过一组控制点和权系数来定义,具有更灵活的形状控制和更好的...

    计算机图形学实验4之之-HermiteBezierB样条三种曲线的绘制.pdf

    在计算机图形学中,曲线的绘制是至关重要的,因为它们被广泛用于模拟真实世界的形状,如动画、游戏开发、建筑设计等领域。本实验主要关注Hermite、Bezier和B样条这三种三次参数曲线的绘制。这些曲线都有其独特的性质...

    实验二1.1_MFC_

    在本实验"实验二1.1_MFC_"中,我们将探讨如何使用Microsoft Foundation Classes (MFC) 库来实现图形的绘制,特别是聚焦于Bezier曲线和Hermite曲线的绘制技术。MFC 是一个C++类库,它为Windows应用程序开发提供了一套...

    计算机图形学实验3.zip

    2、根据Bezier曲线的定义编程绘制Bezier曲线,要求:Bezier曲线的控制点的坐标由用户自行输入,曲线的次数也可由用户选择确定,同时可以修改线宽和颜色,。 3、根据B样条曲线的定义绘制三次B样条曲线,要求:B样条...

    图形学基础部分程序段MFC

    【图形学基础部分程序段MFC】涉及到的知识点主要涵盖了计算机图形学中的多个核心概念和技术,包括基本的图像处理、几何变换、填充算法、直线和曲线的绘制、裁剪算法以及图形渲染等。以下是这些知识点的详细解释: 1...

    样条函数绘制曲线测试程序源代码

    总的来说,这个项目涉及到计算机图形学中的曲线绘制技术,尤其是样条函数的应用,以及如何通过重采样和MFC框架实现高效的图形显示。对于学习和理解样条函数、C++编程以及图形用户界面开发的人员来说,这是一个很好的...

    DrawImage.zip_Drawimage

    1. **Bezier曲线**:Bezier曲线是一种在计算机图形学中广泛应用的参数曲线,以其发明者Pierre Bezier的名字命名。它通过控制点来定义曲线的形状,具有易于计算和调整的优点。在"DrawImage"中,你可以通过指定控制点...

    第5节实验课1

    在本节实验课中,我们将深入探讨计算机图形学中的曲线表示方法,主要关注多点插值的埃米尔特曲线(Hermite Curve)、贝齐尔曲线(Bezier Curve)以及B样条曲线(B-Spline Curve)。这些曲线描述方法在3D建模、动画...

    VC++绘图介绍的课件 帮助绘制基本函数图

    实验项目涉及了计算机图形学的基本概念,包括多边形填充(扫描转换)、图形变换(比例、平移、旋转、投影)、图形裁剪(Sutherland-Hodgman算法)、曲线绘制(Hermite曲线、Bezier曲线、B样条曲线)、形体表示及操作...

    VC++绘图介绍 适合初学者

    总的来说,VC++绘图涉及到计算机图形学的基本概念和技术,通过学习和实践,初学者可以逐步掌握在Windows环境下创建动态、交互式图形界面的能力。不断地探索和尝试,你会发现图形编程的世界既富有挑战性又充满乐趣。

Global site tag (gtag.js) - Google Analytics