【chatgpt代码系列】三阶贝塞尔曲线等距点算法

该程序使用C++编写,通过递归算法计算三阶贝塞尔曲线上等间距的点。首先定义控制点,然后通过递归函数`recursiveDivide`以二分法计算参数t的中点并生成等间距点。程序涉及贝塞尔曲线的数学原理,包括计算曲线长度和使用导数确定点坐标。

0x01 代码

#include <iostream>
#include <vector>
using namespace std;

// 定义二维坐标点结构体
struct Point {
   
   
    double x;
    double y;
};

// 计算三阶贝塞尔曲线上某个参数t对应的点坐标
Point getBezierPoint(vector<Point>& controlPoints, double t) {
   
   
    double x = pow((1 - t), 3) * controlPoints[0].x + 
               3 * t * pow((1 - t), 2) * controlPoints[1].x +
               3 * pow(t, 2) * (1 - t) * controlPoints[2].x +
               pow(t, 3) * controlPoints[3].x;
    double y = pow((1 - t), 3) * controlPoints[0].y +
               3 * t * pow((1 - t), 2) * controlPoints[1].y +
               3 * pow(t, 2) * (1 - t) * controlPoints[2].y +
               pow(t, 3) * controlPoints[3].y;
    Point p = {
   
   x, y};
    return p;
}

// 递归计算三阶贝塞尔曲线上的等间距点
void recursiveDivide(vector<Point>& controlPoints, double t0, double t1, 
                     vector<Point>& pointList, int& idx) {
   
   
    // 当参数范围小于1e-6时停止递归
    if ((t1 - t0) < 1e-6) {
   
   
        return;
    }
    // 计算参数区间的中点
    double tMid = (t0 + t1) / 2.0;
    // 计算中点对应的贝塞尔曲线上的坐标
    Point pMid = getBezierPoint(controlPoints, tMid);
    // 将中点添加到结果列表中
    pointList[idx++] = pMid;
    // 递归计算左右两段曲线上的等间距点
    recursiveDivide(controlPoints, t0, tMid, pointList, idx);
    recursiveDivide(controlPoints, tMid, t1, pointList, idx);
}

int main() {
   
   
    // 定义控制点
    vector<Point> controlPoints = {
   
   {
   
   10, 10}, {
   
   50, 60}, {
   
   100, 30}, {
   
   150, 150}};

    // 定义采样个数
    int N = 10;
    // 计算初始和末尾点
    vector<Point> pointList(N + 1);
    pointList[0] = controlPoints.front();
    pointList[N] = controlPoints.back();

    // 递归计算曲线上的等间距点
    int idx = 1;
    recursiveDivide(controlPoints, 0.0, 1.0, pointList, idx);

    // 输出等间距的点容器
    for (auto& p : pointList) {
   
   
        cout << "(" << p.x << ", " << p.y << ")" << endl;
    }

    return <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值