void dragon(t_env *e, t_dat *c, LG *i) { init_dragon(e->dat, c->cx, c->cy, i); while ((e->dat->squarer + e->dat->squarei) < 6 && --(*i) > 0) { e->dat->squarer = e->dat->zrir * e->dat->zrir; e->dat->squarei = e->dat->zrii * e->dat->zrii; e->dat->zrii = 2 * e->dat->zrii * e->dat->zrir + e->dat->crii; e->dat->zrir = e->dat->squarer - e->dat->squarei + e->dat->crir; } put_current_pixel(e, c->cx, c->cy, *i); }
void draw_dragon(ModeInfo * mi) { int white, black; int choose_layer, factor, orient, l; dragonstruct *dp; CellList *locallist; Bool detour = False; if (dragons == NULL) return; dp = &dragons[MI_SCREEN(mi)]; if (dp->cellList == NULL) return; MI_IS_DRAWN(mi) = True; choose_layer= NRAND(6); if (dp->ncells[!dp->addlist] == 1) { /* Since the maze is infinite, it may not get to this last * spot for a while. Force it to do it right away so it * does not appear to be stuck. */ detour = True; white = black = 0; /* not used but make -Wall happy */ } else { white = (choose_layer / 2); black = (choose_layer % 2) ? ((white + 2) % 3) : ((white + 1) % 3); /* gray = (choose_layer % 2) ? ((white + 1) % 3) : ((white + 2) % 3); */ } locallist = dp->cellList[!dp->addlist]; orient = dp->generation % 2; factor = 1; for (l = 0; l < dp->generation / 2; l++) { factor *= 3; } if (!locallist && dp->generation >= MI_CYCLES(mi)) { init_dragon(mi); return; } while (locallist) { int i, j, k; i = locallist->pt.x; j = locallist->pt.y; if (orient) { k = (j / factor) % 3; } else { if (j % 2) { /* Had trouble with this line... */ k = ((i + factor / 2) / factor + 1) % 3; } else { k = (i / factor) % 3; } } if (detour) { k = (LRAND() & 1) + 1; dp->oldcell[j * dp->ncols + i] = k; drawcell(mi, i, j, k); } if (white == k) { dp->oldcell[j * dp->ncols + i] = 0; drawcell(mi, i, j, 0); if (!addtolist(mi, i, j)) { free_dragon(MI_DISPLAY(mi), dp); return; } } else if (black == k) { dp->oldcell[j * dp->ncols + i] = 1; drawcell(mi, i, j, 1); } else /* if (gray == k) */ { dp->oldcell[j * dp->ncols + i] = 2; drawcell(mi, i, j, 2); } dp->cellList[!dp->addlist] = dp->cellList[!dp->addlist]->next; free(locallist); dp->ncells[!dp->addlist]--; locallist = dp->cellList[!dp->addlist]; if ((dp->cellList[!dp->addlist] == NULL) && (dp->cellList[dp->addlist] == NULL)) dp->generation = 0; } dp->addlist = !dp->addlist; if (dp->redrawing) { int i; for (i = 0; i < REDRAWSTEP; i++) { if (dp->oldcell[dp->redrawpos] != 1) { drawcell(mi, dp->redrawpos % dp->ncols, dp->redrawpos / dp->ncols, dp->oldcell[dp->redrawpos]); } if (++(dp->redrawpos) >= dp->ncols * dp->nrows) { dp->redrawing = 0; break; } } } dp->generation++; }