Esempio n. 1
0
Expr* expr_align_zmax(Expr* a, Expr* b) {
  auto del = expr_sub(a->zmax,b->zmax);
  auto tg  = expr_zmov(del,b);
  tg->copy_bbox(b);
  tg->zmin = expr_add(b->zmin, del);
  tg->zmax = expr_add(b->zmax, del);
  return tg;
}
Esempio n. 2
0
Expr* expr_align_ymin(Expr* a, Expr* b) {
  auto del = expr_sub(a->ymin,b->ymin);
  auto tg  = expr_ymov(del,b);
  tg->copy_bbox(b);
  tg->ymin = expr_add(b->ymin, del);
  tg->ymax = expr_add(b->ymax, del);
  return tg;
}
Esempio n. 3
0
Expr* expr_taper(Expr* dz, Expr* s0, Expr* s1, Expr* g) {
  auto zrad = expr_mul(expr_lit(0.5), dz);
  auto z0   = expr_neg(zrad);
  auto z1   = zrad;
  return new ExprXform(expr_mul(expr_x(), expr_div(dz,expr_add(expr_mul(s1,expr_sub(expr_z(),z0)), expr_mul(s0,expr_sub(z1,expr_z()))))),
                       expr_mul(expr_y(), expr_div(dz,expr_add(expr_mul(s1,expr_sub(expr_z(),z0)), expr_mul(s0,expr_sub(z1,expr_z()))))),
                       expr_z(),
                       g);
}
Esempio n. 4
0
Expr* expr_sphere(Expr* d) {
  auto r = expr_mul(expr_lit(0.5), d);
  auto g = expr_sub(expr_sqrt(expr_add(expr_sqr(expr_x()), expr_add(expr_sqr(expr_y()), expr_sqr(expr_z())))),r);
  g->xmin = expr_neg(r);
  g->xmax = r;
  g->ymin = expr_neg(r);
  g->ymax = r;
  g->zmin = expr_neg(r);
  g->zmax = r;
  return g;
}
Esempio n. 5
0
Expr* expr_zbox(Expr* a, Expr* b) {
  Expr* za = expr_sub(a->zmax,a->zmin);
  Expr* zb = expr_sub(b->zmax,b->zmin);
  Expr* r  = expr_mul(expr_lit(0.5),expr_add(za,zb));
  auto tg  = expr_or(expr_zmov(expr_sub(expr_neg(r),a->zmin),a),
                     expr_zmov(expr_sub(expr_add(expr_neg(r),za),b->zmin),b));
  tg->zmin = expr_neg(r);
  tg->zmax = r;
  tg->xmin = expr_min(a->xmin, b->xmin);
  tg->xmax = expr_max(a->xmax, b->xmax);
  tg->ymin = expr_min(a->ymin, b->ymin);
  tg->ymax = expr_max(a->ymax, b->ymax);
  return tg;
}
Esempio n. 6
0
Expr* expr_ybox(Expr* a, Expr* b) {
  Expr* ha = expr_sub(a->ymax,a->ymin);
  Expr* hb = expr_sub(b->ymax,b->ymin);
  Expr* r = expr_mul(expr_lit(0.5),expr_add(ha,hb));
  auto tg = expr_or(expr_ymov(expr_sub(expr_neg(r),a->ymin),a),expr_ymov(expr_sub(expr_add(expr_neg(r),ha),b->ymin),b));
  tg->ymin = expr_neg(r);
  tg->ymax = r;
  tg->xmin = expr_min(a->xmin, b->xmin);
  tg->xmax = expr_max(a->xmax, b->xmax);
  if (a->zmin != NULL && b->zmin != NULL) {
    tg->zmin = expr_min(a->zmin, b->zmin);
    tg->zmax = expr_max(a->zmax, b->zmax);
  }
  return tg;
}
Esempio n. 7
0
Expr* expr_mov(Expr* dx, Expr* dy, Expr* dz, Expr* g) {
  auto tg = new ExprXform(expr_sub(expr_x(), dx), expr_sub(expr_y(), dy), expr_sub(expr_z(), dz), g);
  tg->copy_bbox(g);
  tg->xmin = expr_add(g->xmin, dx);
  tg->xmax = expr_add(g->xmax, dx);
  tg->ymin = expr_add(g->ymin, dy);
  tg->ymax = expr_add(g->ymax, dy);
  tg->zmin = expr_add(g->zmin, dz);
  tg->zmax = expr_add(g->zmax, dz);
  return tg;
}
Esempio n. 8
0
static int expr_cmp(State_t* state, Node_t *np)
{
	register int	tok = expr_add(state, np);

	while ((tok&~T_OP)==T_CMP)
	{
		Node_t rp;
		register char *left,*right;
		char buff1[36],buff2[36];
		int op = (tok&T_OP);
		tok = expr_add(state, &rp);
		if (numeric(&rp) && numeric(np))
			op |= 010;
		else
		{
			if (np->type&T_STR)
				left = np->str;
			else
				sfsprintf(left=buff1,sizeof(buff1),"%d",np->num);
			if (rp.type&T_STR)
				right = rp.str;
			else
				sfsprintf(right=buff2,sizeof(buff2),"%d",rp.num);
		}
		switch(op)
		{
		    case 0:
			np->num = streq(left,right);
			break;
		    case 1:
			np->num = (strcoll(left,right)>0);
			break;
		    case 2:
			np->num = (strcoll(left,right)<0);
			break;
		    case 3:
			np->num = (strcoll(left,right)>=0);
			break;
		    case 4:
			np->num = (strcoll(left,right)<=0);
			break;
		    case 5:
			np->num = !streq(left,right);
			break;
		    case 010:
			np->num = (np->num==rp.num);
			break;
		    case 011:
			np->num = (np->num>rp.num);
			break;
		    case 012:
			np->num = (np->num<rp.num);
			break;
		    case 013:
			np->num = (np->num>=rp.num);
			break;
		    case 014:
			np->num = (np->num<=rp.num);
			break;
		    case 015:
			np->num = (np->num!=rp.num);
			break;
		}
		np->type = T_NUM;
	}
	return tok;
}
Esempio n. 9
0
int
tool_getopt(int argc, char **argv)
{
    int opt;
    char *p;
    while ((opt = getopt(argc, argv, MAIN_OPTS "IAEvV:i:s:c:")) != -1) {
        switch (opt) {
            case 'i':
                if (expr_add(&mi, optarg, 0)) {
                    exit(EXIT_FAILURE);
                }
                break;
            case 'c':
                if (expr_add(&mc, optarg, 0)) {
                    exit(EXIT_FAILURE);
                }
                break;
            case 's':
                if (expr_add(&ms, optarg, REG_ICASE)) {
                    exit(EXIT_FAILURE);
                }
                break;
            case 'v':
                mflags |= MATCH_INV;
                break;
            case 'V':
                for (p = optarg; *p; p++) {
                    if (*p == 'i') {
                        mi.inv = 1;
                    }
                    else if (*p == 'c') {
                        mc.inv = 1;
                    }
                    else if (*p == 's') {
                        ms.inv = 1;
                    }
                    else {
                        fprintf(stderr, "Invalid argument to -V. Allowed: i, c, s\n");
                        exit(EXIT_FAILURE);
                    }
                }
                break;
            case 'A':
                mflags |= MATCH_AND;
                break;
            case 'I':
                eflags |= REG_ICASE;
                break;
            case 'E':
                eflags |= REG_EXTENDED;
                break;
            case '?':
                exit(EXIT_FAILURE);
            default:
                main_getopt(opt, optarg);
        }
    }
    if (!mi.n && !mc.n && !ms.n) {
        fprintf(stderr, "please specify at least one expression with -i, -c or -s\n");
        exit(EXIT_FAILURE);
    }
    return optind;
}
Esempio n. 10
0
Expr* expr_blend(Expr* g1, Expr* g2, Expr* amount) {
  auto j = expr_add(g1, g2);
  auto f = expr_sub(expr_add(expr_sqrt(expr_abs(g1)), expr_sqrt(expr_abs(g2))), amount);
  return expr_add(j, f);
}
Esempio n. 11
0
Expr* expr_hollow(Expr* d, Expr* a) {
  return expr_rem(a, expr_add(a, d));
}
Esempio n. 12
0
Expr* expr_half(Expr* nx, Expr* ny, Expr* nz, Expr* d) {
  return expr_sub(d, expr_add(expr_mul(expr_x(), nx), expr_add(expr_mul(expr_y(), ny), expr_mul(expr_z(), nz))));
}
Esempio n. 13
0
Expr* expr_zrot(Expr* a, Expr* g) {
  auto sa = expr_sin(a);
  auto ca = expr_cos(a);
  return new ExprXform(expr_add(expr_mul(ca, expr_x()), expr_mul(sa, expr_y())), expr_add(expr_mul(expr_neg(sa), expr_x()), expr_mul(ca, expr_y())), expr_z(), g);
}
Esempio n. 14
0
Expr* expr_xrevolve(Expr* g) {
  return new ExprXform(expr_x(),expr_sqrt(expr_add(expr_sqr(expr_y()),expr_sqr(expr_z()))),expr_z(),g);
}