$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Hugo Duncan (hugoduncan_at_[hidden])
Date: 2007-03-20 09:19:54
Hi,
We recently wrote some code that did some computaional mechanics and had
several bugs due to mixing frames of reference. Prompted by recent
discussions of affine spaces, I have developed some simple classes for
tracking different spaces, points and displacements at compile time.
eg.
struct frame1 {};
struct frame2 {};
typedef ublas::bounded_vector<double,3> vector;
typedef math::point<vector, frame1> point;
typedef math::displacement<vector, frame1> displacement;
point p1(ublas::scalar_vector<double>(3,1.));
point p2(ublas::scalar_vector<double>(3,1.));
displacement d1(ublas::scalar_vector<double>(3,1.));
p2=p1+d1;
d1=p1+d1; //fails
p1=p1+p1; //fails
vector p3(ublas::scalar_vector<double>(3,1.));
vector d2(ublas::scalar_vector<double>(3,1.));
math::point_ref<frame1>(p3)+=d1;
math::point_ref<frame2>(p3)+=d1; // fails
math::point_ref<frame1>(p3)+=math::displacement_ref<frame1>(d2);
math::point_ref<frame2>(p3)+=math::displacement_ref<frame2>(d2);
math::point_ref<frame1>(p3)+=math::displacement_ref<frame2>(d2); //
fails
The code is available in the math-geometry section of the boost vault at
http://www.boost-consulting.com/vault/index.php?direction=0&order=&directory=Math%20-%20Geometry&
as affine-0.0.3.tar.gz
Comments welcome on the utility of the approach and on the design are most
welcome.
Hugo