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

这篇具有很好参考价值的文章主要介绍了计算机图形学:三次Bezier曲线的绘制(算法原理及代码实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实现方案

       贝塞尔曲线原理:贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一。它通过控制曲线上的四个点(起始点、终止点以及两个相互分离的中间点)来创造、编辑图形。其中起重要作用的是位于曲线中央的控制线。这条线是虚拟的,中间与贝塞尔曲线交叉,两端是控制端点。移动两端的端点时贝塞尔曲线改变曲线的曲率(弯曲的程度);移动中间点(也就是移动虚拟的控制线)时,贝塞尔曲线在起始点和终止点锁定的情况下做均匀移动。注意,贝塞尔曲线上的所有控制点、节点均可编辑。

       具体实现通过贝塞尔公式推导:

       定义:给定点Po,P..... Pn,则n次贝塞尔曲线由下式给出:

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

       n次贝塞尔曲线的公式可由如下递归表达:

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

        进一步可以得到贝塞尔曲线的递推计算公式:

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

       所以,想要实现三次Bezier曲线的绘制,只需要令n=k,可得公式为:

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

       为了更好的通过计算机来实现此公式,通过相应的转换,可以得到三次Bezier曲线的矩阵,再通过此推导公式从t=0到t=1之间连续绘制100个点即可得到Bezier曲线。   

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

二、代码实现

 

//坐标点
struct Point
{
	double x, y;
};

int fac(int n) {
	if (n == 1 || n == 0)
		return 1;
	else
		return n * fac(n - 1);
}

double powi(double base, int n) {
	double res = 1;
	for (int i = 1; i <= n; ++i)
		res *= base;
	return res;
}

void DrawBezierCurve(Point* p, int n, CDC* pDC,int color) {
	double a, b;
	double temp, temp1, temp2, bi;
	for (double t = 0.0; t <= 1; t += 0.01) {
		a = 0.0; b = 0.0;
		for (int i = 0; i <= n; ++i) {
			temp = double(fac(n) / fac(i) / fac(n - i));
			temp1 = powi(t, i);
			temp2 = powi(1 - t, n - i);
			bi = temp * temp1 * temp2;
			a = a + bi * p[i].x;
			b = b + bi * p[i].y;
		}
		CPen m_newPen, * m_oldPen;
		//创建新画笔
		m_newPen.CreatePen(PS_SOLID, 2, color);
		//将新画笔选入设备上下文,并且保存旧画笔
		m_oldPen = pDC->SelectObject(&m_newPen);
		if (t == 0) {
           pDC->MoveTo(a, b);
		}
		else {
           pDC->LineTo(a, b);
		}
		pDC->SelectObject(m_oldPen);
	}
}

Ondraw代码:

Point p[4] = { {28,5},{30,20},{35.25},{40,5}};
	DrawBezierCurve(p,3, pDC,RGB(10,222,55));
	Line(pDC, p[0], p[1]);
	Line(pDC, p[1], p[2]);
	Line(pDC, p[2], p[3]);

三、代码结果

计算机图形学:三次Bezier曲线的绘制(算法原理及代码实现) 文章来源地址https://www.toymoban.com/news/detail-504464.html

到了这里,关于计算机图形学:三次Bezier曲线的绘制(算法原理及代码实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机图形学】作业:Bresenham 法绘制圆

    请采用 Bresenham 法绘制圆(共 30 分)。要求: (1) 给出算法的文字描述(共 15 分)。 (2) 编写函数,在给定圆心坐标和半径的情况下,计算出圆 上所有的点,并将这些点存储在数组中(共 15 分)。 输入圆的圆心(xc,yc),半径r。数组circlepoints为输出,保存圆上所有点。 初

    2024年01月24日
    浏览(37)
  • 计算机图形学:绘制一个3d交互场景(1)

    OpenGL作为一种图形与硬件的接口,与其他图形程序开发工具相比较,它提供了众多图形函数,直观的编程环境简化了三维图形的绘制过程,使用OpenGL搭建一个三维场景,能够通过输入设备与场景内物体交互。 豪华单间 配置环境:vs22+freeglut库 1.绘制墙体使其成为封闭空间,在

    2024年02月11日
    浏览(82)
  • 计算机图形学实验四 OpenGL的鼠标交互绘制

    一、实验目的 1.掌握OpenGL的鼠标按钮响应函数。 2.掌握OpenGL的鼠标移动响应函数。 3.进一步巩固OpenGL的基本图元绘制基础。 二、实验内容 1.鼠标画草图——实现鼠标点到哪,线就画到哪。 思路: 1)在主程序注册鼠标响应和鼠标移动子函数: glutMouseFunc(mymouse); glutMotionFunc(mym

    2023年04月20日
    浏览(98)
  • 【计算机图形学】二维图形裁剪算法

    Cohen-Sutherland算法 Cohen-Sutherland是最早最流行的算法。 核心思想:通过 编码测试 来减少计算交点的次数。(编码算法) 1. 区域码: 线段端点以区域赋值以四位二进制码。 编码顺序:四位从右到左分别为:左边界、右边界、下边界、上边界。 编码值:落在相应位置为1,否则

    2024年02月02日
    浏览(39)
  • 计算机图形学头歌实训平台答案——CG1-v2.0-直线绘制

    1.本关任务 (1)根据直线DDA算法补全line函数,其中直线斜率0k1; (2)当直线方程恰好经过P(x,y)和T(x,y+1)的中点M时,统一选取直线上方的T点为显示的像素点。 2.输入 (1)直线两端点坐标:(13, 20)和(180,140); (2)直线颜色为白色。 3.输出 程序运行结果为一条直线,具体结果如下图所示:

    2024年02月06日
    浏览(40)
  • 计算机图形学:二维图形的几何变换(算法原理及代码实现)

    对于一个二维图形作平移、旋转、放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移)、绕一点旋转固定的角(旋转)、在x,y轴方向分别放缩sx,sy倍。 对于变换的原理,只需要将原图形的点通过极坐标或者相加、相乘,再

    2024年02月11日
    浏览(29)
  • 计算机图形学03:改进的中点BH算法

    作者 :非妃是公主 专栏 :《计算机图形学》 博客地址 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 专栏名称 专栏地址 软件工程 专栏——软件工程 计算机图形学 专栏——计算机图形学 操作系统 专栏——操作系统 软件测试 专

    2024年01月17日
    浏览(33)
  • 【计算机图形学|直线生成算法】Bresenham画法详解

    Bresenham画法是一种用于计算计算机图形中线条的算法,其原理是沿着所需绘制的线段中的像素点进行递增或递减,来进行准确的点阵绘制。 实现该算法的关键在于确定像素在基准线上的位置,以及在每次迭代时进行相应的调整。该算法比传统的直线算法更快且更准确,在低速

    2024年02月07日
    浏览(37)
  • 【计算机图形学|直线生成算法】中点画线法

    中点画线法(Midpoint Line Algorithm)是一种画线(Line Drawing)算法,用来在计算机屏幕上绘制线条。 它的基本思想是从线段的起点和终点出发,按照一定的规则向终点逐步逼近,并在途中以控制变量的方式得出每个像素点的坐标,从而绘制出所需的线条。 具体实现中,中点画线

    2024年02月04日
    浏览(35)
  • 【Weiler-Atherton算法】 计算机图形学多边形裁剪算法

    源代码: https://github.com/ricar0/Weiler-Atherton-Alogrithm/tree/master 通常来说就是利用多边形来裁剪多边形的一种方法,一般情况下是利用矩形来裁剪凹凸多边形 凸多边形 凹多边形 上面红色划线部分就是裁剪出的部分 OPENGL基础语法 基本上就是一些画线和画多边形的操作,难度较低

    2023年04月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包