mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
release of tvmet (inactive for 2 years and developer unreachable) as the basis for eigen2, because it provides seemingly good expression template mechanisms, we want that, and it would take years to reinvent that wheel. We'll see. So this commit imports the last tvmet release.
104 lines
1.8 KiB
C++
104 lines
1.8 KiB
C++
#include <iostream>
|
|
#include <cmath>
|
|
|
|
#include <tvmet/Vector.h>
|
|
|
|
using namespace std;
|
|
using namespace tvmet;
|
|
|
|
typedef Vector<double,3> vector3d;
|
|
|
|
void reflect(vector3d& reflection, const vector3d& ray, const vector3d& surfaceNormal)
|
|
{
|
|
// The surface normal must be unit length to use this equation.
|
|
reflection = ray - 2 * dot(ray,surfaceNormal) * surfaceNormal;
|
|
|
|
// expression printing
|
|
// cout << (ray - 2 * dot(ray,surfaceNormal) * surfaceNormal) << endl;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
vector3d x, y, z;
|
|
|
|
// y will be the incident ray
|
|
y[0] = 1;
|
|
y[1] = 0;
|
|
y[2] = -1;
|
|
|
|
// z is the surface normal
|
|
z[0] = 0;
|
|
z[1] = 0;
|
|
z[2] = 1;
|
|
|
|
reflect(x, y, z);
|
|
|
|
cout << "Reflected ray is: [ " << x[0] << " " << x[1] << " " << x[2]
|
|
<< " ]" << endl;
|
|
}
|
|
|
|
/*****************************************************************************************
|
|
gcc 3.2.0 produce this code (i586) using tvmet 1.3.0:
|
|
|
|
_Z7reflectRN5tvmet6VectorIdLj3EEERKS1_S4_:
|
|
.LFB2757:
|
|
.L8:
|
|
.L18:
|
|
.L22:
|
|
.L28:
|
|
.L32:
|
|
.L38:
|
|
.L44:
|
|
.L48:
|
|
pushl %ebp
|
|
.LCFI0:
|
|
movl %esp, %ebp
|
|
.LCFI1:
|
|
leal -32(%ebp), %eax
|
|
pushl %ebx
|
|
.LCFI2:
|
|
subl $52, %esp
|
|
.LCFI3:
|
|
movl 16(%ebp), %edx
|
|
movl %eax, -24(%ebp)
|
|
movl 12(%ebp), %ecx
|
|
leal -36(%ebp), %eax
|
|
movl %eax, -20(%ebp)
|
|
movl 8(%ebp), %ebx
|
|
leal -24(%ebp), %eax
|
|
fldl 8(%edx)
|
|
fldl 16(%edx)
|
|
fmull 16(%ecx)
|
|
fxch %st(1)
|
|
movl %eax, -12(%ebp)
|
|
leal -52(%ebp), %eax
|
|
fmull 8(%ecx)
|
|
movl %eax, -48(%ebp)
|
|
leal -12(%ebp), %eax
|
|
fldl (%edx)
|
|
fmull (%ecx)
|
|
fxch %st(1)
|
|
movl %eax, -44(%ebp)
|
|
faddp %st, %st(2)
|
|
faddp %st, %st(1)
|
|
fadd %st(0), %st
|
|
fld %st(0)
|
|
fstl -32(%ebp)
|
|
fxch %st(1)
|
|
fmull (%edx)
|
|
fsubrl (%ecx)
|
|
fstpl (%ebx)
|
|
fld %st(0)
|
|
fmull 8(%edx)
|
|
fsubrl 8(%ecx)
|
|
fstpl 8(%ebx)
|
|
fmull 16(%edx)
|
|
fsubrl 16(%ecx)
|
|
fstpl 16(%ebx)
|
|
addl $52, %esp
|
|
popl %ebx
|
|
popl %ebp
|
|
ret
|
|
|
|
*****************************************************************************************/
|