Boost logo

Boost :

From: Michael Fawcett (michael.fawcett_at_[hidden])
Date: 2007-10-04 12:02:27


On 10/4/07, Phil Endecott <spam_from_boost_dev_at_[hidden]> wrote:
>
> * Homogeneous vs. heterogeneous coordinate types: for example, in a
> mapping application, latitude and longitude are (almost) the same type,
> whereas altitude has an entirely different range and might benefit from
> using a different type e.g. a different fixed-point scale factor. So
> do we have one template parameter or n template parameters?

I have code that supports heterogeneous coordinate types in 2D, 3D,
and 4D for exactly the example you gave - I do GIS related work.
There was a lot of trickery involved to determine appropriate return
types for things like:

vec3<float, float, short> result = vec3<short, short, short>(1, 2, 3)
+ vec3<float, float, short>(1.0, 2.0, 3.0);

I suspect there are now Boost libraries that will make that easy (or
at least easier).

> * Fixed or variable number of coordinates: I'm happy with 2d and
> sometimes 3d points and using distinct types for them, but some people
> think in higher dimensions and need points with arbitrary numbers of dimensions.

Instead of coding a generic class that supported N dimensions, I made
a 2D, 3D, and 4D class. Functions like cross_product and dot_product
only worked on certain types, but thinking about it, there's no
barrier to making that work with a generalized point class. I did
however code a separate quaternion class as I felt it was
significantly different than a 4D point. I have no strong opinion on
the implementation of this.

I do think that it should support Boost.Units though, so I can do
something like:

vec3<nautical_miles, nautical_miles, feet> radar_range;

> * xyz or [n] notation: using .x, .y and .z to access the coordinates
> seems simpler to me, but the higher-dimension people would prefer to
> use [0], [1] ... [n]. That notation also has the advantage that you
> can iterate through the dimensions. Is it possible to support both?

It's possible to support both, either through Fusion, or through a
static array of pointers to members. It's also possible to support
swizzle notation through functions with some macros that I made last
year, e.g. you can do:

float4 c = a.xxyy() + b.wwzz();

> * Accessors or simple variables: should I write p.x or p.x() or
> p.get_x() ?

I much prefer p.x and/or p[0].

> * Member functions or free functions: p.distance_to(q) or
> distance_between(p,q) ?

For functions that modify, I prefer member functions:

p.normalize();

but I also provide free function versions of all member functions that
copy/modify/return, like so:

float3 normalize(float3 pt) { return pt.normalize(); }

just so that it's easier in client code when that behavior is desired.
 For functions that do not modify, I prefer free functions:

distance_between(p, q);

Just my 2 cents...

--Michael Fawcett


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk