Expr* expr_xbox(Expr* a, Expr* b) { Expr* wa = expr_sub(a->xmax,a->xmin); Expr* wb = expr_sub(b->xmax,b->xmin); Expr* r = expr_mul(expr_lit(0.5),expr_add(wa,wb)); auto tg = expr_or(expr_xmov(expr_sub(expr_neg(r),a->xmin),a),expr_xmov(expr_sub(expr_add(expr_neg(r),wa),b->xmin),b)); tg->xmin = expr_neg(r); tg->xmax = r; tg->ymin = expr_min(a->ymin, b->ymin); tg->ymax = expr_max(a->ymax, b->ymax); 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_extrude(Expr* d, Expr* g) { auto r = expr_mul(expr_lit(0.5), d); auto lo = expr_neg(r); auto hi = r; auto tg = expr_and(expr_and(expr_sub(lo,expr_z()), expr_sub(expr_z(),r)), g); tg->xmin = g->xmin; tg->xmax = g->xmax; tg->ymin = g->ymin; tg->ymax = g->ymax; tg->zmin = lo; tg->zmax = hi; // printf("CHECKING EXT TG %p INF XMIN %p YMIN %p ZMIN %p XMAX %p YMAX %p ZMAX %p \n", // tg, tg->xmin, tg->ymin, tg->zmin, tg->xmax, tg->ymax, tg->zmax); return tg; }
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_circle(Expr* d) { auto r = expr_mul(expr_lit(0.5), d); auto g = expr_sub(expr_sqrt(expr_add(expr_sqr(expr_x()), expr_sqr(expr_y()))),r); g->xmin = expr_neg(r); g->xmax = r; g->ymin = expr_neg(r); g->ymax = r; return g; }
static void test_arithmetic() { double d0 = 0.0; double d1 = 0.0; Expr *e_isum = expr_sum(expr_int(2), expr_int(2)); Expr *e_lsum = expr_sum(expr_long(2), expr_long(2)); Expr *e_rsum = expr_sum(expr_real(2.2), expr_real(2.2)); Expr *e_isub = expr_sub(expr_int(3), expr_int(7)); Expr *e_lsub = expr_sub(expr_long(3), expr_long(7)); Expr *e_rsub = expr_sub(expr_real(1.3), expr_real(0.3)); Expr *e_idiv = expr_div(expr_int(8), expr_int(4)); Expr *e_ldiv = expr_div(expr_long(8), expr_long(4)); Expr *e_rdiv = expr_div(expr_real(3.0), expr_real(0.1)); Expr *e_imul = expr_mul(expr_int(5), expr_int(5)); Expr *e_lmul = expr_mul(expr_long(5), expr_long(5)); Expr *e_rmul = expr_mul(expr_real(5.0), expr_real(0.5)); if (4 != val_int(expr_new_val(e_isum, NULL, NULL))) fail(); if (4LL != val_long(expr_new_val(e_lsum, NULL, NULL))) fail(); d0 = val_real(expr_new_val(e_rsum, NULL, NULL)); d1 = 4.4; if (d1 != d0) fail(); if (-4 != val_int(expr_new_val(e_isub, NULL, NULL))) fail(); if (-4LL != val_long(expr_new_val(e_lsub, NULL, NULL))) fail(); d0 = val_real(expr_new_val(e_rsub, NULL, NULL)); d1 = 1.0; if (d1 != d0) fail(); if (2 != val_int(expr_new_val(e_idiv, NULL, NULL))) fail(); if (2LL != val_long(expr_new_val(e_ldiv, NULL, NULL))) fail(); d0 = val_real(expr_new_val(e_rdiv, NULL, NULL)); d1 = 30; if (d1 != d0) fail(); if (25 != val_int(expr_new_val(e_imul, NULL, NULL))) fail(); if (25 != val_long(expr_new_val(e_lmul, NULL, NULL))) fail(); d0 = val_real(expr_new_val(e_rmul, NULL, NULL)); d1 = 2.5; if (d1 != d0) fail(); expr_free(e_isum); expr_free(e_lsum); expr_free(e_rsum); expr_free(e_isub); expr_free(e_lsub); expr_free(e_rsub); expr_free(e_idiv); expr_free(e_ldiv); expr_free(e_rdiv); expr_free(e_imul); expr_free(e_lmul); expr_free(e_rmul); }
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_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)))); }