C语言画贝塞尔曲线的函数

news2024/11/28 18:36:28

程序截图

 

简单说明

这个函数就是

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++编程学习基】:

小鱼快来啊的个人空间-小鱼快来啊个人主页-哔哩哔哩视频哔哩哔哩小鱼快来啊的个人空间,提供小鱼快来啊分享的视频、音频、文章、动态、收藏等内容,关注小鱼快来啊账号,第一时间了解UP注动态。编程学习群:724050348 每天分享一个编程小游戏~C/C++游戏源码素材及各种安装包, 私信不常看!https://space.bilibili.com/1827181878?spm_id_from=333.1007.0.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据时代,数据实时同步解决方案的思考—最全的数据同步总结

F、 客户端开发&#xff0c;在maven中引入canal的依赖 com.alibaba.otter canal.client 1.0.21 代码示例&#xff1a; package com.example; import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import c…

[附源码]Nodejs计算机毕业设计基于Web美食网站设计Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

C++ Reference: Standard C++ Library reference: Containers: map: map: begin

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/begin/ 公有成员函数 <map> std::map::begin C98 iterator begin(); const_iterator begin() const; C11 iterator begin() noexcept; const_iterator begin() const noexcept;返回指向开始的iterato…

[附源码]Python计算机毕业设计甘肃草地植物数字化标本库管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

图拉普拉斯矩阵

正定矩阵 在线性代数里&#xff0c;正定矩阵 (positive definite matrix) 有时会简称为正定阵。 广义定义&#xff1a;设M是n阶方阵&#xff0c;如果对任何非零向量z&#xff0c;都有z⃗TMz⃗>0\vec{z}^TM\vec{z}>0zTMz>0&#xff0c;则称M为正定矩阵。 狭义定义&…

CSS之display:grid的用法和动态:before content内容

CSS之display:grid的用法和动态:before content内容1. display:grid的用法2.动态:before content内容3.完整代码&#xff1a;项目诉求&#xff1a; 突然有个需求&#xff0c;就是 指定行列&#xff0c;并呈现N字型展示数据&#xff0c;如下所示&#xff1a; 有纠结是用display:…

[附源码]Python计算机毕业设计高校创新学分申报管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

来看!这才是久经沙场得 SQL 优化经验

跟着 SQL 优化得经验之谈&#xff0c;面试真的可以侃侃而谈。 那么面对复杂的关系数据&#xff0c;我们如何来优化&#xff0c;SQL如何玩转更优&#xff1f; 先抛出了4个关于优化方面的问题&#xff1a; 1.返回表中0.014%的数据应不应该走索引&#xff1f; 2.什么样的列必须…

股票买卖接口如何实现委托下单的功能?

股票买卖接口如何实现委托下单的功能&#xff1f;一般来说&#xff0c;股票买卖接口都是相关的人士已经设计好&#xff0c;并且是程序形式呈现出来的&#xff0c;和券商系统链接起来&#xff0c;这样就可以实现交易了&#xff0c;下面给分享关于股票买卖接口是如何执行委托下单…

计算机系统实验-DataLab

一.实验题目及要求 在给定规则限制下完成bits.c中的函数。其中最主要的规则如下&#xff1a; 整数规则 不能使用for while if等只能使用! ˜ & ˆ | << >>运算符只能使用int只能使用0-0xFF的常数使用运算符数不超过限制(Max ops)不能使用全局变量或调用函数…

将简单工厂模式改造应用到项目中,而不是纸上谈兵

10月26日晚补充&#xff1a;经过掘友的提醒&#xff0c;我才发现之前我这篇所写的策略模式&#xff0c;其本身更偏向于工厂模式&#xff0c;我起初以为是掘友分不清工厂模式和策略模式&#xff0c;实际上是我自己把自己绕进去&#xff0c;看不清工厂模式和策略模式的区别。 因…

网闸的工作原理

网闸GAP由固态读写开关和存储人质系统组成&#xff0c;其中固态开关的转换效率达到了纳秒级&#xff0c;存储介质通常采用scsi硬盘&#xff0c;因此GAP的性能得到了保证。 GAP连接在两个独立的网络系统中间&#xff0c;内网与外网永远不同时连接&#xff0c;在同一时刻只有一个…

鱼传科技:函数计算,只要用上就会觉得香

深圳鱼传科技有限公司是专注以精准营销和互联网生态产品运营为核心的综合互联网营销推广服务商。通过整合全网优质媒体资源&#xff0c;并结合智能数据模型和 AI 标签算法&#xff0c;向企业提供包括流量矩阵搭建运营、媒介流量采买、投放模型设计、产品营销策划、数据监控分析…

面试官:如何解决 Redis 数据倾斜、热点等问题

Redis 作为一门主流技术&#xff0c;应用场景非常多&#xff0c;很多大中小厂面试都列为重点考察内容 前几天有小伙伴学习时&#xff0c;遇到下面几个问题&#xff0c;来咨询小编 考虑到这些问题比较高频&#xff0c;工作中经常会遇到&#xff0c;这里写篇文章系统讲解下 问…

健身房头戴式耳机好吗、最优秀的健身房耳机推荐

作为一名运动爱好者&#xff0c;无论是在户外跑步、骑行&#xff0c;还是在室内健身&#xff0c;耳机都是平日运动时不可或缺的装备。即使在日常通勤中&#xff0c;很多人也不能缺少它的陪伴。普通的耳机很好选择&#xff0c;只需要看音质好不好就可&#xff0c;运动耳机就比较…

win10系统下安装JDK1.8及配置环境变量的方法

1&#xff1a;下载安装包 地址&#xff1a;https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 选择与自己环境相匹配的安装包 后续过程需要登录Oracle账号&#xff0c;如果你网络环境不好或者没有Oracle账号&#xff0c;请按照文末默认获取方式获…

ssm+Vue计算机毕业设计校园闲置物品交易系统(程序+LW文档)

ssmVue计算机毕业设计校园闲置物品交易系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…

GCSE英语语言考试-叙述视角

What is narrative voice? Narrative voice is the perspective the story is told from. The writer chooses a narrative voice carefully, as it can have an important effect on the story and the reader’s response. 什么是叙述视角&#xff1f; 叙述视角是讲述故事的…

机器人逆向运动学(IK)入门:问题分析

在游戏开发和机器人开发中进场需要用到的一个场景是&#xff0c;给机器人或者游戏角色末位置的位置和姿态&#xff0c;求解可到达给定位置和姿态的各关节的角度值&#xff0c;这里就需要逆向运动学去求解这个问题&#xff0c;在场景中有着很多的应用&#xff0c;比如说六轴机械…

电脑重装系统蓝屏详细解决方法分享

我们在使用电脑时我们经常会遇到各种问题&#xff0c;比如卡顿&#xff0c;死机&#xff0c;蓝屏&#xff0c;黑屏等等。今天这里小编为大家介绍的是电脑蓝屏的问题&#xff0c;电脑蓝屏会导致数据丢失、未保存的文件丢失、游戏关键时刻坑队友等情况。接下来&#xff0c;小编就…