如何使用 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
线的圆圈内部。
您在计算时混合了int
和double
如果没有适当的转换,它可能会被截断(取决于编译器)。如果您意识到sin,cos
在截断后在<-1,+1>
范围内,那么您只会得到-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()
的文档以查看它是整数还是浮点数,并根据需要进行相应更改。
您很可能会移动中心外视图
您从<-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));
【讨论】:
对于随机数,您现在有<random>
。
感谢您的帮助。这只是给了我一条向右的直线。
@NicholasGenco 你的cos
和sin
想要以弧度或度为单位的角度?以上是关于如何使用 OpenGL 在圆内绘制随机点?的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题PythonLeetCode 478. 在圆内随机生成点
数据结构与算法之深入解析“在圆内随机生成点”的求解思路与算法示例
Python描述 LeetCode 478. 在圆内随机生成点
LeetCode 430. 扁平化多级双向链表 / 583. 两个字符串的删除操作 / 478. 在圆内随机生成点(拒绝采样圆形面积推导)