/* * Code to deal with the grid */ #include "art.h" Image *gridcolor; Grid grid[NGRID]={ 0., 0., .1, .1, " 0,0+.1,.1" }; char *mgrid[NGRID+4]={ "grid", " measure", " off", grid[0].button, 0}; int ngrid=1; int gridsel=-1; void Mgrid(void){ Dpoint delta; if(narg<2){ msg("first pick two points, then measure grid"); return; } delta=dsub(arg[0], arg[1]); if(delta.x<0) delta.x=-delta.x; if(delta.y<0) delta.y=-delta.y; if(delta.x==0 || delta.y==0) msg("select the diagonal of the grid cell"); else{ msg("grid %.2f,%.2f+%.2f,%.2f", arg[0].x, arg[0].y, delta.x, delta.y); if(ngrid!=NGRID){ grid[ngrid].origin=arg[0]; grid[ngrid].delta=delta; sprint(grid[ngrid].button, " %.2f,%.2f+%.2f,%.2f", arg[0].x, arg[0].y, delta.x, delta.y); mgrid[ngrid+3]=grid[ngrid].button; ngrid++; newgrid(ngrid-1); } } } void Ogrid(int n){ if(n==0) Mgrid(); else newgrid(n-2); } /* * return the closest point to testp on the grid. * If the grid is off, return a point that's too far away to gravitate to. */ Dpoint neargrid(Dpoint testp){ Dpoint s, o, d; if(gridsel==-1) return dadd(testp, Dpt(2.*gravity+1., 0.)); o=grid[gridsel].origin; d=grid[gridsel].delta; s.x=d.x==0.?testp.x:o.x+floor((testp.x-o.x)/d.x+.5)*d.x; s.y=d.y==0.?testp.y:o.y+floor((testp.y-o.y)/d.y+.5)*d.y; return s; } void newgrid(int n){ if(gridsel!=n){ gridsel=n; redraw(); } } void drawgrid(void){ Dpoint lo, hi, p, d; if(gridsel==-1) return; if(grid[gridsel].button[0]=='*') grid[gridsel].button[0]=' '; else grid[gridsel].button[0]='*'; lo=neargrid(Dpt(0., 0.)); hi=neargrid(P2D(Pt(dwgbox.max.x, dwgbox.min.y))); d=grid[gridsel].delta; for(p.y=lo.y;p.y<=hi.y;p.y+=d.y) for(p.x=lo.x;p.x<=hi.x;p.x+=d.x) line(screen, D2P(p), D2P(p), Endsquare, Endsquare, 0, gridcolor, ZP); flushimage(display, 1); }