# What are heterogeneous coordinate systems and reasons for using them?

The book I'm following for a computer graphics course only talks about homogeneous coordinate systems.

What are the reasons for using heterogeneous coordinate systems?

• I believe you'll have more luck if you use the more common terms of "non-homogeneous coordinates" or "Cartesian coordinates" instead of "heterogeneous coordinates" – Jordaan Mylonas Oct 12 '11 at 21:53
• I've never, ever seen or heard anyone refer to "heterogeneous coordinates" in the context of computer graphics before. Is this a common term in some subfield or community I haven't encountered? If not, I wonder whether the OP's teacher knows what he's/she's talking about at all... – Nathan Reed Oct 12 '11 at 22:12
• @NathanReed you get my +1, but it's not nessecarily graphics - it's game development :). Honestly though, I am starting to get the impression that all lecturers are a bunch of primates (especially from StackOverflow questions arising because of them). – Jonathan Dickinson Oct 12 '11 at 22:51
• It's not necessarily the lecturers, but the tutors, who I often find are the problem. – Jordaan Mylonas Oct 12 '11 at 23:58
• @JonathanHobbs: You can have a genius that appears to be a primate lecturer because he/she either has no interested in lecturing, or is bad at it, or both. I find that very common in top universities (personal experience from studying at U of T) – Samaursa Oct 14 '11 at 15:41

Simplicity and approachability. Most people understand heterogeneous systems with a high school level of education. For example: you would typically spend less time figuring out how to interpolate them the first time you attempt it.

They can be visualized. (1, 2) is easer to visualize than (1, 2, 5) - because you first need to eliminate the 5.

Furthermore they can be multiplied by a scalar value with a significant effect. Multiplying a homogeneous coordinate by a scalar achieves nothing. In some problems (|Velocity| = |Velocity| + |Acceleration| * Time)) this is important.

If you need to identify infinities they would help there as well.

I would basically take every advantage given in the Wikipedia article and invert it.

Where homogeneous coordinates include both points and vectors, heterogeneous coordinate systems only include one or the other. The basic point being that the homogeneous coordinate system (x,y,z,w) includes in it the ability to take on translations during transformation based on the w value.

In a heterogeneous system, there is no W value, so normals and positions cannot be multiplied by the same matrix to provide correct output, but the fact that you wont be storing the W value can save memory.

For example: if you have a model matrix, and a set of vertices, those vertices might contain positions, normals, texture coordinates, and colours. If you transform your vertices and normals by the same matrix, you want to use homogeneous vectors (where the position has a 1 in the W, and the normals have a 0 in the W) this will mean that when the 4x4 matrix multiply transforms your vertex data, only the position vector will snag the translation component of the matrix. You can think of a matrix multiply as being a element by element multiplication and final tally of each of the axes of the matrix with the elements in the vector.

If your vector X(1,0,0,0) multiplies an identity matrix, the only row it will pull out will be the first one (the first element in the X vector is 1, the rest are 0), and the first row of the identity matrix is (1,0,0,0), so that's how you get no change. If your vector Y(0,1,0,0) multiplies an identity matrix, the only row it will pull out will be the second one (0,1,0,0) Now, if your matrix includes a translation component, you can see why a vector with a 1 in the W will pick up the translation, but a vector with a 0 in the W will not pick up the translation.

If you want to transform heterogeneous vectors by matrices, you must specify (usually by way of which function you call) what your vector is. If your vector is a position, then you call something like MatrixTransformVector, and if your vector is a normal, then you call something like MatrixRotateAndScaleVector.

In short:

• homogeneous = less code, more instructions
• heterogeneous = less memory, more special cases.

Heterogeneous can also be a little simpler when doing collision detection with minkowski sums as you want to subtract one set of positions from another, but doing that with homogeneous position vectors effectively gets you a mesh of normals rather than a mesh of positions,unless you subtract one of the meshes from the origin before doing the minkowski sum, or add the result to the origin.

This is not going to be the best answer, as I have limited knowledge in this field, but the only big advantages that I know of are that they require less information, and they're easier to understand.

A coordinate of (X, Y) representing a 2d point is much easier to interpret than (X, Y, W).

For computing, storing coordinates without the extra homogeneous component means that less memory is needed.