C语言实现绘制贝塞尔曲线的函数

 更新时间:2022年12月14日 15:42:31   作者:编程小鱼六六六  
贝塞尔曲线,又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。本文将利用C语言实现绘制贝塞尔曲线的函数,需要的可以参考一下

程序截图

简单说明

这个函数就是

void drawBezierCurve(COLORREF color, const unsigned int len, ...)

color 是贝塞尔曲线的颜色,len 是画出贝塞尔曲线所需要的点的个数,最少 1 个,不要乱传。之后的参数传的就是画出贝塞尔曲线要的点,数据类型为 Vec2。

这个函数实现的基础是参数方程,用参数方程将一条直线转化为一个参数的方程,如:

A * x + B * y + C=0 可以转化为 x = x0 - B * t;y = y0 + A * t,x0、y0 为直线上任意一个点的横纵坐标值,t 为未知参数。

对于一条线段,可以根据线段上两个端点转化为参数方程:

x = x0 + (x1 - x0) * t

y = y0 + (y1 - y0) * t

t ∈ [0, 1]

将这条线段分为 CURVEPIECE 份,t 从 0 到 1 一份一份地加,就能得到这条线段上均匀分布的 CURVEPIECE 个点。

贝塞尔曲线就是对 n 个点连线组成的 n 条(线段上对应份的点)的连线的 (n - 1) 条(线段的对应份点)的连线的……直到最后 1 条线段上(对应份点的连线)。

这个曲线的算法如果用递归的话可能会占用很大内存,毕竟每一轮的点的值都保存下来了,我这里用循环做,空间占用只有两轮内点的值。

代码实现

 
// 程序:画贝塞尔曲线的函数
// 编译环境:Visual Studio 2019,EasyX_20211109
//
 
 
#include <graphics.h>
#include <conio.h>
using namespace std;
 
// 画贝塞尔曲线的函数,包括这个 Vec2 结构体
struct Vec2
{
	double x, y;
};
void drawBezierCurve(COLORREF color, const unsigned int len, ...)
{
	if (len <= 0) return;
 
	va_list list;
	va_start(list, len);
	Vec2* temp = new Vec2[len];
	for (int i = 0; i < len; i++)
		temp[i] = va_arg(list, Vec2);
	va_end(list);
 
	if (len == 1)
	{
		putpixel(temp->x, temp->y, color);
		return;
	}
 
	Vec2* parent = nullptr, * child = nullptr;
	Vec2 lastPoint = temp[0];
	setlinecolor(color);
	for (double LineNum = 0; LineNum < 1 + 1.0 / 100; LineNum += 1.0 / 100)
	{
		int size = len;
		parent = temp;
		while (size > 1)
		{
			child = new Vec2[size - 1];
			for (int i = 0; i < size - 1; i++)
			{
				child[i].x = parent[i].x + (parent[i + 1].x - parent[i].x) * LineNum;
				child[i].y = parent[i].y + (parent[i + 1].y - parent[i].y) * LineNum;
			}
			if (parent != temp)delete[] parent;
			parent = child;
			size--;
		}
		line(lastPoint.x, lastPoint.y, parent->x, parent->y);
		lastPoint.x = parent->x;
		lastPoint.y = parent->y;
		delete[] parent;
		parent = nullptr;
		child = nullptr;
	}
	delete[] temp;
}
 
int main()
{
	initgraph(640, 480);
 
	Vec2 a = { 100, 80 };
	Vec2 b = { 540, 80 };
	Vec2 c = { 540, 400 };
	Vec2 d = { 100, 400 };
 
	setlinecolor(BLUE);
	line(a.x, a.y, b.x, b.y);
	line(b.x, b.y, c.x, c.y);
	line(c.x, c.y, d.x, d.y);
 
	drawBezierCurve(RED, 4, a, b, c, d);
 
	_getch();
	closegraph();
	return 0;
}

到此这篇关于C语言实现绘制贝塞尔曲线的函数的文章就介绍到这了,更多相关C语言绘制贝塞尔曲线内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++删除指定文件夹下N天及之前日志文件的方法

    C++删除指定文件夹下N天及之前日志文件的方法

    这篇文章主要介绍了C++删除指定文件夹下N天及之前日志文件的方法,涉及C++针对时间判断及文件操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • 基于C语言航班信息查询与检索

    基于C语言航班信息查询与检索

    这篇文章主要为大家详细介绍了基于C语言航班信息查询与检索,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 详解C语言结构体,枚举,联合体的使用

    详解C语言结构体,枚举,联合体的使用

    这篇文章主要给大家介绍一下关于C语言中结构体、枚举、联合体的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考一下
    2022-07-07
  • c语言中malloc、realloc与calloc 的区别以及联系

    c语言中malloc、realloc与calloc 的区别以及联系

    以下是对c语言中的malloc函数,realloc函数与calloc函数的区别以及它们之间的联系进行了介绍,需要的朋友可以过来参考下
    2013-08-08
  • C语言函数的递归和调用实例分析

    C语言函数的递归和调用实例分析

    一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层
    2013-07-07
  • C语言实现统计字符串单词数

    C语言实现统计字符串单词数

    这篇文章主要介绍了C语言实现统计字符串单词数,代码非常的简洁,有需要的小伙伴快来参考下。
    2015-03-03
  • C语言 实现归并排序算法

    C语言 实现归并排序算法

    这篇文章主要介绍了C语言 实现归并排序算法的相关资料,需要的朋友可以参考下
    2016-11-11
  • C++实现模板中的非类型参数的方法

    C++实现模板中的非类型参数的方法

    这篇文章主要介绍了C++实现模板中的非类型参数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • c语言实现含递归清场版扫雷游戏

    c语言实现含递归清场版扫雷游戏

    扫雷大家应该都玩过,这是一个十分经典的游戏,下面这篇文章主要给大家介绍了关于c语言实现含递归清场版扫雷游戏的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-11-11
  • 详解C++实现匈牙利算法

    详解C++实现匈牙利算法

    匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法。美国数学家哈罗德·库恩于1955年提出该算法。此算法之所以被称作匈牙利算法,是因为算法很大一部分是基于以前匈牙利数学家Dénes K&#337;nig和Jen&#337; Egerváry的工作之上创建起来的
    2021-06-06

最新评论