Vec Class Reference

The Vec class represents 3D positions and 3D vectors. More...

List of all members.

Setting the value

 Vec ()
 Vec (float X, float Y, float Z)
template<class C>
 Vec (const C &c)
Vec & operator= (const Vec &v)
void setValue (float X, float Y, float Z)

Accessing the value

float operator[] (int i) const
float & operator[] (int i)
 operator const float * () const

Algebraic computations

Vec & operator+= (const Vec &a)
Vec & operator-= (const Vec &a)
Vec & operator *= (float k)
Vec & operator/= (float k)
Vec operator+ (const Vec &a, const Vec &b)
Vec operator- (const Vec &a, const Vec &b)
Vec operator- (const Vec &a)
Vec operator * (const Vec &a, float k)
Vec operator * (float k, const Vec &a)
Vec operator/ (const Vec &a, float k)
bool operator!= (const Vec &a, const Vec &b)
bool operator== (const Vec &a, const Vec &b)
float operator * (const Vec &a, const Vec &b)
Vec cross (const Vec &a, const Vec &b)
Vec operator^ (const Vec &a, const Vec &b)

Norm of the vector

float squaredNorm () const
float norm () const
float normalize ()
Vec unit () const

Projection

void projectOnAxis (const Vec &direction)
void projectOnPlane (const Vec &normal)

XML representation

 Vec (const QDomElement &element)
QDomElement domElement (const QString &name, QDomDocument &document) const
void initFromDOMElement (const QDomElement &element)

Output stream

std::ostream & operator<< (std::ostream &o, const qglviewer::Vec &)

Public Attributes

float x
float y
float z


Detailed Description

The Vec class represents 3D positions and 3D vectors.

Vec is used as a parameter and return type by many methods of the library. It provides classical algebraic computational methods and is compatible with OpenGL:

  // Draws a point located at 3.0 OpenGL units in front of the camera
  Vec pos = camera()->position() + 3.0 * camera()->viewDirection();
  glBegin(GL_POINTS);
  glVertex3fv(pos);
  glEnd();

This makes of Vec a good candidate for representing positions and vectors in your programs. Since it is part of the qglviewer namespace, specify qglviewer::Vec or use the qglviewer namespace:

  using namespace qglviewer;

Interface with other vector classes

Vec implements a universal explicit converter, based on the [] operator. Everywhere a const Vec& argument is expected, you can use your own vector type instead, as long as it implements this operator (see the Vec(const C& c) documentation).

See also the Quaternion and the Frame documentations.


Constructor & Destructor Documentation

Vec  ) 
 

Default constructor. Value is set to (0,0,0).

Vec float  X,
float  Y,
float  Z
 

Standard constructor with the x, y and z values.

Vec const C &  c  )  [explicit]
 

Universal explicit converter from any class to Vec. You can use your own vector class everywhere a const Vec& parameter is required, as long as it implements the operator[ ]:

  class MyVec
  {
    // ...
    float operator[](int i) const { returns x, y or z when i=0, 1 or 2; }
  }

  MyVec v(...);
  camera()->setPosition(v);

Note that standard vector types (stl, float[3], ...) implement this operator and can hence be used in place of Vec. See also operator const float*() .

Vec const QDomElement &  element  )  [explicit]
 

Constructs a Vec from a QDomElement representing an XML code of the form <anyTagName x=".." y=".." z=".." />.

If one of these attributes is missing or is not a number, a warning is displayed and the associated value is set to 0.0.

See also domElement() and initFromDOMElement().


Member Function Documentation

QDomElement domElement const QString &  name,
QDomDocument &  document
const
 

Returns an XML QDomElement that represents the Vec.

name is the name of the QDomElement tag. doc is the QDomDocument factory used to create QDomElement.

When output to a file, the resulting QDomElement will look like:

 <name x=".." y=".." z=".." />

Use initFromDOMElement() to restore the Vec state from the resulting QDomElement. See also the Vec(const QDomElement&) constructor.

Here is complete example that creates a QDomDocument and saves it into a file:

 Vec sunPos;
 QDomDocument document("myDocument");
 QDomElement sunElement = document.createElement("Sun");
 document.appendChild(sunElement);
 sunElement.setAttribute("brightness", sunBrightness());
 sunElement.appendChild(sunPos.domElement("sunPosition", document));
 // Other additions to the document hierarchy...

 // Save doc document
 QFile f("myFile.xml");
 if (f.open(IO_WriteOnly))
 {
   QTextStream out(&f);
   document.save(out, 2);
   f.close();
 }

