Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html

Committer:
BartJanssens
Date:
Tue Jan 05 13:37:50 2016 +0000
Revision:
1:e25ff4b06ed2
Parent:
0:785cff1e5a7c
fixed va_list bug

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:785cff1e5a7c 1 /*
BartJanssens 0:785cff1e5a7c 2 File: Vec4.cpp
BartJanssens 0:785cff1e5a7c 3
BartJanssens 0:785cff1e5a7c 4 Function: Implements Vec4.h
BartJanssens 0:785cff1e5a7c 5
BartJanssens 0:785cff1e5a7c 6 Author(s): Andrew Willmott
BartJanssens 0:785cff1e5a7c 7
BartJanssens 0:785cff1e5a7c 8 Copyright: (c) 1995-2001, Andrew Willmott
BartJanssens 0:785cff1e5a7c 9
BartJanssens 0:785cff1e5a7c 10 */
BartJanssens 0:785cff1e5a7c 11
BartJanssens 0:785cff1e5a7c 12
BartJanssens 0:785cff1e5a7c 13 #include "Vec4.h"
BartJanssens 0:785cff1e5a7c 14 //#include <cctype>
BartJanssens 0:785cff1e5a7c 15 //#include <iomanip>
BartJanssens 0:785cff1e5a7c 16
BartJanssens 0:785cff1e5a7c 17
BartJanssens 0:785cff1e5a7c 18 Vec4 &Vec4::MakeUnit(Int n, Real k)
BartJanssens 0:785cff1e5a7c 19 {
BartJanssens 0:785cff1e5a7c 20 if (n == 0)
BartJanssens 0:785cff1e5a7c 21 { elt[0] = k; elt[1] = vl_zero; elt[2] = vl_zero; elt[3] = vl_zero; }
BartJanssens 0:785cff1e5a7c 22 else if (n == 1)
BartJanssens 0:785cff1e5a7c 23 { elt[0] = vl_zero; elt[1] = k; elt[2] = vl_zero; elt[3] = vl_zero; }
BartJanssens 0:785cff1e5a7c 24 else if (n == 2)
BartJanssens 0:785cff1e5a7c 25 { elt[0] = vl_zero; elt[1] = vl_zero; elt[2] = k; elt[3] = vl_zero; }
BartJanssens 0:785cff1e5a7c 26 else if (n == 3)
BartJanssens 0:785cff1e5a7c 27 { elt[0] = vl_zero; elt[1] = vl_zero; elt[2] = vl_zero; elt[3] = k; }
BartJanssens 0:785cff1e5a7c 28 else
BartJanssens 0:785cff1e5a7c 29 _Error("(Vec4::MakeUnit) illegal unit vector");
BartJanssens 0:785cff1e5a7c 30
BartJanssens 0:785cff1e5a7c 31 return(SELF);
BartJanssens 0:785cff1e5a7c 32 }
BartJanssens 0:785cff1e5a7c 33
BartJanssens 0:785cff1e5a7c 34 bool Vec4::operator == (const Vec4 &a) const
BartJanssens 0:785cff1e5a7c 35 {
BartJanssens 0:785cff1e5a7c 36 return(elt[0] == a[0] && elt[1] == a[1] && elt[2] == a[2] && elt[3] == a[3]);
BartJanssens 0:785cff1e5a7c 37 }
BartJanssens 0:785cff1e5a7c 38
BartJanssens 0:785cff1e5a7c 39 bool Vec4::operator != (const Vec4 &a) const
BartJanssens 0:785cff1e5a7c 40 {
BartJanssens 0:785cff1e5a7c 41 return(elt[0] != a[0] || elt[1] != a[1] || elt[2] != a[2] || elt[3] != a[3]);
BartJanssens 0:785cff1e5a7c 42 }
BartJanssens 0:785cff1e5a7c 43
BartJanssens 0:785cff1e5a7c 44 Vec4 cross(const Vec4 &a, const Vec4 &b, const Vec4 &c)
BartJanssens 0:785cff1e5a7c 45 {
BartJanssens 0:785cff1e5a7c 46 Vec4 result;
BartJanssens 0:785cff1e5a7c 47 // XXX can this be improved? Look at assembly.
BartJanssens 0:785cff1e5a7c 48 #define ROW(i) a[i], b[i], c[i]
BartJanssens 0:785cff1e5a7c 49 #define DET(i,j,k) dot(Vec3(ROW(i)), cross(Vec3(ROW(j)), Vec3(ROW(k))))
BartJanssens 0:785cff1e5a7c 50
BartJanssens 0:785cff1e5a7c 51 result[0] = DET(1,2,3);
BartJanssens 0:785cff1e5a7c 52 result[1] = -DET(0,2,3);
BartJanssens 0:785cff1e5a7c 53 result[2] = DET(0,1,3);
BartJanssens 0:785cff1e5a7c 54 result[3] = -DET(0,1,2);
BartJanssens 0:785cff1e5a7c 55
BartJanssens 0:785cff1e5a7c 56 return(result);
BartJanssens 0:785cff1e5a7c 57
BartJanssens 0:785cff1e5a7c 58 #undef ROW
BartJanssens 0:785cff1e5a7c 59 #undef DET
BartJanssens 0:785cff1e5a7c 60 }
BartJanssens 0:785cff1e5a7c 61
BartJanssens 0:785cff1e5a7c 62 Vec3 proj(const Vec4 &v)
BartJanssens 0:785cff1e5a7c 63 {
BartJanssens 0:785cff1e5a7c 64 Vec3 result;
BartJanssens 0:785cff1e5a7c 65
BartJanssens 0:785cff1e5a7c 66 Assert(v[3] != 0, "(Vec4/proj) last elt. is zero");
BartJanssens 0:785cff1e5a7c 67
BartJanssens 0:785cff1e5a7c 68 result[0] = v[0] / v[3];
BartJanssens 0:785cff1e5a7c 69 result[1] = v[1] / v[3];
BartJanssens 0:785cff1e5a7c 70 result[2] = v[2] / v[3];
BartJanssens 0:785cff1e5a7c 71
BartJanssens 0:785cff1e5a7c 72 return(result);
BartJanssens 0:785cff1e5a7c 73 }
BartJanssens 0:785cff1e5a7c 74
BartJanssens 0:785cff1e5a7c 75 /*
BartJanssens 0:785cff1e5a7c 76 ostream &operator << (ostream &s, const Vec4 &v)
BartJanssens 0:785cff1e5a7c 77 {
BartJanssens 0:785cff1e5a7c 78 Int w = s.width();
BartJanssens 0:785cff1e5a7c 79
BartJanssens 0:785cff1e5a7c 80 return(s << '[' << v[0] << ' ' << setw(w) << v[1] << ' '
BartJanssens 0:785cff1e5a7c 81 << setw(w) << v[2] << ' ' << setw(w) << v[3] << ']');
BartJanssens 0:785cff1e5a7c 82 }
BartJanssens 0:785cff1e5a7c 83
BartJanssens 0:785cff1e5a7c 84 istream &operator >> (istream &s, Vec4 &v)
BartJanssens 0:785cff1e5a7c 85 {
BartJanssens 0:785cff1e5a7c 86 Vec4 result;
BartJanssens 0:785cff1e5a7c 87 Char c;
BartJanssens 0:785cff1e5a7c 88
BartJanssens 0:785cff1e5a7c 89 // Expected format: [1 2 3 4]
BartJanssens 0:785cff1e5a7c 90
BartJanssens 0:785cff1e5a7c 91 while (s >> c && isspace(c))
BartJanssens 0:785cff1e5a7c 92 ;
BartJanssens 0:785cff1e5a7c 93
BartJanssens 0:785cff1e5a7c 94 if (c == '[')
BartJanssens 0:785cff1e5a7c 95 {
BartJanssens 0:785cff1e5a7c 96 s >> result[0] >> result[1] >> result[2] >> result[3];
BartJanssens 0:785cff1e5a7c 97
BartJanssens 0:785cff1e5a7c 98 if (!s)
BartJanssens 0:785cff1e5a7c 99 {
BartJanssens 0:785cff1e5a7c 100 cerr << "Error: Expected number while reading vector\n";
BartJanssens 0:785cff1e5a7c 101 return(s);
BartJanssens 0:785cff1e5a7c 102 }
BartJanssens 0:785cff1e5a7c 103
BartJanssens 0:785cff1e5a7c 104 while (s >> c && isspace(c))
BartJanssens 0:785cff1e5a7c 105 ;
BartJanssens 0:785cff1e5a7c 106
BartJanssens 0:785cff1e5a7c 107 if (c != ']')
BartJanssens 0:785cff1e5a7c 108 {
BartJanssens 0:785cff1e5a7c 109 s.clear(ios::failbit);
BartJanssens 0:785cff1e5a7c 110 cerr << "Error: Expected ']' while reading vector\n";
BartJanssens 0:785cff1e5a7c 111 return(s);
BartJanssens 0:785cff1e5a7c 112 }
BartJanssens 0:785cff1e5a7c 113 }
BartJanssens 0:785cff1e5a7c 114 else
BartJanssens 0:785cff1e5a7c 115 {
BartJanssens 0:785cff1e5a7c 116 s.clear(ios::failbit);
BartJanssens 0:785cff1e5a7c 117 cerr << "Error: Expected '[' while reading vector\n";
BartJanssens 0:785cff1e5a7c 118 return(s);
BartJanssens 0:785cff1e5a7c 119 }
BartJanssens 0:785cff1e5a7c 120
BartJanssens 0:785cff1e5a7c 121 v = result;
BartJanssens 0:785cff1e5a7c 122 return(s);
BartJanssens 0:785cff1e5a7c 123 }
BartJanssens 0:785cff1e5a7c 124 */