He estado haciendo muchas cosas de vectores y escribí mi propia plantilla para eso.C++ Vector Math y OpenGL compatible
Mis requisitos son un montón de matemáticas vectoriales (suma, resta, escala, cruce prod y punto prod) también tengo que ser capaz de pasar mi vector como un flotador [] para que openGL pueda hacer uso de él.
He estado usando esto muy felizmente por algún tiempo, hoy un conferencista lo vio y gimió. Había dos cosas que odiaba particularmente (una de las cuales entiendo), mi uso de la herencia porque no parecía seguir un estilo is a
. Y mi casting (T*)this
, por supuesto que no tenía mucho en el camino de una solución.
Primero: La herencia, tengo que ser capaz de hacer uso de vec2 a modo de vec4 he diseñado mis vectores de este tipo.
template<typename T>
Vector2D
{
public:
getX(), getY(), setX(), setY() ....
};
template<typename T>
Vector3D : public Vector2D<T>
{
public:
getZ(), setZ() ...
}
template<typename T>
Vector4D : public Vector3D<T>
{
public:
getW(), setW() ...
}
¿Por qué es esto malo? y tbh no puedo ver cómo mejorarlo. Necesito (quiero) poder definir el tipo y tener getters y setters de algún tipo. Si reacomodé ella como
template<typename T, int _size>
VectorT
me gustaría perder mi .getX()
, .setX()
cosas y tenga que reemplazarlo con algo como .at()
o []
. tbh Prefiero la legibilidad de .getX()
, aunque haría más fáciles las definiciones del operador.
Segundo: Puedo ver por qué esto es malo, pero para que sea por lo que puede pasar estos vectores en el método de OpenGL que esperan una red de flotadores que he sobrecargado el operador splat
// Defined in Vector2D<T>
operator*() { return (T*)this; }
Como Lo entiendo, no hay garantía de que el compilador ponga las variables miembro x, y, z, w al comienzo de la clase, y si no tiene cuidado, podría terminar pasando la tabla v en su lugar. Sin embargo, debo admitir que hasta ahora no he tenido problemas.
La única forma que puedo ver a este respecto es mantener una matriz que se devuelva. Lo cual supongo que sería más fácil si los cambiara de la misma forma en que trato con los vectores en primer lugar.
mensaje más código. ¿Dónde se define 'operator *'? ¿Dónde están los métodos getX() y setX()? –