Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

OOP: C++/OpenGl.  Creating multiple bezier curves

Posted on 2003-11-26
3
2,023 Views
Last Modified: 2007-12-19
Hi, I'm relatively new to OOP/C++/Opengl.  Thanks in advance.

I want to create multiple Bezier curves in a OOP class structure.  Eventually I would like to create multiple bezier curves with different attributes like x, y position, line thickness, etc.

I'm having difficulty with pointer/array portion.  I want to create an array of 100 bezier curves.  These individual curves are set up in an 6x3 array.  I'm getting 2 errors.  

My code:
#include <windows.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream.h>
#include <time.h>

//function prototypes

//Define bezier class for animation

class BezierClass {

     public:
     float x1,y1;
     float x2,y2;
     float x_cp1,y_cp1;
     float x_cp2,y_cp2;
     float x_cp3,y_cp3;
     float x_cp4,y_cp4;
     float xpos,ypos;

     BezierClass() {
     float bezierArray[6][3] =
               { {x1, y1, 0.0},     /* 1st End Point */
                {x_cp1, y_cp1, 0.0},     /* 1st Control P. */
                {x_cp2, y_cp2, 0.0},     /* 2nd Control P. */
                {x_cp3, y_cp3, 0.0},     /* 3rd Control P. */
                {x_cp4, y_cp4, 0.0},     /* 3th Control P. */
                {x2, y2, 0.0} };          /* 2nd End Point */;

     }

};


/* Create an array of type bezierClass that may hold 100 beziers */
BezierClass bezierArray[100];
int beziernum=0;
int totalbezier=5;
float zoom = -7;

void InitGL(int Width, int Height)
{
     glClearDepth(1.0);
     glClearColor(0.0, 0.0, 0.0, 0.0);     /* bg color = black */
     glDepthFunc(GL_LESS);               /* nearer appears nearer */
     glEnable(GL_DEPTH_TEST);          /* enable depth testing */
     glShadeModel(GL_SMOOTH);          /* shade colors smooth */
     glMatrixMode(GL_PROJECTION);          /* switch the matrix */
     glLoadIdentity();               /* reset the cur. matrix */
     gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
     glMatrixMode(GL_MODELVIEW);          /* switch matrix back */
}

void DrawGLScene(void)
{
     int i;                         /* temp var */

     /* Clear the screen and the buffers */
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glLoadIdentity();               /* reset cur. matrix */
     glTranslatef(0.0f, 0.0f, -10.0f);     /* move the cam */

     /* ok, this is the main point of our bezier curve
      * void glMap1f(GLenum target, float u1, float u2, int stride
      *         int order, const float *points);
      * target is one of these:
      * GL_MAP1_VERTEX_3     (Vertex Coordinates (xyz))
      * GL_MAP1_VERTEX_4     (Vertex Coordinates (xyzw))
      * GL_MAP1_INDEX     (Color Index)
      * GL_MAP1_COLOR_4     (Color Values (rgba))
      * GL_MAP1_NORMAL     (Normal Coordinates)
      * GL_MAP1_TEXTURE_COORD_1/2/3/4 (Texture Coordinates(s/st/str/strq)
      *
      * no idea what u1 and u2 these are, but it works with 0.0 and 1.0
      * stride is the distance between each point on the curve
      * order should always just fit the number of the points
      * points is just a pointer to the pointdata(array)*/
////********error here: says "pointer/array required"//////////////

                glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 6, &bezierArray[0][0]);
               

     glEnable(GL_MAP1_VERTEX_3);          /* enable the mode */

     glColor3f(1.0, 1.0, 1.0);          /* set color to white */

     glBegin(GL_LINE_STRIP);               /* start drawing */
          for(i = 0; i <= 60; i++)
          {
               /* start evaluating the points
                * void glEvalCoord1f(float u);
                * u is the current point we evaluate */
               glEvalCoord1f((float)i/60.0f);
          }
     glEnd();                    /* stop drawing */

     glPointSize(3.0);               /* set point size to 3px */
     glColor3f(1.0f, 1.0f, 0.0f);          /* set color to yellow */
     glBegin(GL_POINTS);               /* start drawing again */
          for(i = 0; i < 6; i++)
          {
               /* draw all control/end points */
////********error here: says "pointer/array required"//////////////
               glVertex3fv(&bezierArray[i][0]);
          }
     glEnd();

     glFlush();                    /* Flush all buffers */
     glutSwapBuffers();               /* Sawp buffers */
     return;
}

