Hi,
Here’s the code for the Point and Vector structs:
#ifndef __POINT3D__
#define __POINT3D__
struct Point3D {
struct { float x, y, z; };
__device__ Point3D() {}
__device__ Point3D(const float a, const float b, const float c) : x(a), y(b), z(c) {}
__device__ Point3D operator+(const Point3D rhs) const { return Point3D(x+rhs.x, y+rhs.y, z+rhs.z); }
__device__ Vector3D operator-(const Point3D rhs) const { return Vector3D(x-rhs.x, y-rhs.y, z-rhs.z); }
__device__ Point3D operator+(const float rhs) const { return Point3D(x+rhs, y+rhs, z+rhs); }
__device__ Point3D operator-(const float rhs) const { return Point3D(x-rhs, y-rhs, z-rhs); }
__device__ Point3D operator*(const float rhs) const { return Point3D(x*rhs, y*rhs, z*rhs); }
__device__ Point3D operator/(const float rhs) const { return Point3D(x/rhs, y/rhs, z/rhs); }
__device__ _inline Point3D operator+ (const Vector3D& v) const
{
return (Point3D(x + v.x, y + v.y, z + v.z));
}
__device__ float d_squared(const Point3D& p) const
{
return ((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y) + (z - p.z) * (z - p.z));
}
__device__ float distance(const Point3D& p) const
{
return (sqrt((x - p.x) * (x - p.x)+ (y - p.y) * (y - p.y)+ (z - p.z) * (z - p.z)));
}
};
#endif
#ifndef __VECTOR3D__
#define __VECTOR3D__
struct Vector3D {
struct{float x,y,z;};
__device__ Vector3D() {}
__device__ Vector3D(const float a, const float b, const float c) : x(a), y(b), z(c) {}
__device__ Vector3D(const float a) : x(a), y(a), z(a) {}
__device__ Vector3D operator=(const Vector3D &v) const { return Vector3D(v.x,v.y,v.z); }
__device__ Vector3D operator+(const Vector3D &v) const { return Vector3D(x+v.x,y+v.y,z+v.z); }
__device__ Vector3D operator-(const Vector3D &v) const { return Vector3D(x-v.x,y-v.y,z-v.z); }
__device__ Vector3D operator-() const { return Vector3D(-x,-y,-z); }
__device__ Vector3D operator*(const float d) const { return Vector3D(x*d,y*d,z*d); }
__device__ Vector3D operator^(const Vector3D &v) const { return Vector3D(y*v.z-z*v.y,z*v.x-x*v.z,x*v.y-y*v.x); }
__device__ float operator* (const Vector3D& v) const
{
return (x * v.x + y * v.y + z * v.z);
}
__device__ Vector3D operator/ (const double a) const
{
return (Vector3D(x / a, y / a, z / a));
}
__device__ Vector3D normalize() const { return *this * (1.f/sqrtf(magsqr())); }
__device__ float norm() const { return sqrtf(magsqr()); }
__device__ float dot(const Vector3D &v) const { return x*v.x+y*v.y+z*v.z; }
__device__ float magsqr() const { return dot(*this); }
};
__device__ Vector3D operator* (const double a, const Vector3D& v)
{
return (Vector3D(a * v.x, a * v.y, a * v.z));
}
#endif