Example #1
0
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]);
}
Example #2
0
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);
}
Example #3
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));
}
Example #4
0
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 */
}