void reshape(int w, int h)
{
     glViewport(0, 0, (GLint) w, (GLint) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

     if ( h==0)
          gluPerspective(45, (GLdouble)w, 1.0, 100.0);
     else
          gluPerspective(45, (GLdouble)w/(GLdouble)h,1.0, 100.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

//test-trying to make the bezier curve move in y direction.

void idle_func (void)
{
for (beziernum=0 ;beziernum < 100; beziernum++) {
   //bezierArray[beziernum].ypos+=1;

   }
   glutPostRedisplay();
}

/*  Main Loop
 *  Open window with initial window size, title bar,
 *  RGBA display mode, and handle input events.
 */
int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
   glutInitWindowSize (800, 600);
   glutCreateWindow (argv[0]);
   glutReshapeFunc (reshape);
   glutDisplayFunc (DrawGLScene);
   glutIdleFunc (idle_func);
   glutMainLoop();
   return 0;
}
//end of code

0
Comment
Question by:eye30
3 Comments
 
LVL 3

Accepted Solution

by:
gkatz earned 250 total points
ID: 9828486
ok, i think you're a little confused with how classes and arrays work.
What you wrote was &bezierArray[i][0].  You think that you are referencing an array here.  You created beizerArray as an array of instances of a class called BezierClass.  Inside of that class is an array called beizerArray.
To actually access the array inside the instances of the class you would write something like:
beizerArray[x].beizerArray[i][0]

I think that you didn't mean to name your instances of your class the same as the array.  You could have written
BeizerClass beizer[100]; //this would create 100 instances of the class  
                                  // beizerClass

now there are 100 instances of the class, each instance of the class contains an array called beizerArray.


to access an element of one of these arrays you would type
beizer[classNumber].beizerArray[xElement][yElement];

The classNumber would refer to one of the 100 different instances of beizerClass and the xElement and yElement would refer to the individual element.

This would now work execpt for one reason.  You didn't make the array beizerArray global inside of your class.  What happens is that your constructor creates the array beizerArray, but since it's local to the constructor, once the constructor is done executing it deletes it.  You want to make your array public also. You would need to change your class to:

class BezierClass {

     public:
     float x1,y1;
     float x2,y2;
     float x_cp1,y_cp1;
     float x_cp2,y_cp2;
     float x_cp3,y_cp3;
     float x_cp4,y_cp4;
     float xpos,ypos;
     float bezierArray[6][3];
     BezierClass() {
          bezierArray[6][3] =
               { {x1, y1, 0.0},     /* 1st End Point */
                {x_cp1, y_cp1, 0.0},     /* 1st Control P. */
                {x_cp2, y_cp2, 0.0},     /* 2nd Control P. */
                {x_cp3, y_cp3, 0.0},     /* 3rd Control P. */
                {x_cp4, y_cp4, 0.0},     /* 3th Control P. */
                {x2, y2, 0.0} };          /* 2nd End Point */;

     }

};

Ok now we're starting to get somewhere.  The next problem is that

     float x1,y1;
     float x2,y2;
     float x_cp1,y_cp1;
     float x_cp2,y_cp2;
     float x_cp3,y_cp3;
     float x_cp4,y_cp4;
are never initialized before you use them inside of your constructor.  These would have to be initialized inside the constructor before you initialize beizerArray.  This could either be done at the begining of the function or in an initializer list.  For right now i'd just do it at the beginning of the constructor.

Ok to recap:
1 you need to call the arrays correctly. beizer[].beizerArray[][]
2. you need to make the array public inside of the class instead of a local variable inside of the constructor
3. you need to initialize the variables that are used to initialize beizerArray before initializing beizerArray.

I didn't take a look at the rest of your code but that should fix the errors that you're getting right now.  The code as a whole looks pretty good.  I think you just got a little confused with how classes work.  

Good luck
gkatz
0
 

Author Comment

by:eye30
ID: 9828696
Thanks for your reply.  Yeah, I after I posted that I named my instance the same as my array.  I've made the changes but still getting three errors.

Something seems to be wrong with the initialization of the constructor and the call to the array again.

Code:
-------------------------------------------------

#include <windows.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream.h>
#include <time.h>

//function prototypes

//Define bezier class for animation



class BezierClass {

      public:
      float x1,y1;
      float x2,y2;
      float x_cp1,y_cp1;
      float x_cp2,y_cp2;
      float x_cp3,y_cp3;
      float x_cp4,y_cp4;
      float xpos,ypos;
      float bezierArray[6][3];
      
      BezierClass() {
            float x1,y1;  
            float x2,y2;
            float x_cp1,y_cp1;
            float x_cp2,y_cp2;
            float x_cp3,y_cp3;
            float x_cp4,y_cp4;
            float xpos,ypos;
             bezierArray[6][3]=
                                                                                //****Error 1: Expression syntax error
                    {x1, y1, 0.0},      /* 1st End Point */
                  {x_cp1, y_cp1, 0.0},      /* 1st Control P. */
                  {x_cp2, y_cp2, 0.0},      /* 2nd Control P. */
                  {x_cp3, y_cp3, 0.0},      /* 3rd Control P. */
                  {x_cp4, y_cp4, 0.0},      /* 3th Control P. */
                  {x2, y2, 0.0};            /* 2nd End Point */

      }

};

/* Create an array of type bezierClass that may hold 100 beziers */
BezierClass bezier[100];
int beziernum=0;
int totalbezier=5;
float zoom = -7;

void InitGL(int Width, int Height)
{
      glClearDepth(1.0);
      glClearColor(0.0, 0.0, 0.0, 0.0);      /* bg color = black */
      glDepthFunc(GL_LESS);                  /* nearer appears nearer */
      glEnable(GL_DEPTH_TEST);            /* enable depth testing */
      glShadeModel(GL_SMOOTH);            /* shade colors smooth */
      glMatrixMode(GL_PROJECTION);            /* switch the matrix */
      glLoadIdentity();                  /* reset the cur. matrix */
      gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
      glMatrixMode(GL_MODELVIEW);            /* switch matrix back */
}

void DrawGLScene(void)
{
      int i;                              /* temp var */

      /* Clear the screen and the buffers */
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glLoadIdentity();                  /* reset cur. matrix */
      glTranslatef(0.0f, 0.0f, -10.0f);      /* move the cam */

      /* ok, this is the main point of our bezier curve
       * void glMap1f(GLenum target, float u1, float u2, int stride
       *          int order, const float *points);
       * target is one of these:
       * GL_MAP1_VERTEX_3      (Vertex Coordinates (xyz))
       * GL_MAP1_VERTEX_4      (Vertex Coordinates (xyzw))
       * GL_MAP1_INDEX      (Color Index)
       * GL_MAP1_COLOR_4      (Color Values (rgba))
       * GL_MAP1_NORMAL      (Normal Coordinates)
       * GL_MAP1_TEXTURE_COORD_1/2/3/4 (Texture Coordinates(s/st/str/strq)
       *
       * no idea what u1 and u2 these are, but it works with 0.0 and 1.0
       * stride is the distance between each point on the curve
       * order should always just fit the number of the points
       * points is just a pointer to the pointdata(array)*/
      glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 6, bezier[0].bezierArray[0][0]); **//Error #2: Function Call does not match.
      glEnable(GL_MAP1_VERTEX_3);            /* enable the mode */

      glColor3f(1.0, 1.0, 1.0);            /* set color to white */

      glBegin(GL_LINE_STRIP);                  /* start drawing */
            for(i = 0; i <= 60; i++)
            {
                  /* start evaluating the points
                   * void glEvalCoord1f(float u);
                   * u is the current point we evaluate */
                  glEvalCoord1f((float)i/60.0f);
            }
      glEnd();                        /* stop drawing */

      glPointSize(3.0);                  /* set point size to 3px */
      glColor3f(1.0f, 1.0f, 0.0f);            /* set color to yellow */
      glBegin(GL_POINTS);                  /* start drawing again */
            for(i = 0; i < 6; i++)
            {
                  /* draw all control/end points */
                  glVertex3fv(bezier[0].bezierArray[i][0]);    ////Error #3: Function Call does not match.
            }
      glEnd();

      glFlush();                        /* Flush all buffers */
      glutSwapBuffers();                  /* Sawp buffers */
      return;
}

void reshape(int w, int h)
{
      glViewport(0, 0, (GLint) w, (GLint) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

      if ( h==0)
            gluPerspective(45, (GLdouble)w, 1.0, 100.0);
      else
            gluPerspective(45, (GLdouble)w/(GLdouble)h,1.0, 100.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

void idle_func (void)
{
for (beziernum=0 ;beziernum < 100; beziernum++) {
   //bezierArray[beziernum].ypos+=1;

   }
   glutPostRedisplay();
}

/*  Main Loop
 *  Open window with initial window size, title bar,
 *  RGBA display mode, and handle input events.
 */
int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
   glutInitWindowSize (800, 600);
   glutCreateWindow (argv[0]);
   glutReshapeFunc (reshape);
   glutDisplayFunc (DrawGLScene);
   glutIdleFunc (idle_func);
   glutMainLoop();
   return 0;
}
0
 
LVL 9

Expert Comment

by:_ys_
ID: 9833505
As for error 1:
You had it right in a previous post.

AbezierArray[6][3]=
        { // *** missing opening and closing braces
                 {x1, y1, 0.0},     /* 1st End Point */
                {x_cp1, y_cp1, 0.0},     /* 1st Control P. */
                {x_cp2, y_cp2, 0.0},     /* 2nd Control P. */
                {x_cp3, y_cp3, 0.0},     /* 3rd Control P. */
                {x_cp4, y_cp4, 0.0},     /* 3th Control P. */
                {x2, y2, 0.0}
        };          /* 2nd End Point */

As for errors 2 & 3, if it's a pointer it wants, simply give it one:

& bezier[0].bezierArray[0][0] //*** take the address of it.

[I don't know the GL library at all, so I can't validate the above code against the function's signature/purpose]
0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In days of old, returning something by value from a function in C++ was necessarily avoided because it would, invariably, involve one or even two copies of the object being created and potentially costly calls to a copy-constructor and destructor. A…
What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

856 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question