gpt4 book ai didi

c++ - 如何使用 OpenGL 在圆圈内绘制随机点?

转载 作者:行者123 更新时间:2023-11-28 05:42:11 25 4
gpt4 key购买 nike

如何在圆圈内绘制随机点?我有以下绘制随机点的代码,但我似乎无法弄清楚如何将它们绘制在一个圆圈内!我一直在使用距离公式来生成没有运气的随机点。我希望在圆圈内生成点,但我只是得到一个空白屏幕。不确定我做错了什么。

这是我的代码:

#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#include <vector>
#include <cstdlib>
#define __gl_h_
#include <cmath>
#include <iostream>

struct Point
{
float x, y;
unsigned char r, g, b, a;
};
std::vector< Point > points;

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50, 50, -50, 50, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();



// draw
glColor3ub( 255, 255, 255 );
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );
glVertexPointer( 2, GL_FLOAT, sizeof(Point), &points[0].x );
glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof(Point), &points[0].r );
glPointSize( 3.0 );
glDrawArrays( GL_POINTS, 0, points.size() );
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );

glFlush();
glutSwapBuffers();
}

void reshape(int w, int h)
{
glViewport(0, 0, w, h);
}

int main(int argc, char **argv)
{
glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

glutInitWindowSize(640,480);
glutCreateWindow("Random Points");

glutDisplayFunc(display);
glutReshapeFunc(reshape);

// populate points
for( size_t i = 0; i < 1000; ++i )
{
Point pt;
//pt.x = -50 + (rand() % 100);
//pt.y = -50 + (rand() % 100);


int angle = (rand() % 100 + 1) * 3.1416 * 2;
int radius = (rand() % 100 + 1) * 50;
pt.x = ((radius * cos(angle))-50);
pt.y = ((radius * sin(angle))-50);


pt.r = 125;
pt.g = 125;
pt.b = 125;
pt.a = 255;
points.push_back(pt);
}

glutMainLoop();
return 0;
}

最佳答案

  1. 你的角度是int以弧度为单位

    所以它只被截断到角度{0,1,2,3,4,5,6} [rad]所以你不能只覆盖那些 7 的圆圈内部线。

  2. 你在混intdouble同时计算

    如果不进行适当的转换,它可能会被截断(取决于编译器)。如果你意识到sin,cos<-1,+1> 范围内截断后你只得到 {-1,0,+1}这将只生成 9可能的角度。 (与 #1 的组合甚至更少,因此您只渲染几个点并且很可能没有在 View 中识别它们)。

  3. 我不使用你的rand()所以我不确定它会返回什么。

    我敢打赌它会返回范围内的整数 RAND_MAX值(value)。

    我习惯了VCL风格Random()有两个选项:

    double Random();     // return pseudo-random floating number in range <0.0,1.0)
    int Random(int max); // return pseudo-random integer number in range <0,max)

    因此,如果您的 rand()相似,那么您将结果截断为 {0}使它无用。请查阅您的 rand() 的文档查看它是整数还是 float ,并根据需要进行相应更改。

  4. 您很可能将中心移到了视野之外

    你正在减去 50来自 <-50,+50> 范围内的值将其转移到 <-100,0>我敢打赌它在你的屏幕之外。我懒得分析你的代码,但我认为你的屏幕是 <-50,+50>所以尽量不要移动

当把它们放在一起时试试这个:

double angle = double(rand() % 1000) * 6.283185307179586476925286766559;
int radius = rand() % 51;
pt.x = double(double(radius)*cos(angle));
pt.y = double(double(radius)*sin(angle));

关于c++ - 如何使用 OpenGL 在圆圈内绘制随机点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36878541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com