/* See {rdo_geometry.h}. */ #define rdo_geometry_C_COPYRIGHT "Copyright © 2008 Danillo Pereira and J. Stolfi, UNICAMP" /* Last edited on 2024-12-21 11:52:44 by stolfi */ #include #include double r3_dir_safe(r3_t *a) { double dir = r3_dir(a,a); if (dir == 0) { r3_zero(a); } return dir; } vector3_t rdo_geometry_vector3_from_polar(double theta, double phi) { vector3_t dir; double st = sin(theta); dir.c[0] = st*cos(phi); dir.c[1] = st*sin(phi); dir.c[2] = cos(theta); return dir; } void rdo_geometry_ortho(vector3_t *a, vector3_t *b, vector3_t *r) { double alpha = r3_dot(a,b)/r3_dot(a,a); r->c[0] = b->c[0] - alpha*a->c[0]; r->c[1] = b->c[1] - alpha*a->c[1]; r->c[2] = b->c[2] - alpha*a->c[2]; return; } vector3_t rdo_geometry_pt_pt_dir(point3_t *p, point3_t *q) { vector3_t v; v.c[0] = q->c[0] - p->c[0]; v.c[1] = q->c[1] - p->c[1]; v.c[2] = q->c[2] - p->c[2]; r3_dir_safe(&v); return v; } void *NotNull(void *p, char *file, int line) { if (p == NULL) { fprintf(stderr, "out of memory\n"); exit(1); } return p; }