我创建了一个 C++ 模板来定义不同数据类型的 2D 点,作为在 OpenGL 程序中重新学习 C++ 的任务。
template <typename T>
class Point2D {
public:
Point2D(const T& x, const T& y) {
_data[0] = x;
_data[1] = y;
}
const T & x() { return _data[0]; }
const T & y() { return _data[1]; }
private:
T _data[2];
};
我可以创建 Point2D 的多个命名实例并存储值并使用它们绘制基本形状
Point2D <GLdouble> c0( 0.5, 0.5);
Point2D <GLdouble> c1(-0.5, 0.5);
然后绘制像我访问点中的值。
glBegin(GL_LINES);
glVertex2d(c0.x(), c0.y());
glVertex2d(c1.x(), c1.y());
glEnd();
但是,我想创建一个相同模板类型(例如 double )的 Points2D 对象数组来表示一个形状。
我如何创建模板化 Point2D 数组并表示我可以在模板化对象循环数组中绘制的更复杂的对象。
glBegin(GL_POLYGON);
for (k = 0; k < 4; k++) {
glVertex2d( ????? [i].x(), ????? [i].x());
}
glEnd();
有人可以建议我做这件事的方法吗?
谢谢
斯图尔特
最佳答案
要存储多个点,请使用 C 数组或更好的 std::vector 容器,然后在循环中枚举点并为每个点调用 glVertex2d
#include <vector>
std::vector< Point2D <GLdouble> > points = {Point2D<GLdouble>(0.5, 0.5),
Point2D<GLdouble>(-0.5, 0.5)};
size_t size = points.size();
glBegin(GL_LINES);
for (size_t i = 0; i < size; ++i)
{
glVertex2d( points[i].x(), points[i].x());
}
glEnd();
但是如果您使用 OpenGL 1.1 或更高版本,最好使用顶点数组缓冲区而不是单独的 glVertex 调用。尝试通过添加将 ponter 返回到第一个数组元素的方法来修改你的点类
template <typename T>
class Point2D {
public:
Point2D(const T& x, const T& y) {
_data[0] = x;
_data[1] = y;
}
const T & x() { return _data[0]; }
const T & y() { return _data[1]; }
T* data() const { return &_data[0]; }
private:
T _data[2];
};
然后将点添加到容器中,创建一次顶点缓冲区然后绑定(bind)它并调用函数 glVertexPointer。绘制元素使用 glDrawArrays
GLuint bufferId;
glGenBuffers(1, &bufferId);
std::vector< Point2D <GLdouble> > points = {Point2D<GLdouble>(0.5, 0.5),
Point2D<GLdouble>(-0.5, 0.5)};
size_t size = points.size();
glBindBuffer(GL_ARRAY_BUFFER, bufferId);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_DOUBLE, 0, (const GLvoid *)points[0].data()); // <= 2 - X and Y
glDrawArrays(GL_LINES, 0, points.size());
关于c++ - 创建并遍历模板化对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36744058/