1
0
mirror of git://projects.qi-hardware.com/ben-scans.git synced 2024-11-21 21:05:56 +02:00

Fix our trigonometry: the z0 inclination is expressed as a tangent, not a sine.

- solidify/project.c (read_face_data, save_face_data): fx/fy represent a
  tangent, not a sine
- solidify/overlap.c (merge_matrix): corrected shrinkage formula to use
  tangent instead of sine
This commit is contained in:
Werner Almesberger 2010-09-25 03:15:11 -03:00
parent 286a6bdd09
commit 98b6050e83
2 changed files with 14 additions and 7 deletions

View File

@ -169,12 +169,19 @@ static void merge_matrix(struct matrix *m, const struct solid *s,
m->b[1] += f->cy;
/*
* Apply shrinkage caused by rotation out of z0. We use that
* cos a = sqrt(1-sin^2 a)
* Apply shrinkage caused by rotation out of z0.
* We need to divide by x = cos a. We have f = tan a.
* With sin^2 a + cos^2 a = 1, we get
*
* f = sqrt(1-cos^2 a)/cos a
* = sqrt(1-x^2)/x
* f^2 = 1/x^2-1
* 1/(f^2+1) = x^2
* cos a = sqrt(1/(f^2+1))
*/
f_x = 1.0/sqrt(1-f->fx*f->fx);
f_y = 1.0/sqrt(1-f->fy*f->fy);
f_x = sqrt(f->fx*f->fx+1);
f_y = sqrt(f->fy*f->fy+1);
m->a[0][0] *= f_x;
m->a[0][1] *= f_x;

View File

@ -71,11 +71,11 @@ static void read_face_data(FILE *file, struct face *f)
if (fscanf(file, "%f", &v) != 1)
return;
f->fx = sin(v/180*M_PI);
f->fx = tan(v/180*M_PI);
if (fscanf(file, "%f", &v) != 1)
return;
f->fy = sin(v/180*M_PI);
f->fy = tan(v/180*M_PI);
if (fscanf(file, "%f", &v) != 1)
return;
@ -152,7 +152,7 @@ static void save_face_data(FILE *file, const char *name, const struct face *f)
a = 180-a;
if (fprintf(file, "%g %g %g\n%g %g %g\n",
f->z_ref*f->z_step,
asin(f->fx)/M_PI*180, asin(f->fy)/M_PI*180,
atan(f->fx)/M_PI*180, atan(f->fy)/M_PI*180,
a, f->m.b[0]*f->x_step, f->m.b[1]*f->y_step) < 0) {
perror(name);
exit(1);