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; }
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; }
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); }
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; }
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; }
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; }
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; }
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; }
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; }
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); }
Expr* expr_hollow(Expr* d, Expr* a) { return expr_rem(a, expr_add(a, d)); }
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)))); }
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); }
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); }