예제 #1
0
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);
}
예제 #2
0
파일: matrix.c 프로젝트: dfyockey/vulcan
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);
}
예제 #3
0
파일: smat.hpp 프로젝트: BertiniM2/M2
void SMat<CoeffRing>::dot_product(size_t i, size_t j, elem &result) const
{
  vec_dot_product(columns_[i], columns_[j], result);
}