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
相关产品推荐
相关产品推荐

