¿ Necesita explicación ? :)
// 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);
}
Éste código fue enviado por Drácula el 22 de noviembre del 2002 dracular@ono.com
Si quieres enviar tu propio código hazlo a eth_cotd@lycos.es
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
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".
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 ..
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
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.
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... :)