# Vec Class Reference

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

List of all members.

## Public Attributes
float | x
float | y
float | z
## 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
| operator float * ()
## Algebraic computations
Vec & | operator+= (const Vec &a)
Vec & | operator-= (const Vec &a)
Vec & | operator*= (float k)
Vec & | operator/= (float k)
Vec | orthogonalVec () const
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 | operator^ (const Vec &a, const Vec &b)
Vec | cross (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 &)

## 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();

### 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.

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

operator float * | ( |  | ) |

Non const conversion operator returning the memory address of the vector.

Useful to pass a Vec to a method that requires and fills a `float*`, as provided by certain libraries.

Vec& operator*= | ( | float | k | ) |

Multiply the vector by a scalar `k`.

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].

Vec orthogonalVec | ( |  | ) | const

Returns a Vec orthogonal to the Vec. Its norm() depends on the Vec, but is zero only for a null Vec. Note that the function that associates an orthogonalVec() to a Vec is not continous.

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. May be faster 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 !

bool operator!= | ( | const Vec & | a,
|  | const Vec & | b |
| ) |  |  | `[friend]`

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

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 a scalar with the vector.

Vec operator* | ( | const Vec & | a,
|  | float | k |
| ) |  |  | `[friend]`

Returns the product of the vector with a scalar.

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 than 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

float z