2013-12-03 3 views
1

как я могу нарисовать форму, как (sin), если я описываю форму, наполовину замкнутую, а другую половину круга, связанную с первой. используя декартову метод это мой пытается:Рисование формы с использованием opengl

#include <windows.h> 
#include <gl/Gl.h> 
#include <gl/glut.h> 
#include<math.h> 
#include<cstdlib> 

static void myDisplay() 
    { 
     glClear(GL_COLOR_BUFFER_BIT); // clear the screen 
     glColor3f(1.0,0.0,0.0); 
     glColor3f(0.0,0.0,0.0); 
      glBegin(GL_LINE_LOOP); 

     double xc=200, yc=200,r=100; 
      double x,y; 

      for (x = xc - r; x<= xc + r;x++) 
      { 
      y = sqrt((r*r)-((xc - x)*(xc - x))); 
      glVertex2d(x, yc + y); 

      } 

      for (x = xc +r ; x<= xc - r ; x++) 
      { 
      y = sqrt((r*r)-((xc - x)*(xc - x))); 

      glVertex2d(x , yc - y); 
      } 


     glEnd(); 

     glFlush(); 
     } 
void myInit(void) 
{ 
glClearColor(1.0,1.0,1.0,0.0);  // set white background color 
glColor3f(0.0f, 0.0f, 0.0f);   // set the drawing color 
glPointSize(4.0);    // a ‘dot’ is 4 by 4 pixels 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(0.0, 640.0, 0.0, 480.0); 
}  

void main(int argc, char** argv) 
{ 
glutInit(&argc, argv);   // initialize the toolkit 
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // set display mode 
glutInitWindowSize(640,480);  // set window size 
glutInitWindowPosition(100, 150); // set window position on screen 
glutCreateWindow("Line Scan Conversion"); // open the screen window 
glutDisplayFunc(myDisplay);  // register redraw function 
myInit(); 

glutMainLoop();    // go into a perpetual loop 
} 
+0

В чем проблема с кодом? – Rookie

+0

рисунок первой половины круга, но вторая половина (рядом) первая, я не знаю, чтобы сделать это – rose

+0

Просто нарисуйте отдельные объекты полукруга и переверните вторую половину круга вверх ногами. Простая функция sin/cos circle - все, что вам нужно. Если я правильно понял вас ... – Rookie

ответ

0

Просто образец функции (sin()) непосредственно:

sin

#include <GL/glut.h> 
#include <cmath> 

static void myDisplay() 
{ 
    glClearColor(0, 0, 0, 1);  // set white background color 
    glClear(GL_COLOR_BUFFER_BIT); // clear the screen 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-0.5, 7, -1.2, 1.2, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // axes 
    glColor3ub(255, 255, 255); 
    glBegin(GL_LINES); 
    glVertex2i(0, 0); 
    glVertex2i(7, 0); 
    glVertex2i(0, -1); 
    glVertex2i(0, 1); 
    glEnd(); 

    // sin() function plot 
    glColor3ub(255, 0, 0); 
    glBegin(GL_LINE_STRIP); 
    const unsigned int samples = 100; 
    for(unsigned int i = 0; i <= samples; ++i) 
    { 
     const float pct = ((float)i/samples); 
     const float x = 2 * 3.14159 * pct; 
     const float y = sin(x); 
     glVertex2f(x, y); 
    } 
    glEnd(); 

    glutSwapBuffers(); 
} 

void main(int argc, char** argv) 
{ 
    glutInit(&argc, argv);   // initialize the toolkit 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // set display mode 
    glutInitWindowSize(600, 600);  // set window size 
    glutCreateWindow("Line Scan Conversion"); // open the screen window 
    glutDisplayFunc(myDisplay);  // register redraw function 
    glutMainLoop();    // go into a perpetual loop 
} 
+0

, пожалуйста, поймите меня, я не могу загрузить изображение, потому что моя репутация немного, я хочу, как грех, а не грех, но похоже, что грех поставил первую половину круга вверх, должен быть закрыт, а половина круга вниз должна быть закрыта тоже с помощью декартового метода – rose

+0

@ genpfault рисунок первой половины круга, но вторая половина (рядом) первая, я не знаю, чтобы сделать это – rose

0

Существует проблема в вашем втором for цикле:

for(x = xc + r; x <= xc - r; x++)

Это выполняется как x = 400; x <= 0; x++, который явно никогда не будет работать. Ваша проблема (за исключением очевидного выше) заключается в том, что вы пытаетесь учитывать смещение x в итерациях цикла. Я предлагаю изменения к следующему:

for(x = 0; x < 2r; x++)

, а затем вместо

glVertex2d(x, yc + y);

glVertex2d(x, yc - y);

сделать

glVertex2d((xc - r) + x, yc + y);

glVertex2d((xc + r) + x, yc - y);

или что-то подобное (не в состоянии проверить это, но вы должны получить эту идею).

+0

@ ssell, пожалуйста, вместо (x = 0; x <2r; x ++) вместо первого и второй цикл или что? – rose

+0

Я бы сделал ваш код рисования похожим: 'for (x = 0; x <2r; x ++) {y = sqrt ((r * r) - ((xc - x) * (xc - x))); glVertex2d ((xc - r) + x, yc + y); } 'для первой половины, а затем' for (x = 0; x <2r; x ++) {y = sqrt ((r * r) - ((xc - x) * (xc - x))); glVertex2d ((xc + r) + x, yc - y); } 'для второй половины. – ssell

Смежные вопросы