bool TerosCam::twodconvert (double p1 [3], double p2 [3], double p3 [3], TerosObject obj, TerosPolygon cTerosPolygon) { int nogo = 0; double pscale [3]; double actpt [3]; if (obj.putctrscale ()) { pscale [0] = obj.centerx (); pscale [1] = obj.centery (); pscale [2] = obj.centerz (); } else { obj.cpyscalep (pscale); } applyrotation (cTerosPolygon.putpx (0), cTerosPolygon.putpy (0), cTerosPolygon.putpz (0), pscale, actpt, obj); if (actpt [0] < 0) { nogo++; } scalept (actpt[0], actpt [1], actpt [2], p1); applyrotation (cTerosPolygon.putpx (1), cTerosPolygon.putpy (1), cTerosPolygon.putpz (1), pscale, actpt, obj); if (actpt [0] < 0) { nogo++; } scalept (actpt[0], actpt [1], actpt [2], p2); applyrotation (cTerosPolygon.putpx (2), cTerosPolygon.putpy (2), cTerosPolygon.putpz (2), pscale, actpt, obj); if (actpt [0] < 0) { nogo++; } if (nogo >= 3) { return false; } scalept (actpt[0], actpt [1], actpt [2], p3); return true; }
Memimage* statgraph(Graph *g) { int i, nbin, x, lo, hi, min, max, first; Memimage *m; Rectangle r; Statbin *b, bin[2000]; /* 32 kB, but whack is worse */ needstack(8192); /* double check that bin didn't kill us */ if(g->wid <= MinWidth) g->wid = DefaultWidth; if(g->ht <= MinHeight) g->ht = DefaultHeight; if(g->wid > nelem(bin)) g->wid = nelem(bin); if(g->fill < 0) g->fill = ((uint)(uintptr)g->arg>>8)%nelem(lofill); if(g->fill > nelem(lofill)) g->fill %= nelem(lofill); nbin = g->wid - (Left+Right); binstats(g->fn, g->arg, g->t0, g->t1, bin, nbin); /* * compute bounds */ min = g->min; max = g->max; if(min < 0 || max <= min){ min = max = 0; first = 1; for(i=0; i<nbin; i++){ b = &bin[i]; if(b->nsamp == 0) continue; if(first || b->min < min) min = b->min; if(first || b->max > max) max = b->max; first = 0; } } qlock(&memdrawlock); ginit(); if(smallfont==nil || black==nil || blue==nil || red==nil || hifill[0]==nil || lofill[0]==nil){ werrstr("graphics initialization failed: %r"); qunlock(&memdrawlock); return nil; } /* fresh image */ m = allocmemimage(Rect(0,0,g->wid,g->ht), ABGR32); if(m == nil){ qunlock(&memdrawlock); return nil; } r = Rect(Left, Top, g->wid-Right, g->ht-Bottom); memfillcolor(m, DTransparent); /* x axis */ memimagedraw(m, Rect(r.min.x, r.max.y, r.max.x, r.max.y+1), black, ZP, memopaque, ZP, S); /* y labels */ drawlabel(m, r.min, max); if(min != 0) drawlabel(m, Pt(r.min.x, r.max.y-smallfont->height), min); /* actual data */ for(i=0; i<nbin; i++){ b = &bin[i]; if(b->nsamp == 0) continue; lo = scalept(b->min, min, max, r.max.y, r.min.y); hi = scalept(b->max, min, max, r.max.y, r.min.y); x = r.min.x+i; hi-=2; memimagedraw(m, Rect(x, hi, x+1,lo), hifill[g->fill%nelem(hifill)], ZP, memopaque, ZP, S); memimagedraw(m, Rect(x, lo, x+1, r.max.y), lofill[g->fill%nelem(lofill)], ZP, memopaque, ZP, S); } if(bin[nbin-1].nsamp) drawlabel(m, Pt(r.max.x, r.min.y+(Dy(r)-smallfont->height)/2), bin[nbin-1].avg); qunlock(&memdrawlock); return m; }