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

Various coordinate transform corrections in overlap.c

- solidify/face.h (struct matrix), solidify/face.c (read_file): also record
  the face's center
- solidify/overlap.c (point): reference faces to the screen center
- solidify/overlap.c (point): use correct model coordinates for z0
  calculation
This commit is contained in:
Werner Almesberger 2010-09-24 03:46:32 -03:00
parent 85855ec5ac
commit f3e7c1ec73
3 changed files with 27 additions and 11 deletions

View File

@ -75,6 +75,9 @@ static struct face *read_file(const char *name)
f->sx = f->a->max_x-f->a->min_x+1;
f->sy = f->a->max_y-f->a->min_y+1;
f->cx = (f->a->min_x+f->a->max_x)/2;
f->cy = (f->a->min_y+f->a->max_y)/2;
h = make_histo(f->a);
f->z_ref = f->a->min_z+median(h);
free_histo(h);

View File

@ -32,6 +32,7 @@ struct matrix {
struct face {
struct array *a;
int sx, sy; /* size */
int cx, cy; /* center */
int z_ref;
double fx, fy; /* inclination factor */
struct matrix m;

View File

@ -83,20 +83,32 @@ static double zmix(struct face *f, double x, double y)
}
/*
* Coordinate transformations, on the example of the x coordinate:
*
* - the x coordinate runs from 0 to sx(s)-1
* - since we work relative to the screen center, this becomes x-sx(s)/2
* This is what we perform the coordinate transform on.
* - our model runs from min_x to max_x. Its center is at cx.
*/
static void point(const struct solid *s, int x, int y, guchar *p)
{
double za, zb, z;
int xa = x+s->a->a->min_x;
int ya = y+s->a->a->min_y;
int yb = sy(s)-1-y+s->a->a->min_y;
int xa, xb, ya, yb;
double xaf, xbf, yaf, ybf;
za = zmix(s->a,
xa*s->a->m.a[0][0]+ya*s->a->m.a[0][1]+s->a->m.b[0],
xa*s->a->m.a[1][0]+ya*s->a->m.a[1][1]+s->a->m.b[1]);
xa = x-sx(s)/2;
ya = y-sy(s)/2;
xaf = xa*s->a->m.a[0][0]+ya*s->a->m.a[0][1]+s->a->m.b[0]+s->a->cx;
yaf = xa*s->a->m.a[1][0]+ya*s->a->m.a[1][1]+s->a->m.b[1]+s->a->cy;
za = zmix(s->a, xaf, yaf);
zb = zmix(s->b,
xa*s->b->m.a[0][0]+yb*s->b->m.a[0][1]+s->b->m.b[0],
xa*s->b->m.a[1][0]+yb*s->b->m.a[1][1]+s->b->m.b[1]);
xb = x-sx(s)/2;
yb = (sy(s)-1)/2-y;
xbf = xb*s->b->m.a[0][0]+yb*s->b->m.a[0][1]+s->b->m.b[0]+s->b->cx;
ybf = xb*s->b->m.a[1][0]+yb*s->b->m.a[1][1]+s->b->m.b[1]+s->b->cy;
zb = zmix(s->b, xbf, ybf);
if (za == UNDEF_F && zb == UNDEF_F)
return;
@ -125,8 +137,8 @@ static void point(const struct solid *s, int x, int y, guchar *p)
}
z = za;
za -= face_z0(s->a, xa, ya);
zb -= face_z0(s->b, xa, yb);
za -= face_z0(s->a, xaf, yaf);
zb -= face_z0(s->b, xbf, ybf);
if (za+zb < -s->dist) {
p[0] = 0;