/* See dg_makegrid.h */ /* Last edited on 2009-05-18 14:16:47 by stolfi */ #include #include #include #include #include #include #include #include dg_tree_node_t *dg_make_grid ( mdg_dim_t d, mdg_cell_index_t k, mdg_rank_t r, bz_patch_t *b, dg_tree_node_t *p, mdg_cell_predicate_t *split ) { dg_tree_node_t *n = NULL; fprintf(stderr, "+ dg_make_grid cell = %lld rank = %d\n", k, r); affirm(r < mdg_MAX_RANK, "max rank exceeded"); dg_tree_node_t *ch[2]; if (split(k, r, b, p)) { dg_tree_node_t *pch[2]; /* Enclosing nodes of children */ int i; /* Node is not a leaf: */ mdg_axis_t ax = mdg_split_axis(d, r); /* Splitting axis. */ /* Split Bézier patch: */ bz_patch_t bzch[2], *bch[2]; if (b == NULL) { bch[0] = bch[1] = NULL; } else { bzch[0] = bz_patch_new(b->m, b->n, b->g); bch[0] = &(bzch[0]); bzch[1] = bz_patch_new(b->m, b->n, b->g); bch[1] = &(bzch[1]); bz_patch_split(b, ax, 0.5, bch[0], bch[1]); } /* Generate subtrees: */ dg_tree_node_enclose_children(p, pch); for (i = 0; i < 2; i++) { ch[i] = dg_make_grid(d, 2*k + i, r+1, bch[i], pch[i], split); if (b != NULL) { bz_patch_free(bzch[i]); } } /* If both subtrees are empty, omit cell too: */ assert((ch[0] != NULL) && (ch[1] != NULL)); n = dg_tree_node_new(NULL, k); for (i = 0; i < 2; i++) { n->ch[i] = ch[i]; if (ch[i] != NULL) { n->nodes += ch[i]->nodes; ch[i]->pa = n; } } } else { /* Node is a leaf: */ n = dg_tree_node_new(NULL, k); } fprintf(stderr, "- dg_make_grid cell = %lld rank = %d\n", k, r); return n; }