static void initlissie(ModeInfo * mi, lissiestruct * lissie) { lissstruct *lp = &lisses[MI_SCREEN(mi)]; int size = MI_SIZE(mi); int i; if (MI_NPIXELS(mi) > 2) lissie->color = NRAND(MI_NPIXELS(mi)); else lissie->color = MI_WHITE_PIXEL(mi); /* Initialize parameters */ if (size < -MINSIZE) lissie->ri = NRAND(MIN(-size, MAX(MINSIZE, MIN(lp->width, lp->height) / 4)) - MINSIZE + 1) + MINSIZE; else if (size < MINSIZE) { if (!size) lissie->ri = MAX(MINSIZE, MIN(lp->width, lp->height) / 4); else lissie->ri = MINSIZE; } else lissie->ri = MIN(size, MAX(MINSIZE, MIN(lp->width, lp->height) / 4)); lissie->xi = INTRAND(lp->width / 4 + lissie->ri, lp->width * 3 / 4 - lissie->ri); lissie->yi = INTRAND(lp->height / 4 + lissie->ri, lp->height * 3 / 4 - lissie->ri); lissie->rx = INTRAND(lp->width / 4, MIN(lp->width - lissie->xi, lissie->xi)) - 2 * lissie->ri; lissie->ry = INTRAND(lp->height / 4, MIN(lp->height - lissie->yi, lissie->yi)) - 2 * lissie->ri; lissie->len = INTRAND(MINLISSIELEN, MAXLISSIELEN - 1); lissie->pos = 0; lissie->redrawing = 0; lissie->tx = FLOATRAND(0, 2 * M_PI); lissie->ty = FLOATRAND(0, 2 * M_PI); lissie->dtx = FLOATRAND(MINDT, MAXDT); lissie->dty = FLOATRAND(MINDT, MAXDT); for (i = 0; i < MAXLISSIELEN; i++) lissie->loc[i].x = lissie->loc[i].y = 0; /* Draw lissie */ drawlissie(mi, lissie); }
ENTRYPOINT void init_braid(ModeInfo * mi) { braidtype *braid; int used[MAXSTRANDS]; int i, count, comp, c; float min_length; if (braids == NULL) { if ((braids = (braidtype *) calloc(MI_NUM_SCREENS(mi), sizeof (braidtype))) == NULL) return; } braid = &braids[MI_SCREEN(mi)]; braid->center_x = MI_WIDTH(mi) / 2; braid->center_y = MI_HEIGHT(mi) / 2; braid->age = 0; /* jwz: go in the other direction sometimes. */ braid->color_direction = ((LRAND() & 1) ? 1 : -1); #ifndef STANDALONE MI_CLEARWINDOW(mi); #endif min_length = (braid->center_x > braid->center_y) ? braid->center_y : braid->center_x; braid->min_radius = min_length * 0.30; braid->max_radius = min_length * 0.90; if (MI_COUNT(mi) < MINSTRANDS) braid->nstrands = MINSTRANDS; else braid->nstrands = INTRAND(MINSTRANDS, MAX(MIN(MIN(MAXSTRANDS, MI_COUNT(mi)), (int) ((braid->max_radius - braid->min_radius) / 5.0)), MINSTRANDS)); braid->braidlength = INTRAND(MINLENGTH, MIN(MAXLENGTH, braid->nstrands * 6)); for (i = 0; i < braid->braidlength; i++) { braid->braidword[i] = INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3); if (i > 0) while (braid->braidword[i] == -braid->braidword[i - 1]) braid->braidword[i] = INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3); } while (braid->braidword[0] == -braid->braidword[braid->braidlength - 1]) braid->braidword[braid->braidlength - 1] = INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3); do { (void) memset((char *) used, 0, sizeof (used)); count = 0; for (i = 0; i < braid->braidlength; i++) used[ABS(braid->braidword[i])]++; for (i = 0; i < braid->nstrands; i++) count += (used[i] > 0) ? 1 : 0; if (count < braid->nstrands - 1) { braid->braidword[braid->braidlength] = INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3); while (braid->braidword[braid->braidlength] == -braid->braidword[braid->braidlength - 1] && braid->braidword[0] == -braid->braidword[braid->braidlength]) braid->braidword[braid->braidlength] = INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3); braid->braidlength++; } } while (count < braid->nstrands - 1 && braid->braidlength < MAXLENGTH); braid->startcolor = (MI_NPIXELS(mi) > 2) ? (float) NRAND(MI_NPIXELS(mi)) : 0.0; /* XSetLineAttributes (display, MI_GC(mi), 2, LineSolid, CapRound, JoinRound); */ (void) memset((char *) braid->components, 0, sizeof (braid->components)); c = 1; comp = 0; braid->components[0] = 1; do { i = comp; do { i = applyword(braid, i, 0); braid->components[i] = braid->components[comp]; } while (i != comp); count = 0; for (i = 0; i < braid->nstrands; i++) if (braid->components[i] == 0) count++; if (count > 0) { for (comp = 0; braid->components[comp] != 0; comp++); braid->components[comp] = ++c; } } while (count > 0); braid->linewidth = MI_SIZE(mi); if (braid->linewidth < 0) braid->linewidth = NRAND(-braid->linewidth) + 1; if (braid->linewidth * braid->linewidth * 8 > MIN(MI_WIDTH(mi), MI_HEIGHT(mi))) braid->linewidth = MIN(1, (int) sqrt((double) MIN(MI_WIDTH(mi), MI_HEIGHT(mi)) / 8)); for (i = 0; i < braid->nstrands; i++) if (!(braid->components[i] & 1)) braid->components[i] *= -1; }