sms@sugar.hackercorp.com (Stanley M. Sutton) (03/06/89)
Here is a class for 2 dimensional vectors I've written for a game I'm working on. There are some problems with compiling I've coded around, probably due to the fact I'm using version 1.5 of Zortech C++. Someday, when I have some funds, I'm planning to upgrade. I haven't implemented the dot product yet, as I haven't needed it. Suggestions for improvement would be welcomed, as I'm learning. -----------------------------------vect2.hpp------------------------------ #include <stream.hpp> class vect2 { double x,y; public: vect2(double ix = 0.0, double iy = 0.0) {x = ix; y = iy;}; vect2 operator= (vect2& v){ x = v.x; y = v.y; return (*this); }; vect2 operator+ (vect2& v){ double lx, ly;lx = x + v.x;ly = y + v.y; return vect2(lx,ly); }; vect2 operator- (vect2& v){ double lx, ly;lx = x - v.x;ly = y - v.y; return vect2(lx,ly); }; vect2 operator+= (vect2& v){x += v.x; y += v.y; return *this;}; vect2 operator-= (vect2& v){x -= v.x; y -= v.y; return *this;}; friend vect2 operator* (vect2 &v1, double &s); friend vect2 operator* (double &s, vect2 &v1); double distance (vect2 &v); vect2 unit (); // double dot (vect2 v1, vect2 v2); friend ostream& operator<< (ostream &s,vect2 &v); }; -----------------------------vect2.cpp------------------------------------- #ifndef _vect2.cpp_ #define _vect2.cpp_ #include <math.h> #include "vect2.hpp" double vect2::distance(vect2 &v) { return (sqrt((x-v.x)*(x-v.x)+(y-v.y)*(y-v.y))); } vect2 vect2::unit() { double lx,ly; lx = x/sqrt( x * x + y * y); ly = y/sqrt( x * x + y * y); return vect2(lx,ly); } ostream& operator<< (ostream &s, vect2 &v) { return ( s << "(" << v.x << ", " << v.y << ")" ); } vect2 operator*(vect2& v, double& s) { return vect2(v.x * s, v.y * s); } vect2 operator*(double& s, vect2& v) { return vect2(v.x * s, v.y * s); } # ifndef NDEBUG main() { vect2 x(1,1),y(2,2),z(5,7),t(0,0); double tmp=5.0; t = x + y; cout << " t" << t << " = x" << x << " + y" << y << "\n" ; cout << " distance from x" << x << " to y" << y << " is "; cout << x.distance(y) << "\n"; t = vect2(4,0); cout << " unit vector for " << t << " is " << t.unit() << "\n"; cout << " z * 5 is " << (z * tmp) << "\n"; // cout << " z * 5 is " << (z * 5) << "\n"; // Produces wrong answer, // possibly 5 is not converted to double. // cout << " z * 5 is " << (z * 5.0) << "\n"; // Compiler bug: 11147 from ZTC2 tmp = x.distance(y); cout << " x.distance(y) * z is " << (tmp * z) << "\n"; // cout << " x.distance(y) * z is " << (x.distance(y) * z) << "\n"; // Compiler bug 11147 from ZTC2 cout << " x += z is " << (x += z) << "\n"; cout << " x -= z is " << (x -= z) << "\n"; } # endif #endif ---------------------------------------- compile/link---------------------- ZTCPP1 -mc -otemp.tmp vect2.cpp ZTC2 temp.tmp -ovect2 LINK vect2/noi; BLINK 2.14 Copyright (c) 1986-88 by Zortech, written by Bjorn N. Freeman-Benson BLINK complete. Time: 16.86 seconds -------------------------------------output--------------------------------- t(3, 3) = x(1, 1) + y(2, 2) distance from x(1, 1) to y(2, 2) is 1.414214 unit vector for (4, 0) is (1, 0) z * 5 is (25, 35) x.distance(y) * z is (7.071068, 9.899495) x += z is (6, 8) x -= z is (1, 1)
w-colinp@microsoft.UUCP (Colin Plumb) (03/09/89)
In my, similar, point class, I used * for dot product and / for cross product (to be precise, it returned the z component: x1*y2 - x2*y1). Is there any convention for this? -- -Colin (uunet!microsoft!w-colinp) "Don't listen to me. I never do." - The Doctor