static void circle( /* indicate a solid angle on image */ FVECT dir, double dom ) { FVECT start, cur; XPoint pt[NSEG+1]; FVECT pp; int ip[2]; register int i; fcross(cur, dir, ourview.vup); if (normalize(cur) == 0.0) goto fail; spinvector(start, dir, cur, acos(1.-dom/(2.*PI))); for (i = 0; i <= NSEG; i++) { spinvector(cur, start, dir, 2.*PI*i/NSEG); cur[0] += ourview.vp[0]; cur[1] += ourview.vp[1]; cur[2] += ourview.vp[2]; viewloc(pp, &ourview, cur); if (pp[2] <= 0.0) goto fail; loc2pix(ip, &pres, pp[0], pp[1]); pt[i].x = ip[0]; pt[i].y = ip[1]; } XDrawLines(theDisplay, gwind, vecGC, pt, NSEG+1, CoordModeOrigin); return; fail: fprintf(stderr, "%s: cannot draw source at (%f,%f,%f)\n", progname, dir[0], dir[1], dir[2]); }
static int strtoipt( /* convert string x y z to image point */ int ipt[2], char *str ) { FVECT im_pt, pt; if (!sscanvec(str, pt)) return(-1); if (DOT(pt,pt) <= FTINY) /* origin is really infinity */ ipt[0] = ipt[1] = -1; /* null vector */ else { viewloc(im_pt, &ourview, pt); loc2pix(ipt, &ourres, im_pt[0], im_pt[1]); } return(0); }
static void value( /* print value on image */ FVECT dir, double v ) { FVECT pos; FVECT pp; int ip[2]; char buf[32]; pos[0] = ourview.vp[0] + dir[0]; pos[1] = ourview.vp[1] + dir[1]; pos[2] = ourview.vp[2] + dir[2]; viewloc(pp, &ourview, pos); if (pp[2] <= 0.0) return; loc2pix(ip, &pres, pp[0], pp[1]); sprintf(buf, "%.0f", v); XDrawImageString(theDisplay, gwind, strGC, ip[0], ip[1], buf, strlen(buf)); }
static int sourcepoly( /* compute image polygon for source */ int sn, RREAL sp[MAXVERT][2] ) { static short cubeord[8][6] = {{1,3,2,6,4,5},{0,4,5,7,3,2}, {0,1,3,7,6,4},{0,1,5,7,6,2}, {0,2,6,7,5,1},{0,4,6,7,3,1}, {0,2,3,7,5,4},{1,5,4,6,2,3}}; register SRCREC *s = source + sn; FVECT ap, ip; RREAL pt[6][2]; int dir; register int i, j; if (s->sflags & (SDISTANT|SFLAT)) { if (s->sflags & SDISTANT) { if (ourview.type == VT_PAR) return(0); /* all or nothing case */ if (s->srad >= 0.05) return(0); /* should never be a problem */ } if (s->sflags & SFLAT) { for (i = 0; i < 3; i++) ap[i] = s->sloc[i] - ourview.vp[i]; if (DOT(ap, s->snorm) >= 0.) return(0); /* source faces away */ } for (j = 0; j < 4; j++) { /* four corners */ for (i = 0; i < 3; i++) { ap[i] = s->sloc[i]; if ((j==1)|(j==2)) ap[i] += s->ss[SU][i]; else ap[i] -= s->ss[SU][i]; if ((j==2)|(j==3)) ap[i] += s->ss[SV][i]; else ap[i] -= s->ss[SV][i]; if (s->sflags & SDISTANT) { ap[i] *= 1. + ourview.vfore; ap[i] += ourview.vp[i]; } } viewloc(ip, &ourview, ap); /* find image point */ if (ip[2] <= 0.) return(0); /* in front of view */ sp[j][0] = ip[0]; sp[j][1] = ip[1]; } return(4); } /* identify furthest corner */ for (i = 0; i < 3; i++) ap[i] = s->sloc[i] - ourview.vp[i]; dir = (DOT(ap,s->ss[SU])>0.) | (DOT(ap,s->ss[SV])>0.)<<1 | (DOT(ap,s->ss[SW])>0.)<<2 ; /* order vertices based on this */ for (j = 0; j < 6; j++) { for (i = 0; i < 3; i++) { ap[i] = s->sloc[i]; if (cubeord[dir][j] & 1) ap[i] += s->ss[SU][i]; else ap[i] -= s->ss[SU][i]; if (cubeord[dir][j] & 2) ap[i] += s->ss[SV][i]; else ap[i] -= s->ss[SV][i]; if (cubeord[dir][j] & 4) ap[i] += s->ss[SW][i]; else ap[i] -= s->ss[SW][i]; } viewloc(ip, &ourview, ap); /* find image point */ if (ip[2] <= 0.) return(0); /* in front of view */ pt[j][0] = ip[0]; pt[j][1] = ip[1]; } return(convex_hull(pt, 6, sp)); /* make sure it's convex */ }