mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Starting Eigen 2 development. The current plan is to use the last
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.
This commit is contained in:
103
tvmet-1.7.1/examples/ray.cc
Normal file
103
tvmet-1.7.1/examples/ray.cc
Normal file
@@ -0,0 +1,103 @@
|
||||
#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
|
||||
|
||||
*****************************************************************************************/
|
||||
Reference in New Issue
Block a user