Foros - Stratos

Programadores => Código de la Semana => Mensaje iniciado por: ethernet en 24 de Noviembre de 2002, 05:01:26 PM

Título: Clase vector para DirectX - Drácula
Publicado por: ethernet en 24 de Noviembre de 2002, 05:01:26 PM




// vector.h



#ifndef CXVECTOR

#define CXVECTOR



class CXMatriz;



class CXVector:public D3DXVECTOR3 {

public:

CXVector() {};

CXVector(float xyz) { x=xyz;y=xyz;z=xyz; };

CXVector(const CXVector &origen);

CXVector(float x,float y,float z);

CXVector &Normalizar();

CXVector NormalizarNuevo();

float ProductoEscalar(const CXVector &v);

CXVector ProductoVectorial(const CXVector &v1);

float Magnitud();

void ResetAlMaximo(); // Asigna un nº máximo

CXVector &operator /(float escalar);

CXVector &operator *=(const CXMatriz &m);

friend CXVector operator *(const CXVector &v,const CXMatriz &m);

friend CXVector operator -(CXVector &a,CXVector &b);

friend CXVector operator -(CXVector &a);

friend CXVector operator +(CXVector &a,CXVector &b);

friend CXVector operator *(CXVector &a,float escalar);

friend CXVector operator *(float escalar,CXVector &a);

};



#endif



// vector.cpp

#include "haddd.h"



CXVector::CXVector(float vx,float vy,float vz)

{

x=vx;

y=vy;

z=vz;

}



CXVector::CXVector(const CXVector &v)

{

x=v.x;

y=v.y;

z=v.z;

}



void CXVector::ResetAlMaximo()

{

x=FLT_MAX;

y=FLT_MAX;

z=FLT_MAX;

}

float CXVector::Magnitud()

{

return D3DXVec3Length(this);

}



CXVector &CXVector::Normalizar()

{

D3DXVec3Normalize(this,this);



return *this;

}



CXVector CXVector::NormalizarNuevo()

{ CXVector t;



D3DXVec3Normalize(&t,this);



return t;

}



CXVector CXVector::ProductoVectorial(const CXVector &v1)

{ CXVector t;



D3DXVec3Cross(&t,this,&v1);



return t;

}



float CXVector::ProductoEscalar(const CXVector &v)

{

return D3DXVec3Dot(this,&v);



}



CXVector &CXVector::operator /(float escalar)

{

x/=escalar;

y/=escalar;

z/=escalar;



return *this;

}



CXVector &CXVector ::operator *=(const CXMatriz &m)

{

D3DXVECTOR4 v4;

D3DXVec3Transform(&v4,(D3DXVECTOR3 *)&x,(D3DXMATRIX *)m.m);

x=v4.x;

y=v4.y;

z=v4.z;

return *this;

}





// Funciones amigas



CXVector operator *(CXVector &a,float escalar)

{

CXVector t(a);

t.x*=escalar;

t.y*=escalar;

t.z*=escalar;



return t;

}



CXVector operator *(float escalar,CXVector &a)

{

CXVector t(a);

t.x*=escalar;

t.y*=escalar;

t.z*=escalar;



return t;

}



CXVector operator +(CXVector &a,CXVector &b)

{

CXVector t(a);

t.x+=b.x;

t.y+=b.y;

t.z+=b.z;



return t;

}



CXVector operator -(CXVector &a,CXVector &b)

{

CXVector t(a);

t.x-=b.x;

t.y-=b.y;

t.z-=b.z;



return t;

}



CXVector operator -(CXVector &a)

{

CXVector t;

t.x=-a.x;

t.y=-a.y;

t.z=-a.z;



return t;

}



CXVector operator *(const CXVector &v,const CXMatriz &m)

{

D3DXVECTOR4 v4;

D3DXVec3Transform(&v4,(D3DXVECTOR3 *)&v.x,(D3DXMATRIX *)m.m);

return CXVector(v4.x,v4.y,v4.z);

}









Título: Clase vector para DirectX - Drácula
Publicado por: Haddd en 24 de Noviembre de 2002, 06:52:02 PM
                                La próxima vez enviaré el código de mi motor completo.¡¡Jajajajaj!!

No, en serio, a ver si os animais a mandar cosas, que si no no llegaremos a tener tanta trascendencia como Flipcode                                
Título: Clase vector para DirectX - Drácula
Publicado por: Zaelsius en 25 de Noviembre de 2002, 09:42:12 AM
No le veo mucho utilidad(sentido) a crear una clase que encapsule D3DXVECTOR(alguna ventaja?).

Aunque claro, si la gente no envia otros fuentes, pues habrá que publicar lo que haya. A ver si la people se anima!

Como mejora: incluye una función "DimensionAlCuadrado", que se utiliza mucho y es más rápìda que multiplicar dos veces "dimension".
Título: Clase vector para DirectX - Drácula
Publicado por: CoLSoN2 en 25 de Noviembre de 2002, 02:38:29 PM
                                lo que dice ZealSiuS, teniendo D3DXVECTOR3. .. y lo de DimensionAlCuadrado, si mi variable vector se llama v. Veo más rapido hacer v*v que no v.DimensionAlCuadrado ..                                
Título: Clases matematicas
Publicado por: barkley en 27 de Noviembre de 2002, 01:40:08 PM
                                A mí no me parece mal que se manden clases como esta. Todo el mundo hemos creado una o más (en mi caso, creo que ya van 4 ó 5 iguales...). Pero, quizá, la clase vector sea la más simple de hacer de estas. Sin embargo, creo que sería útil mandar una serie de clases matemáticas (vector, matriz, quaternions...) que pudiesen interactuar entre sí y que sean muy utilizadas, como las que he nombrado antes. Si os parece bien, puedo mandar unas que yo he desarrollado (los quaternions no los tengo todavía), puede que no sean de gran utilidad para la mayoría, pero si las vamos corrigiendo y acelerando entre todos puede que al final sí sean de utilidad (20 ojos ven más que 2).
Saludos,

Barkley                                
Título: Clase vector para DirectX - Drácula
Publicado por: ethernet en 27 de Noviembre de 2002, 07:11:04 PM
Creo q las clases perfectas para vector matrix etc en c++ estan en el cotd de flipcode. Eso si, no se si los q usan DX os podreis permitir usar una clase vector q no sea la q trae DX o derivada.. xDDDD.
Título: Clase vector para DirectX - Drácula
Publicado por: CordayUK en 09 de Enero de 2003, 06:51:37 PM
                                estoy de acuerdo con ethernet, pero no etiendo porque hay que basar la clase en D3DXVECTOR4

en el caso de que por huevos tengas que usar D3DXVECTOR4, porque no hacer un define que convierta tu objeto vector a este?

o porque no hacer una union?





union

{

  spR32 _value [4][4];

  struct

     {

        spR32     _11,_12,_13,_14,

                      _21,_22,_23,_24,

                      _31,_32,_33,_34,

                      _41,_42,_43,_44;

      };

      D3DMATRIX _DX;

};





esto es lo que utilizo yo porque el cabron de DX requiere un D3DXMATRIX para SetTransform etc...  :)