You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++新手求助:如何动态填充ttgl::vec3f数组生成圆位置

嘿,作为刚接触C++的新手,遇到动态生成顶点数组的问题太正常了!你原来的静态数组是固定的矩形顶点,现在要动态生成圆形的顶点,我给你一个实用的解决方案,用std::vector来搞定动态存储的问题,比手动管理动态数组安全得多~

解决方案:用std::vector动态生成圆形顶点

首先,静态数组没法动态调整大小,所以我们改用std::vector<ttgl::vec3f>来存储动态生成的顶点——它会自动帮你管理内存,不用操心扩容和释放的问题。下面是完整的实现函数:

#include <vector>
#include <cmath>

// 生成填充圆形的顶点数组(三角扇形式,适合绘制实心圆)
// 参数:radius-半径,sides-边数(越多越接近圆),center-圆心坐标(默认原点)
std::vector<ttgl::vec3f> getCirclePositions(GLfloat radius, GLint sides, const ttgl::vec3f& center = ttgl::vec3f(0.0f, 0.0f, 0.0f)) {
    std::vector<ttgl::vec3f> positions;
    // 预分配内存:1个中心顶点 + sides个边缘顶点 + 1个重复的边缘顶点(闭合图形)
    positions.reserve(sides + 2);

    // 计算每个边缘顶点的角度增量,用acos(-1.0f)代替M_PI避免宏定义兼容问题
    const float angleStep = 2.0f * acos(-1.0f) / sides;

    // 添加三角扇的中心顶点
    positions.push_back(center);

    // 生成第一个边缘顶点(后面要重复一次来闭合图形)
    float firstX = center.x + radius * cos(0.0f);
    float firstY = center.y + radius * sin(0.0f);
    positions.push_back(ttgl::vec3f(firstX, firstY, center.z));

    // 生成剩下的边缘顶点
    for (int i = 1; i <= sides; ++i) {
        float currentAngle = i * angleStep;
        float x = center.x + radius * cos(currentAngle);
        float y = center.y + radius * sin(currentAngle);
        positions.emplace_back(x, y, center.z); // emplace_back直接构造对象,比push_back更高效
    }

    return positions;
}

关键细节说明

  • 为什么用std::vector?:它支持动态添加元素,自动扩容,而且可以通过data()方法获取底层数组的指针,完全兼容需要数组输入的ttgl API。
  • 三角扇顶点结构:这种结构只需要一个中心顶点,加上一圈边缘顶点,就能用三角扇绘制出实心圆,比用多个独立三角形节省内存。
  • 角度计算:用acos(-1.0f)代替M_PI是因为有些编译器默认没定义M_PI,这样代码兼容性更好。
  • emplace_back的优势:直接在vector里构造ttgl::vec3f对象,避免额外的拷贝操作,效率更高。

如何使用这个函数

生成顶点后,你可以直接使用vector,或者转换成数组指针(如果ttgl的API需要的话):

// 示例:生成半径1.0、16边的圆形顶点,圆心在(0,0,0)
auto circleVertices = getCirclePositions(1.0f, 16);

// 如果需要数组指针(比如ttgl的绘制函数接受ttgl::vec3f*类型)
ttgl::vec3f* vertexPtr = circleVertices.data();
size_t vertexCount = circleVertices.size();

// 之后就可以把vertexPtr和vertexCount传给你的绘制API了
// 比如:ttgl::drawTriangles(vertexPtr, vertexCount);

可选:如果必须用动态分配的数组(不推荐)

如果你的场景一定要用手动分配的动态数组,可以从vector拷贝数据,但记得用完要释放内存:

std::vector<ttgl::vec3f> tempVertices = getCirclePositions(1.0f, 16);
ttgl::vec3f* dynamicArray = new ttgl::vec3f[tempVertices.size()];
std::copy(tempVertices.begin(), tempVertices.end(), dynamicArray);

// 使用数组...

// 用完必须释放,否则内存泄漏!
delete[] dynamicArray;

内容的提问来源于stack exchange,提问作者dwalin93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:06:17