PixelManipulator is a TypeScript library that can run any two-dimensional cellular automata, such as "Conway's Game of Life," and "Rule 90." Inspired by the The Powder Toy.
The demo includes a full-view pixel array, with configurable size, along with a movable viewfinder - also with configurable size. Targeter lines - synced between the viewfinder and the full-view pixel array - are also equipped so you can line up your complicated large-scale builds. You can even disable the targeter lines, the "focus box;" a box indicating the location of the viewfinder, and the pixelCounter, a tool that lets you see how many of what pixel are present. Don't forget that the pixel placer menu lets you not only set a different element for alt, normal and control clicking, but lets you fill the full-view pixel array with a specified random percent of that element with only a button click. All this, and a newly added element customizer, allowing one to edit the color, name and loop attributes of an element.
Pre-programmed cellular automata include:
In your project run one of these:
pnpm i --save pixelmanipulatornpm i --save pixelmanipulatorIf you are using esmodules, you now can import it like this:
import { PixelManipulator, rules, Ctx2dRenderer } from 'pixelmanipulator'
A great starting point is this console-only demo.
To run the node demo
npm inpm run node-demoStart with this html:
<!doctype html>
<html>
  <head>
    <script src="https://unpkg.com/pixelmanipulator@^5.5.7"></script>
  </head>
  <body>
    <canvas id="myCanvas"></canvas>
    <script>
      var canvas = document.getElementById("myCanvas")
      // Create a renderer that renders on that canvas
      var renderer = new pixelmanipulator.Ctx2dRenderer(canvas)
      // Create a PixelManipulator, setting the size to 400 by 400
      var p = new pixelmanipulator.PixelManipulator(renderer, 400, 400)
      // An example element to get you started.
      var gol = p.addElement( {
        name: "Conway's Game Of Life",
        // born on 3, survives on 2 or 3
        ...pixelmanipulator.rules.lifelike(p, 'B3/S23'),
        // the rgb color
        renderAs: [0, 255, 0]
      })
      // If your browser doesn't support spread syntax
      // (that's the `...`), then this works too!
      var rule_ninety = p.addElement({
        name: "Rule 90",
        renderAs: [147, 112, 219]
      })
      p.modifyElement(rule_ninety, pixelmanipulator.rules.wolfram(p, 'Rule 90'))
      // Randomly fill 15% of the canvas with "Conway's Game of Life"
      p.randomlyFill(gol, 15)
      // Watch it go!
      p.play()
    </script>
  </body>
</html>
Pixelmanipulator supports various browser-side module loaders, such as
pixelmanipulatorConway's game of life is a cellular automata with a few simple rules.
All of these rules use a distance formula where it counts the both the pixels
that are immidately touching the edges and the pixels that are immidately
touching the corners.
For example (givin that O is the cell, and X is one that is checked in the
moore distance fourmula):
XXX
XOX
XXX
On an empty cell, if there are exactly three(3) living cells around it, then it is born. A cell will remain alive if there are exactly two(2) or three(3) living cells nearby. Elsewise, the cell either remains dead, or becomes dead.
For life-type cellular automata (cellular automata that are like Conway's game
of Life, but have different rules), there is a specific syntax for how to
specify them: B3/S23. This syntax literally means "born on three(3), survive
on two(2) or three(3)."
The example code above included B2/S23 (AKA "Conway's game of Life") as an example. Feel free to try out other patterns, like
B2/SB36/S232^(9+9))