
#include <cstdio>



//#define OPERATOR_WORKAROUND



class Vec3f
{
public:

	enum { num_components = 3 };
    
	float _v[3];

	Vec3f() { _v[0]=0.0f; _v[1]=0.0f; _v[2]=0.0f;}
	Vec3f(float x,float y,float z) { _v[0]=x; _v[1]=y; _v[2]=z; }

	float& operator [] (int i) { return _v[i]; }
	float operator [] (int i) const { return _v[i]; }

#ifndef OPERATOR_WORKAROUND

	Vec3f operator - (const Vec3f& rhs) const
	{
		return Vec3f(_v[0]-rhs._v[0], _v[1]-rhs._v[1], _v[2]-rhs._v[2]);
	}

#else

	Vec3f & operator -= (const Vec3f& rhs)
	{
		_v[0] -= rhs._v[0];
		_v[1] -= rhs._v[1];
		_v[2] -= rhs._v[2];
		return *this;
	}

	friend Vec3f operator - (const Vec3f& lhs, const Vec3f& rhs)
	{
		return Vec3f(lhs) -= rhs;
	}

#endif
};



Vec3f vc[12];



int main( int argc, char **argv )
{
	int a;
	Vec3f   vt[12], p;

	for(a=0;a<12;a++){
		vc[a] = Vec3f(a, a, a+1.0f);
	}

	p = Vec3f(0.0f,0.0f,1.0f);
	vt[0] = vc[0]-p;
	for(a=1;a<12;a++){
		vt[a] = vc[a]-p;
	}

	for(a=0;a<12;a++){
		printf("%5.2f %5.2f %5.2f\n", vt[a][0], vt[a][1], vt[a][2]);
	}

	return 0;
}
