Low dimensional matrices, vectors, quaternions and a cubic equation

#ponce spam at spam.spam
Mon Apr 19 03:18:36 PDT 2010


Gareth Charnock Wrote:

> Andrei Alexandrescu wrote:
> > On 04/16/2010 04:25 PM, Gareth Charnock wrote:
> >> Okay, here goes. I've collected together the basic functionality that
> >> would probably make a good starting point. As I've mentioned my code is
> >> very messy and has bits missing (e.g. I never had a use for the cross
> >> product but it's pretty important in general). I guess a good way to
> >> begin would be to write the pubic interfaces then start on the
> >> implementation.
> >>
> >> Cubic Solvers:
> >> General complex cubic solver with two algorithms (one requiring a
> >> complex cosine and and arcosine one using only +-*/ and roots). A
> >> special case cubic solver for the reduced cubic x^^3 + px - q = 0.
> > 
> > This sounds a candidate for std.numeric. How popular/needed are cubic 
> > solvers?
> 
> They're probably don't come up that frequently but they do they're 
> rather fiddly. Lots of operations to get right. But the solution doesn't 
> depend on anything but basic math operators so once it's written, it's 
> written. I guess the question is whether Phobos is meant to be a small 
> library or a kitchen sink library.
> 
> >> Quaternions:
> >> opAdd, opSub, opMult(quaternion), opMult(vector), opDiv, Normalise,
> >> Normalized, conjugate, conjugated, toEulerAngles*, fromEulerAngles,
> >> this(real,i,j,k), this(angle,axis), getAngle(), getAxis()
> > 
> > Sounds good, but you'd need to convert the code to the new overloaded 
> > operators approach.
> 
> Fair enough, and this will be a good opportunity to show off why the new 
> overloading scheme is more powerful (e.g. opAdd and opSub can be combined).
> 
> >> *Currently I've only got a quaternion->euler angles routine that works
> >> in the ZYZ convention but I have read a paper that generalises my method
> >> to all valid axis conventions. Will probably impliment as something like:
> >> toEulerAngles(string convention="XYZ")()
> >>
> >> Vectors:
> >> opAdd, opSub, opMult(scalar), opMult(vector)*, cross**, Normalise,
> >> Normalized, Length
> > 
> > What is the representation of vectors? I'm afraid the design above would 
> > be too limited for what we need.
> A fixed sized array where V[0] ~ x, V[1] ~ y and V[2] ~ z. The field the 
> vector is defined over is templated.
> 
> What other operators are needed? I'd defiantly want to add swizzling. 
> http://www.ogre3d.org/docs/api/html/classOgre_1_1Vector3.html looks like 
> it could be a good source of ideas.
> 
> >> * dot product. Would this be better named as dot()?
> 
> > We already have dot product and normalization routines that work with 
> > general ranges.
> > 
> > http://www.digitalmars.com/d/2.0/phobos/std_numeric.html#dotProduct
> > http://www.digitalmars.com/d/2.0/phobos/std_numeric.html#normalize
> > 
> > Generally I'd strongly suggest making operations free generic functions 
> > instead of members.
> 
> I've not really thought about operators as members vs operators as free 
> functions. I just tend to put them as members because it feels more 
> organised. But looking at other implementations, I seem to be in the 
> minority.
> 
> >> ** 3D vectors only. Perhaps defining a cross product on the
> >>
> >> Matrices:
> >> opAdd, opSub, opMult(scalar), opMult(vector), opMult(matrix)**, Invert,
> >> Inverted, Orthogonalize, Orthogonalized, Reorthogonalize***,
> >> Reorthogonalized***, Det, Transpose, Transposed, Dagger*, Daggered*,
> >> Eigenvalues****, Eigenvectors****
> > 
> > What is the representation of matrices?
> private:
>    F[n*n] mat;
> where F is the type of the field and n is the dimension of the matrix.
> 
> >> *The hermitian conjugate/conjugate transpose. Reduces to the transpose
> >> for a real matrix
> > 
> > Transposition should also be handled in a static manner, e.g. define a 
> > transposed view of a matrix that doesn't actually move elements.
> 
> Do you mean that a bool should be stored to count the number of 
> transpositions or that there is a type that behaves like a matrix but 
> actually just presents a view of another matrix e.g.
> 
> Matrix A;
> ...
> Matrix B = A.Transposed();
> //Changes to B now affect A
> 
> >> ** Matrix-matrix multiplication doesn't commute. Could this be a problem
> >> when using operator notation?
> > 
> > Should be fine.
> > 
> >> *** Othogonalize assuming the matrix is nearly orthogonal already
> >> (possibly using some quick, approximate method such as a Taylor series)
> >> **** I have a eigenvalue/vector solver for 3x3 matrices which seems
> >> reasonably stable but needs more testing.
> >>
> >> Free functions:
> >> MatrixToQuaternion
> >> QuaternionToMatrix
> >> + code to allow easy printing to stdout/streams and such.
> > 
> > Sounds encouraging.
> > 
> > I think a good next step is to go through a community scrutiny process 
> > by dropping the code somewhere on the Web so people can review it.
> Couldn't agree more because I'm sure I'll miss tricks and conventions. I 
> would have never thought of that funky swizzling idea.
> 
> I've also got another question: should matrices, vectors and quaternions 
> be classes or structs? My gut reaction is that they should be structs 
> and thus act like value types. But matrices might be too big and should 
> be passed by reference which would imply they should be a class. Anyone 
> know any rules of thumb that might apply?

I definately think low-dimensional vectors/matrices must be structs.

The cost of writing/reading some float/double/real values sitting next in memory is nowhere near the cost of allocating such a new area for each opAdd. Structs can be pooled too, and referred by pointers.



More information about the Digitalmars-d mailing list