Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html
Vec4.cpp
- Committer:
- BartJanssens
- Date:
- 2016-01-05
- Revision:
- 1:e25ff4b06ed2
- Parent:
- 0:785cff1e5a7c
File content as of revision 1:e25ff4b06ed2:
/*
File: Vec4.cpp
Function: Implements Vec4.h
Author(s): Andrew Willmott
Copyright: (c) 1995-2001, Andrew Willmott
*/
#include "Vec4.h"
//#include <cctype>
//#include <iomanip>
Vec4 &Vec4::MakeUnit(Int n, Real k)
{
if (n == 0)
{ elt[0] = k; elt[1] = vl_zero; elt[2] = vl_zero; elt[3] = vl_zero; }
else if (n == 1)
{ elt[0] = vl_zero; elt[1] = k; elt[2] = vl_zero; elt[3] = vl_zero; }
else if (n == 2)
{ elt[0] = vl_zero; elt[1] = vl_zero; elt[2] = k; elt[3] = vl_zero; }
else if (n == 3)
{ elt[0] = vl_zero; elt[1] = vl_zero; elt[2] = vl_zero; elt[3] = k; }
else
_Error("(Vec4::MakeUnit) illegal unit vector");
return(SELF);
}
bool Vec4::operator == (const Vec4 &a) const
{
return(elt[0] == a[0] && elt[1] == a[1] && elt[2] == a[2] && elt[3] == a[3]);
}
bool Vec4::operator != (const Vec4 &a) const
{
return(elt[0] != a[0] || elt[1] != a[1] || elt[2] != a[2] || elt[3] != a[3]);
}
Vec4 cross(const Vec4 &a, const Vec4 &b, const Vec4 &c)
{
Vec4 result;
// XXX can this be improved? Look at assembly.
#define ROW(i) a[i], b[i], c[i]
#define DET(i,j,k) dot(Vec3(ROW(i)), cross(Vec3(ROW(j)), Vec3(ROW(k))))
result[0] = DET(1,2,3);
result[1] = -DET(0,2,3);
result[2] = DET(0,1,3);
result[3] = -DET(0,1,2);
return(result);
#undef ROW
#undef DET
}
Vec3 proj(const Vec4 &v)
{
Vec3 result;
Assert(v[3] != 0, "(Vec4/proj) last elt. is zero");
result[0] = v[0] / v[3];
result[1] = v[1] / v[3];
result[2] = v[2] / v[3];
return(result);
}
/*
ostream &operator << (ostream &s, const Vec4 &v)
{
Int w = s.width();
return(s << '[' << v[0] << ' ' << setw(w) << v[1] << ' '
<< setw(w) << v[2] << ' ' << setw(w) << v[3] << ']');
}
istream &operator >> (istream &s, Vec4 &v)
{
Vec4 result;
Char c;
// Expected format: [1 2 3 4]
while (s >> c && isspace(c))
;
if (c == '[')
{
s >> result[0] >> result[1] >> result[2] >> result[3];
if (!s)
{
cerr << "Error: Expected number while reading vector\n";
return(s);
}
while (s >> c && isspace(c))
;
if (c != ']')
{
s.clear(ios::failbit);
cerr << "Error: Expected ']' while reading vector\n";
return(s);
}
}
else
{
s.clear(ios::failbit);
cerr << "Error: Expected '[' while reading vector\n";
return(s);
}
v = result;
return(s);
}
*/