Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html
Vec4.cpp@1:e25ff4b06ed2, 2016-01-05 (annotated)
- 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?
User | Revision | Line number | New 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 | */ |