用c+绘制一个圆+;使用openGL 我一直在尝试用OpenGL在C++中画一个圆。 这是我用来得到这个形状的函数 void Sprite::init(int x, int y, int width, int height, Type mode, float scale) { _x = x; _y = y; _width = width; _height = height; //generate buffer if it hasn't been generated if (_vboID == 0) { glGenBuffers(1, &_vboID); } Vertex vertexData[360]; if (mode == Type::CIRCLE) { float rad = 3.14159; for (int i = 0; i < 359; i++) { vertexData[i].setPosition((rad * scale) * cos(i), (rad * scale) * sin(i)); } } //Tell opengl to bind our vertex buffer object glBindBuffer(GL_ARRAY_BUFFER, _vboID); //Upload the data to the GPU glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); //Unbind the buffer glBindBuffer(GL_ARRAY_BUFFER, 0); } void Sprite::init(int x,int y,int width,int height,Type mode,float scale){ _x=x; _y=y; _宽度=宽度; _高度=高度; //如果尚未生成缓冲区,则生成缓冲区 如果(_vboID==0){ glGenBuffers(1,&u vboID); } 顶点顶点顶点数据[360]; if(mode==Type::CIRCLE){ 浮点数rad=3.14159; 对于(int i=0;i
是什么引起了这条线?为什么我的圈子被压缩了用c+绘制一个圆+;使用openGL 我一直在尝试用OpenGL在C++中画一个圆。 这是我用来得到这个形状的函数 void Sprite::init(int x, int y, int width, int height, Type mode, float scale) { _x = x; _y = y; _width = width; _height = height; //generate buffer if it hasn't been generated if (_vboID == 0) { glGenBuffers(1, &_vboID); } Vertex vertexData[360]; if (mode == Type::CIRCLE) { float rad = 3.14159; for (int i = 0; i < 359; i++) { vertexData[i].setPosition((rad * scale) * cos(i), (rad * scale) * sin(i)); } } //Tell opengl to bind our vertex buffer object glBindBuffer(GL_ARRAY_BUFFER, _vboID); //Upload the data to the GPU glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); //Unbind the buffer glBindBuffer(GL_ARRAY_BUFFER, 0); } void Sprite::init(int x,int y,int width,int height,Type mode,float scale){ _x=x; _y=y; _宽度=宽度; _高度=高度; //如果尚未生成缓冲区,则生成缓冲区 如果(_vboID==0){ glGenBuffers(1,&u vboID); } 顶点顶点顶点数据[360]; if(mode==Type::CIRCLE){ 浮点数rad=3.14159; 对于(int i=0;i,c++,opengl,sdl,sdl-2,C++,Opengl,Sdl,Sdl 2,是什么引起了这条线?为什么我的圈子被压缩了 对不起,如果这是一个愚蠢的问题,或者这个问题不属于这个网站,我对C++和这个网站都是新的。 不必自己测试代码就很难确定,但无论如何我都会猜到。 奇怪的行可能是由于缓冲区未完全初始化造成的。这是错误的: Vertex vertexData[360]; for (int i = 0; i < 359; i++) { 顶点顶点数据[360]; 对于(int i=0;i
对不起,如果这是一个愚蠢的问题,或者这个问题不属于这个网站,我对C++和这个网站都是新的。 不必自己测试代码就很难确定,但无论如何我都会猜到。 奇怪的行可能是由于缓冲区未完全初始化造成的。这是错误的:
Vertex vertexData[360];
for (int i = 0; i < 359; i++) {
顶点顶点数据[360];
对于(int i=0;i<359;i++){
应该是:
for (int i = 0; i < 360; i++) {
for(int i=0;i<360;i++){
或者,vertexData[359]
处的位置未初始化,并包含一些较远的点
关于椭圆而不是圆,这可能是由于视口在水平和垂直方向上没有相同的比例造成的。例如,如果将视口+变换矩阵配置为具有X=-10..10,Y=-10..10的视锥,但实际视口是X=0..800和Y=0..600,则比例将不同你的图像会被扭曲
解决办法是:
glViewport()
不亲自测试代码就很难确定,但我还是会猜 奇怪的行可能是由于缓冲区未完全初始化造成的。这是错误的:
Vertex vertexData[360];
for (int i = 0; i < 359; i++) {
顶点顶点数据[360];
对于(int i=0;i<359;i++){
应该是:
for (int i = 0; i < 360; i++) {
for(int i=0;i<360;i++){
或者,vertexData[359]
处的位置未初始化,并包含一些较远的点
关于椭圆而不是圆,这可能是由于视口在水平和垂直方向上没有相同的比例造成的。例如,如果将视口+变换矩阵配置为具有X=-10..10,Y=-10..10的视锥,但实际视口是X=0..800和Y=0..600,则比例将不同你的图像会被扭曲
解决办法是:
glViewport()
我不明白你到底想得到什么,但是…
cos()
和sin()
收到了一个令人振奋的论据;因此,与其说是cos(I)
和sin(I)
,不如说你需要cos((2*rad*I)/360.0))
和sin((2*rad*I)/360.0))
或者,简化为cos((rad*I)/180.0))((rad*i)/180.0))
那么圆的中心和半径呢
(x
,y
)应该是圆的中心吗
scale
是无线电波吗
在这种情况下,我想您应该编写如下内容(注意:未测试)
顶点顶点数据[360];
浮点数rad=3.14159;
if(mode==Type::CIRCLE){
对于(int i=0;i<359;++i){
浮动角度=(rad/180)*i;//(感谢罗德里戈)
顶点数据[i]。设置位置(x+比例*cos(角度),y+比例*sin(角度));
}
}
或者,失去了精度,但避免了一些摩尔复制
Vertex vertexData[360];
float rad = 3.14159;
float angIncr = rad / 180.0;
if (mode == Type::CIRCLE) {
for (int i = 0, float angle = 0.0; i < 359; ++i, angle += angIncr) {
vertexData[i].setPosition(x + scale * cos(angle), y + scale * sin(angle));
}
}
顶点顶点数据[360];
浮点数rad=3.14159;
浮动angIncr=rad/180.0;
if(mode==Type::CIRCLE){
对于(int i=0,浮动角度=0.0;i<359;++i,角度+=angIncr){
顶点数据[i]。设置位置(x+比例*cos(角度),y+比例*sin(角度));
}
}
但是宽度和高度呢
p、 对不起,我的英语不好
--根据罗德里戈的建议修改--我不清楚你到底想要得到什么,但是…
cos()
和sin()
收到了一个令人振奋的论点;因此,我想你需要的不是cos(I)
和sin(I)
,而是cos((2*rad*I)/360.0))
和sin((2*rad*I)/360.0))
or,semplified,cos((rad*i)/180.0))
和cos((rad*i)/180.0))
那么圆的中心和半径呢
(x
,y
)应该是圆的中心吗
scale
是无线电波吗
在这种情况下,我想您应该编写如下内容(注意:未测试)
顶点顶点数据[360];
浮点数rad=3.14159;
if(mode==Type::CIRCLE){
对于(int i=0;i<359;++i){
浮动角度=(rad/180)*i;//(感谢罗德里戈)
顶点数据[i]。设置位置(x+比例*cos(角度),y+比例*sin(角度));
}
}
或者,失去了精度,但避免了一些摩尔复制
Vertex vertexData[360];
float rad = 3.14159;
float angIncr = rad / 180.0;
if (mode == Type::CIRCLE) {
for (int i = 0, float angle = 0.0; i < 359; ++i, angle += angIncr) {
vertexData[i].setPosition(x + scale * cos(angle), y + scale * sin(angle));
}
}
顶点顶点数据[360];
浮动无线电=