SOFA API  b3f2f2a4
Open source framework for multi-physics simuation
qglviewer::Vec Class Reference

#include <QGLViewer/vec.h>

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

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();
Vec()
Default constructor.
Definition: vec.h:90

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
Definition: camera.h:30

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.

Public Attributes

union {
   struct {
      qreal   x
 
      qreal   y
 
      qreal   z
 
   } 
 
   qreal   v_ [3]
 
}; 
 The internal data representation is public. More...
 

Setting the value

 Vec ()
 Default constructor. More...
 
 Vec (qreal X, qreal Y, qreal Z)
 Standard constructor with the x, y and z values. More...
 
template<class C >
 Vec (const C &c)
 Universal explicit converter from any class to Vec. More...
 
Vecoperator= (const Vec &v)
 Equal operator. More...
 
void setValue (qreal X, qreal Y, qreal Z)
 Set the current value. More...
 

Accessing the value

qreal operator[] (int i) const
 Bracket operator, with a constant return value. More...
 
qreal & operator[] (int i)
 Bracket operator returning an l-value. More...
 
const qreal * address () const
 This method is deprecated since version 2.0. More...
 
 operator const qreal * () const
 Conversion operator returning the memory address of the vector. More...
 
 operator qreal * ()
 Non const conversion operator returning the memory address of the vector. More...
 
 operator const float * () const
 Conversion operator returning the memory address of the vector. More...
 

Algebraic computations

Vecoperator+= (const Vec &a)
 Adds a to the vector. More...
 
Vecoperator-= (const Vec &a)
 Subtracts a to the vector. More...
 
Vecoperator*= (qreal k)
 Multiply the vector by a scalar k. More...
 
Vecoperator/= (qreal k)
 Divides the vector by a scalar k. More...
 
Vec orthogonalVec () const
 Returns a Vec orthogonal to the Vec. More...
 
Vec operator+ (const Vec &a, const Vec &b)
 Returns the sum of the two vectors. More...
 
Vec operator- (const Vec &a, const Vec &b)
 Returns the difference of the two vectors. More...
 
Vec operator- (const Vec &a)
 Unary minus operator. More...
 
Vec operator* (const Vec &a, qreal k)
 Returns the product of the vector with a scalar. More...
 
Vec operator* (qreal k, const Vec &a)
 Returns the product of a scalar with the vector. More...
 
Vec operator/ (const Vec &a, qreal k)
 Returns the division of the vector with a scalar. More...
 
bool operator!= (const Vec &a, const Vec &b)
 Returns true only when the two vector are not equal (see operator==()). More...
 
bool operator== (const Vec &a, const Vec &b)
 Returns true when the squaredNorm() of the difference vector is lower than 1E-10. More...
 
qreal operator* (const Vec &a, const Vec &b)
 Dot product of the two Vec. More...
 
Vec operator^ (const Vec &a, const Vec &b)
 Cross product of the two vectors. More...
 
Vec cross (const Vec &a, const Vec &b)
 Cross product of the two Vec. More...
 

Norm of the vector

qreal sqNorm () const
 This method is deprecated since version 2.0. More...
 
qreal squaredNorm () const
 Returns the squared norm of the Vec. More...
 
qreal norm () const
 Returns the norm of the vector. More...
 
qreal normalize ()
 Normalizes the Vec and returns its original norm. More...
 
Vec unit () const
 Returns a unitary (normalized) representation of the vector. More...
 

Projection

void projectOnAxis (const Vec &direction)
 Projects the Vec on the axis of direction direction that passes through the origin. More...
 
void projectOnPlane (const Vec &normal)
 Projects the Vec on the plane whose normal is normal that passes through the origin. More...
 

XML representation

 Vec (const QDomElement &element)
 Constructs a Vec from a QDomElement representing an XML code of the form. More...
 
QDomElement domElement (const QString &name, QDomDocument &document) const
 Returns an XML QDomElement that represents the Vec. More...
 
void initFromDOMElement (const QDomElement &element)
 Restores the Vec state from a QDomElement created by domElement(). More...
 

Attribute details

◆ 

union { ... }

The internal data representation is public.

One can use v.x, v.y, v.z. See also operator[]().

◆ v_

qreal qglviewer::Vec::v_[3]

◆ x

qreal qglviewer::Vec::x

◆ y

qreal qglviewer::Vec::y

◆ z

qreal qglviewer::Vec::z

Constructor details

◆ Vec() [1/4]

qglviewer::Vec::Vec ( )
inline

Default constructor.

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

◆ Vec() [2/4]

qglviewer::Vec::Vec ( qreal  X,
qreal  Y,
qreal  Z 
)
inline

Standard constructor with the x, y and z values.

◆ Vec() [3/4]

