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

Posted

技术标签:

【中文标题】如何使用 OpenGL 在圆内绘制随机点?【英文标题】:How do I plot random points inside a circle using OpenGL? 【发布时间】:2016-04-27 01:07:25 【问题描述】:

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

这是我的代码:

#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) 你做了什么? (你已经回答了这个)。 2) 你预期会发生什么? 3) 究竟发生了什么? 【参考方案1】:

    你的角度是 int 弧度

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

    您在计算时混合了intdouble

    如果没有适当的转换,它可能会被截断(取决于编译器)。如果您意识到sin,cos 在截断后在&lt;-1,+1&gt; 范围内,那么您只会得到-1,0,+1,它将仅生成9 可能的角度。 (与 #1 组合使用更少,因此您只渲染了几个点,很可能在视图中没有识别它们。

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

    我敢打赌,它返回的整数范围最大为 RAND_MAX 值。

    我习惯 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() 的文档以查看它是整数还是浮点数,并根据需要进行相应更改。

    您很可能会移动中心外视图

    您从&lt;-50,+50&gt; 范围内的值中减去50,将其转换为&lt;-100,0&gt;,我敢打赌它在您的屏幕之外。我懒得分析你的代码,但我认为你的屏幕是&lt;-50,+50&gt;,所以尽量不要移动

当把所有东西放在一起试试这个:

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));

【讨论】:

对于随机数,您现在有&lt;random&gt; 感谢您的帮助。这只是给了我一条向右的直线。 @NicholasGenco 你的cossin 想要以弧度或度为单位的角度?

以上是关于如何使用 OpenGL 在圆内绘制随机点?的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题PythonLeetCode 478. 在圆内随机生成点

数据结构与算法之深入解析“在圆内随机生成点”的求解思路与算法示例

Python描述 LeetCode 478. 在圆内随机生成点

测试点是不是在圆内的方程

LeetCode 430. 扁平化多级双向链表 / 583. 两个字符串的删除操作 / 478. 在圆内随机生成点(拒绝采样圆形面积推导)

谷歌面试题:在半径为1的圆中随机选取一点