matrix

by evgkch

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/6.6.1/math.min.js"></script>
<canvas id="canvas"></canvas>

JavaScript

const { cos, sin, PI } = Math;

const fac = n => (x => n === 1 ? x : n * fac(n - 1))(1);

const binaryStatesOf = n => 2 ** (n) - 1;

const canvas = document.getElementById('canvas');

canvas.width = 1000;
canvas.height = 1000;

const r = 500;
const cx = canvas.width / 2;
const cy = canvas.height / 2;

const ctx = canvas.getContext('2d');

function main(n) {

	const m = binaryStatesOf(n);
	const words = new Uint16Array(m);
  
	const matrix = math.matrix([
  	[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1],
    [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1],
    [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1],
    [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1],
    [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
  ]);
  
  for (let i = 0; i < m; i++) {
  	const vec = i.toString(2)
    						 .padStart(n, 0)
                 .split('')
                 .map(Number);
                 
    const res = parseInt(
    	math.multiply(matrix, vec)
      		.toArray()
    			.map(x => x % 2)
          .join(''),
      2
    );
    
    words[i] = res;
  }
  
  //console.log(words.slice())
  
  
  
	// Circle
  ctx.beginPath();
	ctx.arc(cx, cy, r, 0, 2 * PI);
  ctx.stroke();
  ctx.closePath();
  
  // Zero
  ctx.beginPath();
  ctx.arc(cx, cy, 2, 0, 2 * PI);
  ctx.fill();
  ctx.closePath();
  
  // Rest
  ctx.beginPath();
  ctx.globalAlpha = 0.01
  for (let i = 1; i < m; i++) {
  	const...