From c01a4fe080a448234b39afb7ea7f7a3c9c229fb7 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 19 Jan 2008 00:47:38 +0000 Subject: [PATCH] linear interpolation works; view presets --- .bzrignore | 1 + interpolate.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++---- mgraph.h | 3 ++ view.c | 62 +++++++++++++++++++++++++++++++++----- 4 files changed, 136 insertions(+), 13 deletions(-) diff --git a/.bzrignore b/.bzrignore index 156d40a..28f0f63 100644 --- a/.bzrignore +++ b/.bzrignore @@ -10,3 +10,4 @@ vgcore.* prime.data *.cfm *.CFM +.view-preset-[0-9] diff --git a/interpolate.c b/interpolate.c index f5d7c1b..b705bcf 100644 --- a/interpolate.c +++ b/interpolate.c @@ -14,6 +14,11 @@ static struct Vertices all; static int computed_count[N]; +static void note_computed(int v, int k) { + assert(computed_count[v] == k); + computed_count[v]++; +} + static void characterise_input(void) { struct stat stab; int r; @@ -36,9 +41,12 @@ static void characterise_input(void) { static void read_input(void) { int x,y, ox,oy, v,ov; - for (oy=y=0; y%2d", oy,y); - for (ox=x=0; x=X) { y= (Y-1)-y; x-=X; } errno= 0; ov= (oy << OXBITS) | ox; v= (y << YSHIFT) | x; @@ -73,6 +81,10 @@ typedef struct { static void traverse_next(Traverse *t) { int v2; + + if (t->v<0) + return; + v2= EDGE_END2(t->v, t->e); if (v2>=0) { int e2= edge_reverse(t->v, t->e); @@ -81,7 +93,66 @@ static void traverse_next(Traverse *t) { } t->v= v2; } - + +static void interpolate(void) { + /* four points P Q R S, although P and S may be missing + * interpolate in QR finding M. */ + int xq,yq,eqr, vp,vq,vm,vr,vs, k; + double pqtarg[D3], srtarg[D3]; + + for (eqr=1; eqr!=4; eqr+=5, eqr%=V6) { /* each old edge exactly once */ + fprintf(stderr,"eqr=%d\n",eqr); + for (yq=0; yq>1)&1); xq=0); + + traverse_next(&trav); + traverse_next(&trav); + vs= trav.v; + + trav.v= vq; trav.e= EDGE_OPPOSITE(eqr); + traverse_next(&trav); + traverse_next(&trav); + vp= trav.v; + + fprintf(stderr," 0x%02x-##-%02x-!%02x!-%02x-##-%02x", + vp&0xff,vq,vm,vr,vs&0xff); + + if (vp>=0) + K pqtarg[k]= all.a[vq][k]*2 - all.a[vp][k]; + else + K pqtarg[k]= all.a[vr][k]; + + if (vs>=0) + K srtarg[k]= all.a[vr][k]*2 - all.a[vs][k]; + else + K srtarg[k]= all.a[vq][k]; + + K { + all.a[vm][k]= 0.5 * (all.a[vq][k] + all.a[vr][k]); +// pqtarg[k]= 0.5 * (pqtarg[k] + all.a[vm][k]); +// srtarg[k]= 0.5 * (srtarg[k] + all.a[vm][k]); +// all.a[vm][k]= 0.5 * (pqtarg[k] + srtarg[k]); + note_computed(vm,k); + } + } + fputc('\n',stderr); + } + } +} + +#if 0 + static void interpolate_line(int startvertex, int direction /* edge number */, int nmax) { @@ -136,10 +207,9 @@ static void interpolate_line(int startvertex, i++, NEXTV) { assert(traverse.v>=0); NEXTV; assert(traverse.v>=0); fputc('#',stderr); - assert(computed_count[traverse.v] == k); GA( gsl_interp_eval_e(interp,xa,ya[k], i+0.5, accel, &all.a[traverse.v][k]) ); - computed_count[traverse.v]++; + note_computed(traverse.v, k); } gsl_interp_accel_free(accel); @@ -159,6 +229,7 @@ static void interpolate(void) { interpolate_line((Y-1)<0 ? eyes_apart_min : eyes_apart_preferred; show(); return; - } else { - printf("unknown key keycode=%d state=0x%x char=%c 0x%02x\n", - e->keycode, e->state, buf[0]>' ' && buf[0]<127 ? buf[0] : '?', - buf[0]); } + + e_nomod= *e; + e_nomod.state= 0; + buf_nomod[0]= 0; + r_nomod= XLookupString(&e_nomod,buf_nomod,sizeof(buf_nomod)-1,&ks,0); + if (r_nomod && !buf_nomod[1] && buf_nomod[0]>='0' && buf_nomod[0]<='9') { + char filename[20], filename_new[25]; + snprintf(filename,sizeof(filename)-1,".view-preset-%s",buf_nomod); + snprintf(filename_new,sizeof(filename_new)-1,"%s.new",filename); + printf("transform preset %d %s\n", e->state, filename); + if (e->state) transform_preset_record(filename,filename_new); + else transform_preset_playback(filename); + return; + } + + printf("unknown key keycode=%d state=0x%x char=%c 0x%02x " + "[rnm=%d bnm[0,1]=0x%02x,%02x]\n", + e->keycode, e->state, buf[0]>' ' && buf[0]<127 ? buf[0] : '?', + buf[0], r_nomod, buf_nomod[0], buf_nomod[1]); + printf("%d %d %d %d\n", + r_nomod, + !buf_nomod[1], + buf_nomod[0]>='0', + buf_nomod[0]<='9'); } static void event_config(XConfigureEvent *e) { -- 2.30.2