template<class C >
qglviewer::Vec::Vec ( const C &  c)
inlineexplicit

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
{
// ...
qreal operator[](int i) const { returns x, y or z when i=0, 1 or 2; }
}
MyVec v(...);
camera()->setPosition(v);
qreal operator[](int i) const
Bracket operator, with a constant return value.
Definition: vec.h:148
qreal y
Definition: vec.h:81
qreal x
Definition: vec.h:81
qreal z
Definition: vec.h:81

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

◆ Vec() [4/4]

Vec::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().

Function details

◆ address()

const qreal* qglviewer::Vec::address ( ) const
inline

This method is deprecated since version 2.0.

Use operator const qreal* instead.

◆ domElement()

QDomElement Vec::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();
}
SReal SReal * f
Definition: LCPcalc.h:102

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

◆ initFromDOMElement()

void Vec::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.

◆ norm()

qreal qglviewer::Vec::norm ( ) const
inline

Returns the norm of the vector.

◆ normalize()

qreal qglviewer::Vec::normalize ( )
inline

Normalizes the Vec and returns its original norm.

Normalizing a null vector will result in NaN values.

◆ operator const float *()

qglviewer::Vec::operator const float * ( ) const
inline

Conversion operator returning the memory address of the vector.

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

Vec pos, normal; glNormal3fv(normal); glVertex3fv(pos);
Note
The returned float array is a static shared by all Vec instances.

◆ operator const qreal *()

qglviewer::Vec::operator const qreal * ( ) const
inline

Conversion operator returning the memory address of the vector.

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

Vec pos, normal; glNormal3dv(normal); glVertex3dv(pos);

◆ operator qreal *()

qglviewer::Vec::operator qreal * ( )
inline

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

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

◆ operator*=()

Vec& qglviewer::Vec::operator*= ( qreal  k)
inline

Multiply the vector by a scalar k.

◆ operator+=()

Vec& qglviewer::Vec::operator+= ( const Vec a)
inline

Adds a to the vector.

◆ operator-=()

Vec& qglviewer::Vec::operator-= ( const Vec a)
inline

Subtracts a to the vector.

◆ operator/=()

Vec& qglviewer::Vec::operator/= ( qreal  k)
inline

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.

◆ operator=()

Vec& qglviewer::Vec::operator= ( const Vec v)
inline

Equal operator.

◆ operator[]() [1/2]

qreal& qglviewer::Vec::operator[] ( int  i)
inline

Bracket operator returning an l-value.

i must range in [0..2].

◆ operator[]() [2/2]

qreal qglviewer::Vec::operator[] ( int  i) const
inline

Bracket operator, with a constant return value.

i must range in [0..2].

◆ orthogonalVec()

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

◆ projectOnAxis()

void Vec::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).

◆ projectOnPlane()

void Vec::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).

◆ setValue()

void qglviewer::Vec::setValue ( qreal  X,
qreal  Y,
qreal  Z 
)
inline

Set the current value.

May be faster than using operator=() with a temporary Vec(x,y,z).

◆ sqNorm()

qreal qglviewer::Vec::sqNorm ( ) const
inline

This method is deprecated since version 2.0.

Use squaredNorm() instead.

◆ squaredNorm()

qreal qglviewer::Vec::squaredNorm ( ) const
inline

Returns the squared norm of the Vec.

◆ unit()

Vec qglviewer::Vec::unit ( ) const
inline

Returns a unitary (normalized) representation of the vector.

The original Vec is not modified.

Related details

◆ cross

Vec cross ( const Vec a,
const Vec b 
)
friend

Cross product of the two Vec.

Mind the order !

◆ operator!=

bool operator!= ( const Vec a,
const Vec b 
)
friend

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

◆ operator* [1/3]

qreal operator* ( const Vec a,
const Vec b 
)
friend

Dot product of the two Vec.

◆ operator* [2/3]

Vec operator* ( const Vec a,
qreal  k 
)
friend

Returns the product of the vector with a scalar.

◆ operator* [3/3]

Vec operator* ( qreal  k,
const Vec a 
)
friend

Returns the product of a scalar with the vector.

◆ operator+

Vec operator+ ( const Vec a,
const Vec b 
)
friend

Returns the sum of the two vectors.

◆ operator- [1/2]

Vec operator- ( const Vec a)
friend

Unary minus operator.

◆ operator- [2/2]

Vec operator- ( const Vec a,
const Vec b 
)
friend

Returns the difference of the two vectors.

◆ operator/

Vec operator/ ( const Vec a,
qreal  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.

◆ operator==

bool operator== ( const Vec a,
const Vec b 
)
friend

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

◆ operator^

Vec operator^ ( const Vec a,
const Vec b 
)
friend

Cross product of the two vectors.

Same as cross().