[comp.lang.c++] Request for help with graphics functions

steve@hite386.UUCP (Steve Hite) (02/13/90)

     I am trying to put together some 2-D graphics routines in C++ and am
having a few problems.  I got the matrix multiplication routines to work
(thanks to examples in Bruce Eckel and Tony Hansen's books!) but am having
trouble with the specifications for scaling, rotating and translating a
figure. I would like to be able to define a figure with a point array and 
an edge array, and perform the aforementioned functions on the figure.  
Here's the type of usage I had in mind:
   
   double p_values[] = {  ...values for point array (matrix)... };
   double e_values[] = {  ...values for edge array (matrix)... };

   matrix *p_matrix = new matrix(3, 3, p_values); 
   matrix *e_matrix = new matrix(3, 2, e_values);  

   figure fig(p_matrix, e_matrix);

   fig.rotate(45.0);
   fig.translate(25.0, 55.0);
   fig.scale(0.5, 2.0);
   fig.draw();


     Here's a portion of the code that I'm using.  I hope that I've included 
enough to make my intentions clear.  I made draw, rotate, translate, and
scale virtual because I'm going to have circles, squares, curves, etc. which
will require the same functions but perform the operations in a different 
way (I know you know that :-)).

     I am using Zortech C++ v2.06 and get the following error message re-
lating to the last function in this sample portion (listed at the end
of this article) :

matrix& figure::rotate(double value)
     ^
"shape.cpp", line 194 Syntax error: not found or ambiguous reference to 
function 'shape'

    Is it incorrect of me to try and return a reference type to matrix
when I am defining a member function in the class figure?  Is the line:

             return (*points * *transform); 

incorrect?

I am new to OOP in C++ and appreciate all the help I can get.
      
-------------------------- begin C++ source example ------------------------

class matrix {
private:

  struct _mat {
    double **m;   // pointer to matrix
    int r;     // matrix row
    int c;     // matrix column
    int ref;   // reference count
  } *mat;

public:
  // Constructors
  matrix(int rows = 3, int cols = 3, double value = 0.0);
  matrix(int rows, int cols, double *values);
  matrix(matrix& m);   // copy constructor

  // Operators
  friend matrix& operator*(matrix& m1, matrix& m2);
  matrix& operator=(matrix& m);

  // Destructor
 ~matrix();

  // Miscellaneous
  nrows()  { return mat->r; }        // return number of rows in matrix
  ncols()  { return mat->c; }        // return number of columns in matrix
  double& val(int i, int j);         // return reference to an element in 
                                     //  the matrix
};


class shape {
public:
  shape();
  virtual void draw() = 0;
  virtual matrix& scale(double, double) = 0;
  virtual matrix& translate(double, double) = 0;
  virtual matrix& rotate(double) = 0;
};


class figure : public shape {
  matrix *points;      // point matrix
  matrix *edges;       // edge matrix
public:
  figure(matrix *p, matrix *e);
  void draw();
  int enclosed(point *pt);
  matrix& scale(double, double);
  matrix& translate(double, double);
  matrix& rotate(double);
};


figure::figure(matrix *p, matrix *e)
{
  points = p;
  edges = e;
}


matrix& figure::rotate(double value)
{
  matrix *transform;
  
  transform = new matrix(3, 3, 0.0);
  
  transform->val(0, 0) = cos(value);
  transform->val(0, 1) = sin(value);
  transform->val(1, 0) = -sin(value);
  transform->val(1, 1) = cos(value);
  transform->val(2, 2) = 1;
  
  return (*points * *transform);
}  

---------------------------- end C++ source example ------------------------

--------------------------------------
Steve Hite
...gatech!uflorida!unf7!hite386!steve