See also Quaternion::domElement(), Frame::domElement(), Camera::domElement()...

void initFromDOMElement const QDomElement &  element  ) 
 

Restores the Vec state from a QDomElement created by domElement().

The QDomElement should contain x, y and z attributes. If one of these attributes is missing or is not a number, a warning is displayed and the associated value is set to 0.0.

To restore the Vec state from an xml file, use:

 // Load DOM from file
 QDomDocument doc;
 QFile f("myFile.xml");
 if (f.open(IO_ReadOnly))
 {
   doc.setContent(&f);
   f.close();
 }
 // Parse the DOM tree and initialize
 QDomElement main=doc.documentElement();
 myVec.initFromDOMElement(main);

See also the Vec(const QDomElement&) constructor.

float norm  )  const
 

Returns the norm of the vector.

float normalize  ) 
 

Normalizes the Vec and returns its original norm.

Normalizing a null vector will result in NaN values.

Vec& operator *= float  k  ) 
 

Multiply the vector by a scalar k.

operator const float *  )  const
 

Conversion operator returning the memory address of the vector.

Very convenient to pass a Vec pointer as a parameter to OpenGL functions:

  Vec pos, normal;
  glNormal3fv(normal);
  glVertex3fv(pos);

Vec& operator+= const Vec &  a  ) 
 

Adds a to the vector.

Vec& operator-= const Vec &  a  ) 
 

Subtracts a to the vector.

Vec& operator/= float  k  ) 
 

Divides the vector by a scalar k.

An absolute k value lower than 1E-10 will print a warning if the library was compiled with the "debug" Qt CONFIG flag. Otherwise, no test is performed for efficiency reasons.

std::ostream& operator<< std::ostream &  o,
const qglviewer::Vec & 
 

Output stream operator. Enables debugging code like:

  Vec pos(...);
  cout << "Position=" << pos << endl;

Vec& operator= const Vec &  v  ) 
 

Equal operator.

float& operator[] int  i  ) 
 

Bracket operator returning an l-value. i must range in [0..2].

float operator[] int  i  )  const
 

Bracket operator, with a constant return value. i must range in [0..2].

void projectOnAxis const Vec &  direction  ) 
 

Projects the Vec on the axis of direction direction that passes through the origin.

direction does not need to be normalized (but must be non null).

void projectOnPlane const Vec &  normal  ) 
 

Projects the Vec on the plane whose normal is normal that passes through the origin.

normal does not need to be normalized (but must be non null).

void setValue float  X,
float  Y,
float  Z
 

Set the current value. Better than using operator=() with a temporary Vec(x,y,z).

float squaredNorm  )  const
 

Returns the squared norm of the Vec.

Vec unit  )  const
 

Returns a unitary (normalized) representation of the vector. The original Vec is not modified.


Friends And Related Function Documentation

Vec cross const Vec &  a,
const Vec &  b
[friend]
 

Cross product of the two Vec. Mind the order !

float operator * const Vec &  a,
const Vec &  b
[friend]
 

Dot product of the two Vec.

Vec operator * float  k,
const Vec &  a
[friend]
 

Returns the product of the vector with a scalar.

Vec operator * const Vec &  a,
float  k
[friend]
 

Returns the product of the vector with a scalar.

bool operator!= const Vec &  a,
const Vec &  b
[friend]
 

Returns true only when the two vector are not equal (see operator==()).

Vec operator+ const Vec &  a,
const Vec &  b
[friend]
 

Returns the sum of the two vectors.

Vec operator- const Vec &  a  )  [friend]
 

Unary minus operator.

Vec operator- const Vec &  a,
const Vec &  b
[friend]
 

Returns the difference of the two vectors.

Vec operator/ const Vec &  a,
float  k
[friend]
 

Returns the division of the vector with a scalar.

Too small k values are not tested (unless the library was compiled with the "debug" Qt CONFIG flag) and may result in NaN values.

bool operator== const Vec &  a,
const Vec &  b
[friend]
 

Returns true when the squaredNorm() of the difference vector is lower then 1E-10.

Vec operator^ const Vec &  a,
const Vec &  b
[friend]
 

Cross product of the two vectors. Same as cross().


Member Data Documentation

float x
 

The internal data representation is public. One can use v.x, v.y, v.z. See also operator[]().

float y
 

The internal data representation is public. One can use v.x, v.y, v.z. See also operator[]().

float z
 

The internal data representation is public. One can use v.x, v.y, v.z. See also operator[]().


Generated on Thu Jul 7 11:49:21 2005 for libQGLViewer by  doxygen 1.4.3