一、原理:

贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由 Paul de Casteljau 于1959年运用 de Casteljau 算法开发,以稳定数值的方法求出贝塞尔曲线。

线性贝塞尔曲线

给定点 P0P1,线性贝塞尔曲线只是一条两点之间的直线。这条线由下式给出:

且其等同于线性插值。

二次方贝塞尔曲线的路径由给定点 P0P1P2 的函数 B(t) 追踪:

TrueType 字型就运用了以贝塞尔样条组成的二次贝塞尔曲线。

P0P1P2P3 四个点在平面或在三维空间中定义了三次方贝塞尔曲线。曲线起始于 P0 走向 P1,并从 P2 的方向来到 P3。一般不会经过 P1 或 P2;这两个点只是在那里提供方向资讯。 P0 和 P1 之间的间距,决定了曲线在转而趋进P3 之前,走向 P2 方向的“长度有多长”。

曲线的参数形式为:

现代的成象系统,如 PostScript、Asymptote 和 Metafont,运用了以贝塞尔样条组成的三次贝塞尔曲线,用来描绘曲线轮廓。

一般化

P0P1、…、Pn,其贝塞尔曲线即

例如 :

如上公式可如下递归表达: 用  表示由点 P0P1、…、Pn 所决定的贝塞尔曲线。则

用平常话来说, 阶贝塞尔曲线之间的插值。

一些关于参数曲线的术语,有

即多项式

又称作 n 阶的伯恩斯坦基底多项式,定义 00 = 1。

点 Pi 称作贝塞尔曲线的控制点。多边形以带有线的贝塞尔点连接而成,起始于 P0 并以 Pn 终止,称作贝塞尔多边形(或控制多边形)。贝塞尔多边形的凸包(convex hull)包含有贝塞尔曲线。

 

线性贝塞尔曲线函数中的 t 会经过由 P0 至P1 的 B(t) 所描述的曲线。例如当 t=0.25 时,B(t) 即一条由点 P0 至 P1 路径的四分之一处。就像由 0 至 1 的连续 tB(t) 描述一条由 P0 至 P1 的直线。

为建构二次贝塞尔曲线,可以中介点 Q0 和 Q1 作为由 0 至 1 的 t

 
     

为建构高阶曲线,便需要相应更多的中介点。对于三次曲线,可由线性贝塞尔曲线描述的中介点 Q0Q1Q2,和由二次曲线描述的点 R0R1 所建构:

 
     

对于四次曲线,可由线性贝塞尔曲线描述的中介点 Q0Q1Q2Q3,由二次贝塞尔曲线描述的点 R0R1R2,和由三次贝塞尔曲线描述的点 S0S1 所建构:

 
     

P(t)=(1-t)P0+tP1 , 
矩阵表示为:
   。
P(t)=(1-t)2P0+2t(1-t)P1+t2P2
矩阵表示为:
   。

  P(t)=(1-t)3P0+3t(1-t)2P1+3t2(1-t)P2+t3P
矩阵表示为:
, 
(6-3-2) 
 。 
在(6-3-2)式中,Mn+1是一个n+1阶矩阵,称为n次Bezier矩阵。
 (6-3-3)

其中,

利用(6-3-3)式,我们可以得到任意次Bezier矩阵的显式表示,例如4次和5次Bezier矩阵为:

 
可以证明,n次Bezier矩阵还可以表示为递推的形式:
 (6-3-4)

二、算法(c++)

工程目录是:Win32App 
vc6.0

#include<windows.h>
#include<stdlib.h>
#include<time.h>
#define NUM 10

