#### Archived

This topic is now archived and is closed to further replies.

# Vectors math programming...

This topic is 5999 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Hello I am building a simple vector math class to support basic vector operations, currently I only use a simple 3 floats to represent each vector''s component, but I have seen some implementations wich use unions, and structs for that, so I really appreciate if anyone explainme why use unions for that, and how implement a really optimized vector and matrices class? Thanks in advance!

##### Share on other sites
There''s no single way to do what you want: it depends a lot on your choice of language, target platform/processor and tools/compiler. But there are some general points which may be of use.

First I would recoomend structs over unions: you don''t need unions to implement vectors and I think you''re more likely to trip up with them.

The advantages of structures [for vectors] are:
Simpler code: e.g. only one line to add two vectors, not three.
Easier to work with and debug: because it''s easier to tell what you are dealing with. Without structs you use the same types for vectors and scalars and it can be difficult to tell them apart.
Quicker code: this depends on how they are implemented, but often you can take advantage of processor features such as a vector/SIMD unit to accelerate vector operations.

##### Share on other sites
unions are quite useful in a vector implementation, especially if you''re using opengl which lets you specify your arguments as an array. As a quick example, here''s some code:

  class Vector{public: union { struct { float x, y, z; }; float v[3]; } // blah, blah, blah....};

This way, you can access the members of the vector with either:

  Vector v = {0,0,1}; v.x = ...; v.v[0] = ...; glVertex3fv( v.v ); glVertex3f( v.x, v.y, v.z ); ...

It''s really just a convenience thing though. There''s no real need for it. Also, you can define an operator like this:

  float *Vector::operator float *(){ return v;}
;

That way, you can do stuff like this:

  Vector v = {0,0,1}; glVertex3fv( v );

Pretty nifty, eh?

War Worlds - A 3D Real-Time Strategy game in development.