func (scheme SchemeBits) Color(x, y float32) (r, g, b float32) {
	if scheme&RealBit == 0 {
		x = 0
	}
	if scheme&ImagBit == 0 {
		y = 0
	}
	θ := math32.Atan2(-y, x)
	d := math32.Hypot(x, y)
	if d > 1 || scheme&MagnitudeBit == 0 {
		d = 1.0
	}
	if scheme&PhaseBit == 0 {
		r, g, b = d, d, d
	} else {
		r, g, b = phaseColor(θ)
		r *= d
		g *= d
		b *= d
	}
	if scheme&RedBit == 0 {
		r = 0
	}
	if scheme&GreenBit == 0 {
		g = 0
	}
	if scheme&BlueBit == 0 {
		b = 0
	}
	return
}
// Set maximum absolute velocity to v pixels per second.
func SetVelocityMax(v float32) {
	velocityMax = v
	for k := 1; k < len(Zoo); k++ {
		c := &Zoo[k]
		u := math32.Hypot(c.vx, c.vy)
		if u > 0.001 {
			// Scale velocity to new max
			f := velocityMax / u
			c.vx *= f
			c.vy *= f
		} else {
			// Critter is essentially stationary.  Give it a new velocity.
			c.initAlienVelocity()
		}
	}
}
// drawFrequonsSpatial draws the spatial-domain representation of Frequons.
// (xf,yf) is the location of the player.
func drawFrequonsSpatial(pm nimble.PixMap, xf, yf int32) {
	nPastel := pastels.Width()
	for k := 1; k < len(universe.Zoo); k++ {
		c := &universe.Zoo[k]
		d := int32(math32.Hypot(float32(xf)-c.Sx, float32(yf)-c.Sy))
		if c.Show || d < nPastel {
			i := c.ImageIndex()
			if i < len(critterSeq[k]) {
				j := int32(0)
				if !c.Show {
					j = d
				}
				sprite.Draw(pm, int32(math32.Round(c.Sx)), int32(math32.Round(c.Sy)), critterSeq[k][i], pastels.Pixel(j, int32(c.Id)))
			}
		}
	}
	if fourierPort.Contains(mouseX, mouseY) {
		sprite.Draw(pm, xf, yf, critterSeq[0][0], nimble.White)
	}
}
func makeFragments(radius int, self bool) (frags []fragment) {
	r := float32(radius)
	for y := -r; y <= r; y++ {
		for x := -r; x <= r; x++ {
			d := math32.Hypot(x, y)
			var includePoint bool
			if self {
				// Self is hollow ring
				includePoint = r*0.9 <= d && d <= r*1.1
			} else {
				// Aliens are solid circles
				includePoint = d <= r
			}
			if includePoint {
				// Impart radial velocity to fragment
				var vx, vy, extra float32
				if d > 0 {
					vx, vy = x/d, y/d
					extra = 0.4
				} else {
					vx, vy = 0, 0
					extra = 1.4
				}
				// Random non-radial component
				uy, ux := math32.Sincos(rand.Float32() * (2 * math32.Pi))
				frags = append(frags, fragment{
					x,
					y,
					vx + ux*extra,
					vy + uy*extra,
				})
			}
		}
	}
	return frags
}