LRESULT CALLBACK Winproc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstanc,LPSTR lpCmdLine,int nShowCmd)
{
    MSG msg;
    static TCHAR szClassName[] = TEXT("::Bezier样条计算公式由法国雷诺汽车公司的工程师Pierm Bezier于六十年代提出");
    HWND hwnd;
    WNDCLASS wc;
    wc.cbClsExtra =0;
    wc.cbWndExtra =0;
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hInstance = hInstance;
    wc.lpfnWndProc = Winproc;
    wc.lpszClassName = szClassName;
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW|CS_VREDRAW;

if(!RegisterClass(&wc))
    {
        MessageBox(NULL,TEXT("注册失败"),TEXT("警告框"),MB_ICONERROR);
        return 0;
    }
    hwnd = CreateWindow(szClassName,szClassName,
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,CW_USEDEFAULT,
                        CW_USEDEFAULT,CW_USEDEFAULT,
                        NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,SW_SHOWMAXIMIZED);
    UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK Winproc(HWND hwnd,UINT message, WPARAM wparam,LPARAM lparam)
{

HDC hdc;
  static POINT pt[NUM];
  TEXTMETRIC tm;
  static int cxClient,cyClient;
  HPEN hpen;
  int i,j,k,n,t;

switch(message)
  {
  case WM_CREATE:
      static int cxchar;
      hdc = GetDC(hwnd);
      GetTextMetrics(hdc,&tm);
      cxchar = tm.tmAveCharWidth;
      ReleaseDC(hwnd,hdc);

case WM_SIZE:
       cxClient = LOWORD(lparam);
      cyClient = HIWORD(lparam);
      return 0;
  case WM_PAINT:
       hdc = GetDC(hwnd);
       srand(time(0));

Rectangle(hdc,0,0,cxClient,cyClient);
      for(i=0; i<500; i++)
          {
            SelectObject(hdc,GetStockObject(WHITE_PEN));
            PolyBezier(hdc,pt,NUM);
            for(j=0; j<NUM; j++)
            {
                pt[j].x = rand()%cxClient;
                pt[j].y = rand()%cyClient;
            }
            hpen = CreatePen(PS_INSIDEFRAME,3,RGB(rand()%256,rand()%256,rand()%256));
             DeleteObject(SelectObject(hdc,hpen));
            PolyBezier(hdc,pt,NUM);
            for(k=0; k<50000000;k++);
          }
      for(i=0; i<100;i++)
      {
        Ellipse(hdc,rand()%cxClient,rand()%cyClient,rand()%cxClient,rand()%cyClient);

Pie(hdc,j=rand()%cxClient,k=rand()%cyClient,n=rand()%cxClient,t=rand()%cyClient,rand()%cxClient,rand()%cyClient,rand()%cxClient,rand()%cyClient) ;

}
       if((n=(n+j)/2)>cxchar*20) n=cxchar*20;  
        SetTextColor(hdc,RGB(rand()%256,rand()%256,rand()%256));
        TextOut(hdc,n/2,(t+k)/2,TEXT("瑾以此向Pierm Bezier致敬!"),lstrlen(TEXT("瑾以此向Pierm Bezier致敬!")));
        ReleaseDC(hwnd,hdc);
          DeleteObject(hpen);
          ValidateRect(hwnd,NULL);
   return 0;

case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
  }
  return DefWindowProc(hwnd,message,wparam,lparam);
}

Bezier曲线原理及实现代码(c++)相关推荐

  1. Bezier曲线原理及其代码实现

    Bezier曲线原理及实现代码(c++) 一.原理: 贝塞尔曲线于1962年,由法国工程师皮埃尔?贝塞尔(Pierre B?zier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计.贝塞尔曲线最初 ...

  2. Bezier曲线原理—动态解释

    Bezier曲线原理 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线.一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖 ...

  3. Bezier曲线的公式推导及代码实现

    本文仅简述Bezier曲线的公式推导,并给出了一种代码实现.在阅读本文之前,请确保你已经对Bezier曲线的背景知识有所了解.相关知识可以通过以下课程进行学习:MOOC-计算机图形学-中国农业大学-赵 ...

  4. Bezier曲线原理

    一.原理: 贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计.贝塞尔曲线最初由Paul de Casteljau 于1 ...

  5. 计算机图形学:三次Bezier曲线的绘制(算法原理及代码实现)

    一.实现方案 贝塞尔曲线原理:贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一.它通过控制曲线上的四个点(起始点.终止点以及两个相互分离的中间点)来创造.编辑图形.其中起重 ...

  6. bezier曲线解析与代码(c++)

    前言: 作为rhino重度用户,我对于nurbs建模早有耳闻,但对于何为nurbs却不得其解.最近借上<计算机辅助设计>课程的机会,对此作了一些深入的学习,于是在此记录一下一些课程笔记和课 ...

  7. android曲线位移动画,Bezier曲线在Android动画中的应用

    Android动画的开发中,为了达到更加酷炫的效果,常常需要自定义运动轨迹,或者绘制花式复杂的曲线,这正是Bezier曲线大显神通的地方,本文将带你了解Bezier曲线在Android开发中的一些应用 ...

  8. 【四足机器人--摆动相足端位置速度轨迹规划】(4.1)FootSwingTrajectory(bezier曲线计算脚的摆动轨迹)代码解析

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.FootSwingTrajectory(bezier曲线)的内容 ...

  9. Bezier曲线快速相交计算(含代码)

    Bezier曲线快速相交计算 背景介绍 算法思路 解释和分析 示例 参考资料 背景介绍 很多时候,需要计算曲线段与曲线段是否有交点.常规的思路是直接联立方程求解.不过,直接求方程的解这种思路通常在计算 ...

最新文章

  1. 聪明人的游戏(3)镜子颠倒了什么?
  2. table 鼠标移上去改变单元格边框颜色。
  3. url_regex和urlpath _regex区别
  4. mysql 索引 insert_mysql优化:定期删数据 + 批量insert + 字符串加索引为什么很傻
  5. Java基础002 Java9开发环境搭建(Win10平台)
  6. c++ 11 新特性讲解大全
  7. flashfxpFTP链接显示PASV、列表错误
  8. hcie到底是个啥 ?
  9. 七周成为数据分析师 第三周:Excel篇
  10. 坚果云 linux 使用方法,Ubuntu坚果云安装与卸载教程
  11. 智能存储 | 版权保护解决方案
  12. 掘金牌鸡汤 - 收藏集 - 掘金
  13. python 爬虫 快看漫画整站爬取(解决动态加载漫画图片地址、漫画图片合成长图、图片文件排序等问题)
  14. 容性耦合等离子体(CCP)和电感耦合等离子体(ICP)
  15. 拼搏别样的未来,中国社科院与美国杜兰大学金融管理硕士项目助力你的人生旅程
  16. 神经风格转移:Anaconda快速搭建DL框架学梵高(Van Gogh)绘画Ubuntu16.04 CPUGPU版
  17. 软件测试面试要注意的细节以及处理(自我介绍篇)
  18. Java实现七牛云上传下载文件或图片
  19. 阿里云ECS共享型n4服务器1核2G怎么样?
  20. 台式计算机红外线端口,如何使用电脑的红外线端口遥控电视机

热门文章

  1. matlab中normfit的使用
  2. 微信支付服务商分账-请求单次分账
  3. Linux驱动之等待队列
  4. 蓝鹰立德丨2021年个税汇算清缴之未雨绸缪(上)
  5. Linux Kernel suspend/resume 过程
  6. 《APP开发》APP规范实例-详细的UI设计方法
  7. 设计原则与模式009 中介者模式
  8. 软件智能:aaas系统中AI的任务能力和工作
  9. ClassFactory 无法供应请求的类 (异常来自 HRESULT:0x80040111 (CLASS_E_CLASSNOTAVAILABLE))
  10. 什么是 CSS 预处理器/后处理器?