#include #include #include Point3 point3(double x, double y, double z) { Point3 p; p.x = x; p.y = y; p.z = z; return p; } Point3 padd3(Point3 p0, Point3 p1) { Point3 p; p.x = p0.x + p1.x; p.y = p0.y + p1.y; p.z = p0.z + p1.z; return p; } Point3 psub3(Point3 p0, Point3 p1) { Point3 p; p.x = p0.x - p1.x; p.y = p0.y - p1.y; p.z = p0.z - p1.z; return p; } Point3 pmul3(double s, Point3 p) { p.x *= s; p.y *= s; p.z *= s; return p; } Point3 pmax3(Point3 p0, Point3 p1) { Point3 p; if (p0.x > p1.x) p.x = p0.x; else p.x = p1.x; if (p0.y > p1.y) p.y = p0.y; else p.y = p1.y; if (p0.z > p1.z) p.z = p0.z; else p.z = p1.z; return p; } Point3 pmin3(Point3 p0, Point3 p1) { Point3 p; if (p0.x < p1.x) p.x = p0.x; else p.x = p1.x; if (p0.y < p1.y) p.y = p0.y; else p.y = p1.y; if (p0.z < p1.z) p.z = p0.z; else p.z = p1.z; return p; } int peq3(Point3 p0, Point3 p1) { return (p0.x == p1.x && p0.y == p1.y && p0.z == p1.z); } double pdot3(Point3 p0, Point3 p1) { double r; r = p0.x*p1.x + p0.y*p1.y + p0.z*p1.z; return r; } Point3 pcross3(Point3 p0, Point3 p1) { Point3 p; p.x = p0.y*p1.z - p0.z*p1.y; p.y = -p0.x*p1.z + p0.z*p1.x; p.z = p0.x*p1.y - p0.y*p1.x; return p; } Point3 pmid3(double s, Point3 p0, Point3 p1) { Point3 p; p.x = p0.x + s*(p1.x - p0.x); p.y = p0.y + s*(p1.y - p0.y); p.z = p0.z + s*(p1.z - p0.z); return p; } double pabs3(Point3 p) { return sqrt(p.x*p.x + p.y*p.y + p.z*p.z); } Point3 prand3(void) { Point3 p; p.x = frand(); p.y = frand(); p.z = frand(); return p; }