c++计算贝塞尔曲线(折线平滑为曲线)坐标方法

这篇具有很好参考价值的文章主要介绍了c++计算贝塞尔曲线(折线平滑为曲线)坐标方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果可查看上一篇博文:js手动画平滑曲线,贝塞尔曲线拟合【代码】js手动画平滑曲线,贝塞尔曲线拟合。https://blog.csdn.net/qiufeng_xinqing/article/details/131711963?spm=1001.2014.3001.5502

代码如下:文章来源地址https://www.toymoban.com/news/detail-565229.html

#include <cmath>
#include <cstdint>
#include <exception>
#include <vector>

namespace line {
// 二维坐标点定义:first对应x值,second对应y值
using point_t = std::pair<double, double>;

/// <summary>
/// 阶乘(递归),即 n! = n * (n-1) * (n-2) * (n-3) * ...* 1
/// </summary>
/// <param name="num">阶乘的数</param>
/// <returns>阶乘结果数</returns>
double factorial(double num)
{
	return (num <= 1) ? 1 : (num * factorial(num - 1));
}

/// <summary>
/// 通过多个控制点计算当前贝塞尔曲线上的点坐标,横坐标为[0,1]
/// 关于 贝塞尔曲线:https://www.cnblogs.com/fangsmile/articles/11642607.html
/// </summary>
/// <param name="points">控制点集合</param>
/// <param name="stepTime">横轴的步长,如果为零则使用默认的 0.01 使用为步长</param>
/// <param name="retLine">贝塞尔曲线上的点坐标集</param>
/// <returns>贝塞尔曲线上的点坐标集</returns>
const std::vector<point_t>& calcBezierLine(const std::vector<point_t>& points, double stepTime, std::vector<point_t>& retLine)
{
	if (points.size() < 2)
	{
		retLine.resize(1);
		retLine[0] = points[0];
		return retLine;
	}

	int32_t pointsn = points.size() - 1;
	int64_t pointsFact = factorial(pointsn);
	int32_t retCount = 0;

	stepTime = stepTime == 0 ? 0.01 : stepTime;
	retLine.resize((1 / stepTime) + 1);
	for (double xt = 0; xt <= 1; xt += stepTime)
	{
		double x = 0.0;
		double y = 0.0;

		for (int32_t n = 0; n < points.size(); n++)
		{
			const auto& p = points[n];

			if (!n)
			{
				double fact = std::pow((1 - xt), pointsn - n) * std::pow(xt, n);
				x += p.first * fact;
				y += p.second * fact;
			}
			else
			{
				double fact = pointsFact / factorial(n) / factorial((int64_t)pointsn - n)
					* std::pow((1 - xt), (int64_t)pointsn - n) * std::pow(xt, n);
				x += fact * p.first;
				y += fact * p.second;
			}
		}

		retLine[retCount++] = std::make_pair(x, y);
	}

	return retLine;
}
}

int main()
{
	std::vector<line::point_t> points({ {115, 53},{392,105},{555,62}, {681, 94} });
	std::vector<line::point_t> retPoints(100);
	line::calcBezierLine(points, 0.01, retPoints);

    return 0;
}

到了这里,关于c++计算贝塞尔曲线(折线平滑为曲线)坐标方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • CSS动画中的贝塞尔曲线

    最近在学习CSS动画,其中动画时间函数的部分涉及到了 贝塞尔曲线 的相关知识。对于这部分知识,之前一直没有好好学习过,正好借着这个机会学习下。 首先简单介绍下贝塞尔曲线。 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲

    2024年02月09日
    浏览(69)
  • 彻底搞懂贝塞尔曲线的原理

    贝塞尔曲线介绍 我们在前面讲了绘制自定义曲线,而实际开发过程还会遇到更复杂的图形绘制,比如下面的这些图形: 这时候就需要用到贝塞尔曲线了。下面是百科关于贝塞尔曲线的介绍。 贝塞尔曲线就是这样的一条曲线,它是依据四个位置任意的点坐标绘制出的一条光滑

    2024年02月20日
    浏览(43)
  • unity 曲线可视化图表制作(lineRenderer + 贝塞尔曲线)

    需求要实现一个动态变化的曲线 思路: 分为两部分:画线和平滑曲线 首先解决画线问题: 1.lineRenderer 2.texture的setpixel 肯定选已经做好的轮子1啦 平滑曲线思路: 1.抛物线 2.贝塞尔曲线 抛物线做连续的曲线太抽象了 肯定选贝塞尔曲线 先了解一下贝塞尔曲线 一次贝塞尔 对应

    2023年04月08日
    浏览(51)
  • 贝塞尔曲线的python实现(简单易理解)

    贝塞尔曲线在计算机图形学中被大量使用,通常可以产生平滑的曲线。比如ps中的钢笔工具,就是利用的这种原理。由于用计算机画图大部分时间是操作鼠标来掌握线条的路径,与手绘的感觉和效果有很大的差别。即使是一位精明的画师能轻松绘出各种图形,拿到鼠标想随心

    2024年02月16日
    浏览(44)
  • Godot插值、贝塞尔曲线和Astar寻路

    线性插值是采用一次多项式上进行的插值计算,任意给定两个值A和B,那么在A和B之间的任意值可以定义为: P(t) = A * (1 - t) + B * t,0 = t = 1。 数学中用于线性拟合,游戏应用可以做出跟随效果(宠物跟随、npc跟随) 贝塞尔是插值的应用之一。贝塞尔曲线是为工业设计,是图形

    2024年04月14日
    浏览(42)
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    1. 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线。 2. 原理介绍 2.1 曲线的创建 unity建立网格曲线可以参考Unity程序化网格体的实现方法。主要分为顶点,三角面,UV和法线。笔者有类似的文章unity 线绳管道纯代码创建方法_,详细的讲解了网格线的

    2024年02月04日
    浏览(41)
  • Unity中的数学基础——贝塞尔曲线

    一:前言  一条贝塞尔曲线是由一组定义的控制点P0到 Pn,n=1为线性,n=2为二次......第一个和最后一个控制点称为起点和终点,中间的控制点一般不会位于曲线上  获取两个点之间的点就是通过线性插值( Mathf.Lerp),0 = t = 1 二:贝塞尔曲线公式 ——线性公式:给定点P0、P

    2024年02月11日
    浏览(38)
  • Unity ——使用贝塞尔曲线对三维管状物体进行弯曲

    参考链接:【Unity】弹性鱼竿简单实现-通过贝塞尔曲线修改Mesh - 简书 参考论文:吴晓亮, 黄襄念. Unity 中使用贝塞尔曲线对三维物体进行弯曲[J]. 现代计算机, 2016 (5): 57-59. unity项目下载:https://download.csdn.net/download/weixin_43042683/87690343 效果图 随着虚拟现实的发展,在游戏引擎中

    2024年02月11日
    浏览(63)
  • Bezier Curve 贝塞尔曲线 - 在Unity中实现路径编辑

    贝塞尔曲线( Bezier Curve ),又称贝兹曲线或贝济埃曲线,是计算机图形学中相当重要的参数曲线,在我们常用的软件如 Photo Shop 中就有贝塞尔曲线工具,本文简单介绍贝塞尔曲线在Unity中的实现与应用。 给顶点P 0 、P 1 ,只是一条两点之间的直线,公式如下: B(t) = P 0 + (P

    2024年01月23日
    浏览(42)
  • 曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)

    🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。 🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法 贝塞尔曲线是一种数学

    2024年01月16日
    浏览(71)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包