static void bsp_tree_dump_plane(const struct bsp_tree *root, FILE *out) { const struct vector *normal = &root->plane.normal; const struct vector *pt = &root->plane.pt; float d; d = -vec_dot_product(normal, pt); #if 0 { struct vector r; float k = -d/(normal->x*normal->x + normal->y*normal->y + normal->z*normal->z); float e; r.x = k*normal->x; r.y = k*normal->y; r.z = k*normal->z; e = -vec_dot_product(normal, &r); printf("-> %f/%f %f (%f %f %f)\n", d, e, vec_dot_product(normal, &r), r.x, r.y, r.z); assert(fabs(vec_dot_product(normal, &r) + d) < 1e-4); } #endif fprintf(out, "\t\t\t\t%.5f %.5f %.5f %.5f,\n", normal->x, normal->y, normal->z, d); }
void mat_make_look_at(struct matrix *m, const struct vector *o, const struct vector *p) { struct vector n, u, v, t; struct matrix a; vec_sub(&n, p, o); vec_normalize(&n); /* v' = (0, 1, 0) */ vec_set(&v, 0.f, 1.f, 0.f); /* v = v' - (v'*n)*n */ vec_scalar_mul_copy(&t, &n, vec_dot_product(&v, &n)); vec_sub_from(&v, &t); vec_normalize(&v); vec_cross_product(&u, &v, &n); vec_normalize(&u); m->m11 = u.x; m->m12 = u.y; m->m13 = u.z; m->m14 = 0.f; m->m21 = v.x; m->m22 = v.y; m->m23 = v.z; m->m24 = 0.f; m->m31 = n.x; m->m32 = n.y; m->m33 = n.z; m->m34 = 0.f; mat_make_translation(&a, -o->x, -o->y, -o->z); mat_mul(m, &a); }
void SMat<CoeffRing>::dot_product(size_t i, size_t j, elem &result) const { vec_dot_product(columns_[i], columns_[j], result); }