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

时间:2016-04-27 01:07:26

标签: c++ opengl graphics

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

这是我的代码:

#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 个答案:

答案 0 :(得分:1)

  1. 您的角度为弧度int

    所以它仅截断到角度{0,1,2,3,4,5,6} [rad],因此您无法覆盖那些7行的圆圈内部。

  2. 您在计算时混合intdouble

    没有适当的强制转换它可能会被截断(取决于编译器)。如果您在截断后意识到sin,cos<-1,+1>范围内,那么您只需生成{-1,0,+1} 9个角度rand()。 (结合#1 甚至更少,所以你只渲染几个点,很可能在视图中无法识别它们。)

  3. 我不使用您的RAND_MAX所以我不确定它会返回什么。

    我敢打赌,它会返回范围内的整数,最多可达Random()个值。

    我习惯 VCL 样式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(),使其无效。请查阅50的文档,看它是整数还是浮动,并在需要时进行相应更改。

  4. 您最有可能将中心转移到视野之外

    您正在从<-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)); ,所以尽量不要转移

  5. 当把所有人放在一起时试试这个:

    ObservableCollection<IRenderableSeriesViewModel>