2016-04-27 21 views
0

Wie zeichne ich zufällige Punkte innerhalb eines Kreises? Ich habe den folgenden Code, der zufällige Punkte plottet, aber ich kann nicht herausfinden, wie man sie innerhalb eines Kreises plant! Ich habe die Entfernungsformel verwendet, um zufällige Punkte ohne Glück zu generieren. Ich habe erwartet, Punkte innerhalb eines Kreises zu generieren, aber ich habe nur einen leeren Bildschirm bekommen. Nicht sicher, was ich falsch mache.Wie zeichne ich zufällige Punkte innerhalb eines Kreises mit OpenGL?

Hier ist mein Code:

#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; 
} 
+0

1) Was hast du getan? (Sie haben das bereits beantwortet). 2) Was hast du erwartet? 3) Was ist eigentlich passiert? – immibis

Antwort

1
  1. Ihr Winkel ist int in Radiant

    so wurde es nur auf Winkel abgeschnitten {0,1,2,3,4,5,6} [rad] so können Sie nicht in das Innere des Kreises decken nur diejenigen 7 Linien.

  2. Sie int und double während Berechnung

    ohne richtiges Gießen mischen könnte es wurde abgeschnitten (abhängig vom Compiler). Wenn Sie erkennen, sin,cos sind im Bereich <-1,+1> nach Trunkierung haben Sie nur {-1,0,+1}, die nur 9 möglichen Winkel generieren wird. (mit Kombination mit # 1 noch weniger, so dass Sie nur wenige Punkte rendern und höchstwahrscheinlich nicht erkannt haben).

  3. Ich verwende nicht Ihre rand(), so dass ich nicht sicher bin, was es zurückgibt.

    Meine Wette, dass es Ganzzahl im Bereich bis zu einigen RAND_MAX Wert zurückgibt.

    Ich bin es gewohnt, VCL Stil Random() die zwei Möglichkeiten:

    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) 
    

    Also, wenn Ihr rand() ähnlich ist, dann sind Sie das Ergebnis zu {0} Kürzen machen es nutzlos. Sehen Sie in der Dokumentation Ihres rand() nach, ob es sich um eine Ganzzahl oder eine Gleitkommazahl handelt, und ändern Sie sie bei Bedarf entsprechend.

  4. Sie sind höchstwahrscheinlich das Zentrum Außenansicht Verschiebung

    Sie Substraktion 50 von Wert im Bereich <-50,+50>, dass es zu <-100,0> verschieben, die ich außerhalb Ihres Bildschirms Wette ist. Ich bin zu faul, um Ihren Code zu analysieren, aber ich denke, dass Ihr Bildschirm <-50,+50> so versuchen, ist nicht an allen

zu verschieben, wenn alle zusammen versuchen Sie stattdessen:

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

Für Zufallszahlen haben Sie heutzutage [''] (http://en.cppreference.com/w/cpp/numeric/random). – Kos

+0

Danke für die Hilfe. Das gibt mir nur eine gerade Linie von Punkten nach rechts. –

+0

@NicholasGenco deine 'cos' und' sin' wollen Winkel im Bogenmaß oder Grad? – Spektre

Verwandte Themen