daily pastebin goal
12%
SHARE
TWEET

Randart-js-final

a guest Sep 3rd, 2018 15 in 194 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function str_split(s) {
  2.     var k = s.indexOf(" ");
  3.     if (k === -1)
  4.         return [s + " ", s];
  5.     return [s.substr(0, k), s.substr(k + 1)];
  6. };
  7.  
  8. function mod_float(a, b) {
  9.     var x = a / b;
  10.     var n = Math.floor(Math.abs(x));
  11.     if (x >= 0.0)
  12.         return a - n * b;
  13.     return a + n * b;
  14. };
  15.  
  16. function range_convert(a1, b1, a2, b2, x) {
  17.     return b2 - (b2 - a2) * Math.abs(mod_float(Math.abs(x - a1), 2.0 * (b1 - a1)) / (b1 - a1) - 1.0);
  18. };
  19.  
  20. function rgb_range_transform(start, end, x) {
  21.     return start + (end - start) * (0.5 + Math.atan(2.0 * x) / Math.PI);
  22. };
  23.  
  24. class Random {
  25.     static _init(seed) {
  26.         function pad(s, k) {
  27.             var n = s.length;
  28.             if (n <= k)
  29.                 return s + 'a'.repeat(k - n);
  30.             return s.substr(n - k);
  31.         };
  32.         function extract(s) {
  33.             return s.charCodeAt(0) + (s.charCodeAt(1) << 8) + (s.charCodeAt(2) << 16) ^ s.charCodeAt(3) << 22;
  34.         };
  35.         Random.state = [Array(55), 0];
  36.         for (var i = 0; i <= 54; ++i)
  37.             Random.state[0][i] = i;
  38.         var l = seed.length;
  39.         var accu = "x";
  40.         for (var i = 0; i <= 54 + Math.max(55, l); ++i) {
  41.             accu = pad(accu + String(seed[i % l]), 16);
  42.             Random.state[0][i % 55] ^= extract(accu);
  43.         }
  44.     };
  45.    
  46.     static _bits() {
  47.         Random.state[1] = (Random.state[1] + 1) % 55;
  48.         var newval = Random.state[0][(Random.state[1] + 24) % 55] + Random.state[0][Random.state[1]] & 1073741823;
  49.         Random.state[0][Random.state[1]] = newval;
  50.         return newval;
  51.     };
  52.    
  53.     static _int(bound) {
  54.         if (bound > 1073741823 || bound <= 0)
  55.             throw Error(`Invalid bound: ${bound}`);
  56.         return Random._bits() % bound;
  57.     };
  58.    
  59.     static _float(bound) {
  60.         var scale = 1073741824.0;
  61.         var r0 = Random._bits();
  62.         var r1 = Random._bits();
  63.         var r2 = Random._bits();
  64.         return ((r0 / scale + r1) / scale + r2) / scale * bound;
  65.     };
  66.    
  67.     static init(s) {
  68.         if (s != "") {
  69.             var n = s.length;
  70.             var a = new Array(n);
  71.             for (var i = 0; i < n; ++i) {
  72.                 a[i] = i * i + s.charCodeAt(i);
  73.             }
  74.             Random._init(a);
  75.         }
  76.         else
  77.             Random._init([0]);
  78.     };
  79.    
  80.     static randint(a, b) {
  81.         return a + Random._int(b - a + 1);
  82.     };
  83.    
  84.     static randfloat(u, v) {
  85.         return u + Random._float(v - u);
  86.     };
  87.    
  88.     static pick(arr) {
  89.         return arr[Random.randint(0, arr.length - 1)];
  90.     };
  91.    
  92.     static pick_many(arr_ext, n) {
  93.         var res = new Array(n);
  94.         var arr = arr_ext.slice();
  95.         var l = arr.length;
  96.         for (var i = 0; i < n; ++i){
  97.             var k = Random.randint(0, l - i - 1);
  98.             res[n - i - 1] = arr[k];
  99.             for (var j = k; j < l - i - 1; ++j) {
  100.                 arr[j] = arr[j + 1];
  101.             }
  102.         }
  103.         return res;
  104.     };
  105.    
  106.     static pick_exp(arr, p) {
  107.         var n = arr.length;
  108.         var u = p;
  109.         var v = Random.randfloat(0.0, 1.0 - Math.pow(1.0 - p, n));
  110.         var pos = 0;
  111.         while(pos < n - 1 && u < v){
  112.             v -= u;
  113.             u *= (1.0 - p);
  114.             ++pos;
  115.         }
  116.         return arr[pos];
  117.     };
  118.    
  119.     static distribute(q, k) {
  120.         var res = new Array(k).fill(0);
  121.         for (var i = 0; i < q; ++i){
  122.             var r = Random.randint(0, k - 1);
  123.             res[r]++;
  124.         }
  125.         return res;
  126.     };
  127. };
  128.  
  129. class Color {
  130.     constructor(r, g, b){
  131.         this.r = r;
  132.         this.g = g;
  133.         this.b = b;
  134.     };
  135.    
  136.     static rgb_force(color1, color2) {
  137.         var dr = color1.r - color2.r;
  138.         var dg = color1.g - color2.g;
  139.         var db = color1.b - color2.b;
  140.         var d2 = 1.0 / (dr * dr + dg * dg + db * db);
  141.         return new Color(dr * d2, dg * d2, db * d2);
  142.     };
  143.    
  144.     static palette_force(cl1, p) {
  145.         var acc = new Color(0.0, 0.0, 0.0);
  146.         for (var i = 0; i < p.length; ++i) {
  147.             var cl2 = p[i];
  148.             if (!(cl1.r == cl2.r && cl1.g == cl2.g && cl1.b == cl2.b)){
  149.                 var force = Color.rgb_force(cl1, cl2);
  150.                 acc = new Color(acc.r + force.r, acc.g + force.g, acc.b + force.b);
  151.             }
  152.         }
  153.         return acc;
  154.     };
  155.  
  156.     static mix(t, color1, color2) {
  157.         var u = 1.0 - t;
  158.         return new Color(t * color1.r + u * color2.r, t * color1.g + u * color2.g, t * color1.b + u * color2.b);
  159.     };
  160.    
  161.     static mix3(u, v, color1, color2, color3) {
  162.         var w = 1.0 - u - v;
  163.         return new Color(u * color1.r + v * color2.r + w * color3.r,
  164.                          u * color1.g + v * color2.g + w * color3.g,
  165.                          u * color1.b + v * color2.b + w * color3.b);
  166.     };
  167.    
  168.     static mix4(u, v, w, color1, color2, color3, color4) {
  169.         var t = 1.0 - u - v;
  170.         return new Color(u * color1.r + v * color2.r + w * color3.r + t * color4.r,
  171.                          u * color1.g + v * color2.g + w * color3.g + t * color4.g,
  172.                          u * color1.b + v * color2.b + w * color3.b + t * color4.b);
  173.     };
  174.  
  175.     torgb() {
  176.         return new Color(rgb_range_transform(0.0, 255.0, this.r) >> 0,
  177.                          rgb_range_transform(0.0, 255.0, this.g) >> 0,
  178.                          rgb_range_transform(0.0, 255.0, this.b) >> 0);
  179.     };
  180.    
  181.     static rgb_of_hsl(h, sl, l) {
  182.         var v = l <= 0.5 ? l * (1.0 + sl) : l + sl - l * sl;
  183.         if (v <= 0.0)
  184.             return new Color(0.0, 0.0, 0.0);
  185.         var m = l + l - v;
  186.         var sv = (v - m) / v;
  187.         var h6 = Math.abs(h * 6.0);
  188.         var sextant = (h6 >> 0) % 6;
  189.         var fract = h6 - Math.floor(h6);
  190.         var vsf = v * sv * fract;
  191.         var mid1 = m + vsf;
  192.         var mid2 = v - vsf;
  193.         if (sextant < 0 || sextant > 4)
  194.             return new Color(v, m, mid2);
  195.         switch (sextant){
  196.             case 0: return new Color(v, mid1, m);
  197.             case 1: return new Color(mid2, v, m);
  198.             case 2: return new Color(m, v, mid1);
  199.             case 3: return new Color(m, mid2, v);
  200.             case 4: return new Color(mid1, m, v);
  201.             default: return null;
  202.         };
  203.     };
  204. };
  205.  
  206. class Point {
  207.     constructor(x, y){
  208.         this.x = x;
  209.         this.y = y;
  210.     };
  211. };
  212.  
  213. class Scalar {
  214.     constructor(v){
  215.         this.v = v;
  216.     };
  217. };
  218.  
  219. class Cond {
  220.     constructor(v){
  221.         this.v = v;
  222.     };
  223. };
  224.  
  225. class Op {
  226.     constructor(name, args, result, f){
  227.         this.name = name;
  228.         this.args = args;
  229.         this.result = result;
  230.         this.f = f;
  231.     };
  232. };
  233.  
  234. var saturate = new Op("saturate", [Color, Scalar], Color, function (env_ignored, connectors) {
  235.     var conn1 = connectors[0];
  236.     var conn2 = connectors[1];
  237.     return function () {
  238.         var c = conn1.result;
  239.         var v = conn2.result;
  240.         var r = c.r;
  241.         var g = c.g;
  242.         var b = c.b;
  243.         var t = Math.max(1.0, range_convert(-1.0, 1.0, 0.0, 1.1, v.v));
  244.         var mx = Math.max(r, Math.max(g, b)) + 0.01;
  245.         var mn = Math.min(r, Math.min(g, b)) - 0.01;
  246.         var d = 1.0 / (mx - mn);
  247.         return Color.mix(t, c, new Color(2.0 * (r - mn) * d - 1.0, 2.0 * (g - mn) * d - 1.0, 2.0 * (b - mn) * d - 1.0));
  248.     };
  249. });
  250.  
  251. var palette_pf = new Op("palette_pf", [Point, Scalar], Color, function (env, connectors) {
  252.     var colors = Random.pick_many(env.palette, 3);
  253.     var cl1 = colors[0];
  254.     var cl2 = colors[1];
  255.     var cl3 = colors[2];
  256.     var conn1 = connectors[0];
  257.     var conn2 = connectors[1];
  258.     return function () {
  259.         var p = conn1.result;
  260.         var zz = conn2.result;
  261.         var x = Math.abs(p.x);
  262.         var y = Math.abs(p.y);
  263.         var z = Math.abs(zz.v);
  264.         var t = 1.0 / (x + y + z);
  265.         return Color.mix3(x * t, y * t, cl1, cl2, cl3);
  266.     };
  267. });
  268.  
  269. var palette_pp = new Op("palette_pp", [Point, Point], Color, function (env, connectors) {
  270.     var colors = Random.pick_many(env.palette, 4);
  271.     var cl1 = colors[0];
  272.     var cl2 = colors[1];
  273.     var cl3 = colors[2];
  274.     var cl4 = colors[3];
  275.     var conn1 = connectors[0];
  276.     var conn2 = connectors[1];
  277.     return function () {
  278.         var p1 = conn1.result;
  279.         var p2 = conn2.result;
  280.         var x = Math.abs(p1.x);
  281.         var y = Math.abs(p1.y);
  282.         var z = Math.abs(p2.x);
  283.         var w = Math.abs(p2.y);
  284.         var t = 1.0 / (x + y + z + w);
  285.         return Color.mix4(x * t, y * t, z * t, cl1, cl2, cl3, cl4);
  286.     };
  287. });
  288.  
  289. var scalar = new Op("scalar", [Point], Scalar, function (env, connectors) {
  290.     var f = Random.pick(env.foci);
  291.     var phi = Random.pick(env.scalars).v;
  292.     var px = Math.cos(2.0 * Math.PI * phi);
  293.     var py = Math.sin(2.0 * Math.PI * phi);
  294.     var conn1 = connectors[0];
  295.     return function () {
  296.         var p = conn1.result;
  297.         return new Scalar((p.x - f.x) * px + (p.y - f.y) * py);
  298.     };
  299. });
  300.  
  301. var pmult = new Op("pmult", [Point, Point], Point, function (env, connectors) {
  302.     var f = Random.pick(env.foci);
  303.     var x = f.x;
  304.     var y = f.y;
  305.     var conn1 = connectors[0];
  306.     var conn2 = connectors[1];
  307.     return function () {
  308.         var p1 = conn1.result;
  309.         var p2 = conn2.result;
  310.         var u = p1.x - x;
  311.         var v = p1.y - y;
  312.         var w = p2.x - x;
  313.         var t = p2.y - y;
  314.         return new Point(x + u * w - v * t, y + u * t + v * w);
  315.     };
  316. });
  317.  
  318. var protfold = new Op("protfold", [Point, Point], Point, function (env, connectors) {
  319.     var n = Math.PI / Math.ceil(range_convert(-1.0, 1.0, 1.5, 12.0, Random.pick(env.scalars).v));
  320.     var conn1 = connectors[0];
  321.     var conn2 = connectors[1];
  322.     return function () {
  323.         var p1 = conn1.result;
  324.         var p2 = conn2.result;
  325.         var x = p2.x;
  326.         var y = p2.y;
  327.         var u = p1.x - x;
  328.         var v = p1.y - y;
  329.         var phi = range_convert(-n, n, -Math.PI, Math.PI, Math.atan2(v, u));
  330.         var r = Math.sqrt(u * u + v * v);
  331.         return new Point(x + r * Math.cos(phi), y + r * Math.sin(phi));
  332.     };
  333. });
  334.  
  335. var dist = new Op("dist", [Point, Point], Scalar, function (env, connectors) {
  336.     var wgh = Math.max(0.0, range_convert(-1.0, 1.0, -0.2, 0.5, Random.pick(env.scalars).v));
  337.     var f = Random.pick(env.foci);
  338.     var xf = (1.0 - wgh) * f.x;
  339.     var yf = (1.0 - wgh) * f.y;
  340.     var conn1 = connectors[0];
  341.     var conn2 = connectors[1];
  342.     return function () {
  343.         var p1 = conn1.result;
  344.         var p2 = conn2.result;
  345.         var dx = p1.x - xf - wgh * p2.x;
  346.         var dy = p1.y - yf - wgh * p2.y;
  347.         return new Scalar(Math.sqrt(2.0 * (dx * dx + dy * dy)) - 1.0);
  348.     };
  349. });
  350.  
  351. var rotate = new Op("rotate", [Point, Point, Scalar], Point, function (env, connectors) {
  352.     var s = env.scalars;
  353.     var wgh1 = Math.max(0.0, range_convert(-1.0, 1.0, -0.5, 0.3, Random.pick(s).v));
  354.     var wgh2 = Math.max(0.0, range_convert(-1.0, 1.0, -0.5, 0.3, Random.pick(s).v));
  355.     var f = Random.pick(env.foci);
  356.     var xf = (1.0 - wgh1) * f.x;
  357.     var yf = (1.0 - wgh1) * f.y;
  358.     var phi = (1.0 - wgh2) * 2.0 * Math.PI * Random.pick(s).v;
  359.     var conn1 = connectors[0];
  360.     var conn2 = connectors[1];
  361.     var conn3 = connectors[2];
  362.     return function () {
  363.         var p1 = conn1.result;
  364.         var p2 = conn2.result;
  365.         var ang = conn3.result;
  366.         var x = xf + wgh1 * p1.x;
  367.         var y = yf + wgh1 * p1.y;
  368.         var a = p2.x - x;
  369.         var b = p2.y - y;
  370.         var t = phi + wgh2 * 2.0 * Math.PI * ang.v;
  371.         var cs = Math.cos(t);
  372.         var sn = Math.sin(t);
  373.         return new Point(x + cs * a + sn * b, y - sn * a + cs * b);
  374.     };
  375. });
  376.  
  377. var fold = new Op("fold", [Point, Point, Scalar], Point, function (env, connectors) {
  378.     var s = env.scalars;
  379.     var wgh1 = Math.max(0.0, range_convert(-1.0, 1.0, -1.1, 0.3, Random.pick(s).v));
  380.     var wgh2 = Math.max(0.0, range_convert(-1.0, 1.0, -1.1, 0.3, Random.pick(s).v));
  381.     var f = Random.pick(env.foci);
  382.     var xf = (1.0 - wgh1) * f.x;
  383.     var yf = (1.0 - wgh1) * f.y;
  384.     var phi = (1.0 - wgh2) * 2.0 * Math.PI * Random.pick(s).v;
  385.     var conn1 = connectors[0];
  386.     var conn2 = connectors[1];
  387.     var conn3 = connectors[2];
  388.     return function () {
  389.         var p1 = conn1.result;
  390.         var p2 = conn2.result;
  391.         var ang = conn3.result;
  392.         var x = xf + wgh1 * p1.x;
  393.         var y = yf + wgh1 * p1.y;
  394.         var u = p2.x;
  395.         var v = p2.y;
  396.         var a = u - x;
  397.         var b = v - y;
  398.         var t = phi + wgh2 * 2.0 * Math.PI * ang.v;
  399.         var cs = Math.cos(t);
  400.         var sn = Math.sin(t);
  401.         var r = 2.0 * Math.max(0.0, a * cs + b * sn);
  402.         return new Point(u - r * cs, v - r * sn);
  403.     };
  404. });
  405.  
  406. var pplus = new Op("pplus", [Point, Point], Point, function (env_ignored, connectors) {
  407.     var conn1 = connectors[0];
  408.     var conn2 = connectors[1];
  409.     return function () {
  410.         var p1 = conn1.result;
  411.         var p2 = conn2.result;
  412.         return new Point(0.5 * (p1.x + p2.x), 0.5 * (p1.y + p2.y));
  413.     };
  414. });
  415.  
  416. var fplus = new Op("fplus", [Scalar, Scalar], Scalar, function (env_ignored, connectors) {
  417.     var conn1 = connectors[0];
  418.     var conn2 = connectors[1];
  419.     return function () {
  420.         var v1 = conn1.result;
  421.         var v2 = conn2.result;
  422.         return new Scalar(0.5 * (v1.v + v2.v));
  423.     };
  424. });
  425.  
  426. var ftimes = new Op("ftimes", [Scalar, Scalar], Scalar, function (env, connectors) {
  427.     var f = Random.pick(env.foci);
  428.     var conn1 = connectors[0];
  429.     var conn2 = connectors[1];
  430.     return function () {
  431.         var v1 = conn1.result;
  432.         var v2 = conn2.result;
  433.         return new Scalar((v1.v + f.x) * (v2.v + f.y));
  434.     };
  435. });
  436.  
  437. var fmix = new Op("fmix", [Scalar, Scalar, Scalar], Scalar, function (env_ignored, connectors) {
  438.     var conn1 = connectors[0];
  439.     var conn2 = connectors[1];
  440.     var conn3 = connectors[2];
  441.     return function () {
  442.         var w = conn1.result;
  443.         var v1 = conn2.result;
  444.         var v2 = conn3.result;
  445.         var u = Math.abs(rgb_range_transform(0.0, 1.0, w.v));
  446.         return new Scalar(u * v1.v + (1.0 - u) * v2.v);
  447.     };
  448. });
  449.  
  450. var pmix = new Op("pmix", [Point, Point, Scalar], Point, function (env_ignored, connectors) {
  451.     var conn1 = connectors[0];
  452.     var conn2 = connectors[1];
  453.     var conn3 = connectors[2];
  454.     return function () {
  455.         var p1 = conn1.result;
  456.         var p2 = conn2.result;
  457.         var w = conn3.result;
  458.         var t = Math.abs(range_convert(-1.0, 1.0, -1.0, 1.0, w.v));
  459.         return new Point(t * p1.x + (1.0 - t) * p2.x, t * p1.y + (1.0 - t) * p2.y);
  460.     };
  461. });
  462.  
  463. var fatan = new Op("fatan", [Scalar], Scalar, function (env, connectors) {
  464.     var ab = Random.pick_many(env.scalars, 2);
  465.     var a = range_convert(-1.0, 1.0, 0.1, 10.0, ab[0].v);
  466.     var b = ab[1].v;
  467.     var conn1 = connectors[0];
  468.     return function () {
  469.         var v = conn1.result;
  470.         return new Scalar(Math.atan((v.v - b) / a) * 2.0 / Math.PI);
  471.     };
  472. });
  473.  
  474. var fmax = new Op("max", [Scalar, Scalar], Scalar, function (env_ignored, connectors) {
  475.     var conn1 = connectors[0];
  476.     var conn2 = connectors[1];
  477.     return function () {
  478.         var v1 = conn1.result;
  479.         var v2 = conn2.result;
  480.         return new Scalar(Math.max(v1.v, v2.v));
  481.     };
  482. });
  483.  
  484. var cmix = new Op("cmix", [Scalar, Color, Color], Color, function (env_ignored, connectors) {
  485.     var conn1 = connectors[0];
  486.     var conn2 = connectors[1];
  487.     var conn3 = connectors[2];
  488.     return function () {
  489.         var w = conn1.result;
  490.         var cl1 = conn2.result;
  491.         var cl2 = conn3.result;
  492.         return Color.mix(w.v, cl1, cl2);
  493.     };
  494. });
  495.  
  496. var fless = new Op("fless", [Scalar, Scalar], Cond, function (env_ignored, connectors) {
  497.     var conn1 = connectors[0];
  498.     var conn2 = connectors[1];
  499.     return function () {
  500.         var v1 = conn1.result;
  501.         var v2 = conn2.result;
  502.         return new Cond(v1.v < v2.v);
  503.     };
  504. });
  505.  
  506. var negative = new Op("negative", [Scalar], Cond, function (env_ignored, connectors) {
  507.     var conn1 = connectors[0];
  508.     return function () {
  509.         var v = conn1.result;
  510.         return new Cond(v.v < 0.0);
  511.     };
  512. });
  513.  
  514. var discretize = new Op("discretize", [Point, Point], Point, function (env, connectors) {
  515.     var f = Random.pick(env.foci);
  516.     var t = Math.max(0.0, range_convert(-1.0, 1.0, -0.1, 0.8, Random.pick(env.scalars).v));
  517.     var a = 0.1 * (1.0 - t) * f.x;
  518.     var b = 0.1 * (1.0 - t) * f.y;
  519.     var conn1 = connectors[0];
  520.     var conn2 = connectors[1];
  521.     return function () {
  522.         var p1 = conn1.result;
  523.         var p2 = conn2.result;
  524.         var a1 = p2.x * t + a;
  525.         var b1 = p2.y * t + b;
  526.         return new Point(a1 * Math.floor(p1.x / a1), b1 * Math.floor(p1.y / b1));
  527.     };
  528. });
  529.  
  530. var inrange = new Op("inrange", [Scalar], Cond, function (env, connectors) {
  531.     var ab = Random.pick_many(env.scalars, 2);
  532.     var b = ab[1].v;
  533.     var a = Math.min(ab[0].v, b);
  534.     var conn1 = connectors[0];
  535.     return function () {
  536.         var x = conn1.result.v;
  537.         return new Cond(a < x && x < b);
  538.     };
  539. });
  540.  
  541. var pfoci = new Op("pfoci", [Point, Point, Point], Point, function (env, connectors) {
  542.     var s = env.scalars;
  543.     var f = env.foci;
  544.     var n = Math.min(f.length, s.length);
  545.     var k = Random.randint(2, n);
  546.     var p = Math.max(0.0, range_convert(-1.0, 1.0, -0.05, 0.5, Random.pick(s).v));
  547.     var xs = Random.pick_many(f, k);
  548.     var ys = Random.pick_many(s, k);
  549.     var fs = new Array(k);
  550.     for (var i = 0; i < k; ++i) {
  551.         fs[i] = [xs[i], 0.1 * ys[i].v * ys[i].v];
  552.     }
  553.     var conn1 = connectors[0];
  554.     var conn2 = connectors[1];
  555.     var conn3 = connectors[2];
  556.     return function () {
  557.         var p1 = conn1.result;
  558.         var t = conn2.result;
  559.         var p2 = conn3.result;
  560.         var x = p1.x;
  561.         var y = p1.y;
  562.         var fp = fs.find(function (ps) {
  563.             var f1 = ps[0];
  564.             var a = x - f1.x - p * p2.x;
  565.             var b = y - f1.y - p * p2.y;
  566.             return a * a + b * b < ps[1];
  567.         });
  568.         if (fp == undefined)
  569.             return t;
  570.         var res = fp[0];
  571.         return new Point(x - res.x, y - res.y);
  572.     };
  573. });
  574.  
  575. var pclosestmax = new Op("pclosestmax", [Point, Scalar], Point, function (env, connectors) {
  576.     var f = env.foci;
  577.     var n = f.length;
  578.     var ps = Random.pick_many(f, Random.randint(n / 2 >> 0, n));
  579.     var conn1 = connectors[0];
  580.     var conn2 = connectors[1];
  581.     return function () {
  582.         var p = conn1.result;
  583.         var t = conn2.result.v;
  584.         var res = ps[0];
  585.         var m = Math.max(t * res.x - p.x, t * res.y - p.y)
  586.         for (var i = 1; i < ps.length; ++i) {
  587.             var m1 = Math.max(t * ps[i].x - p.x, t * ps[i].y - p.y)
  588.             if (m1 <= m) {
  589.                 m = m1;
  590.                 res = ps[i];
  591.             }
  592.         }
  593.         return res;
  594.     };
  595. });
  596.  
  597. var fclosest = new Op("fclosest", [Scalar, Scalar], Scalar, function (env, connectors) {
  598.     var s = env.scalars;
  599.     var n = s.length;
  600.     var ss = Random.pick_many(s, Random.randint(n / 2 >> 0, n));
  601.     var conn1 = connectors[0];
  602.     var conn2 = connectors[1];
  603.     return function () {
  604.         var v1 = conn1.result;
  605.         var v2 = conn2.result;
  606.         var res = ss[0];
  607.         var m = Math.abs(res.v * v2.v - v1.v);
  608.         for (var i = 1; i < ss.length; ++i) {
  609.             var m1 = Math.abs(ss[i].v * v2.v - v1.v);
  610.             if (m1 <= m) {
  611.                 m = m1;
  612.                 res = ss[i];
  613.             }
  614.         }
  615.         return res;
  616.     };
  617. });
  618.  
  619. var torus = new Op("torus", [Point, Scalar, Scalar], Point, function (env_ignored, connectors) {
  620.     var conn1 = connectors[0];
  621.     var conn2 = connectors[1];
  622.     var conn3 = connectors[2];
  623.     return function () {
  624.         var p = conn1.result;
  625.         var a = conn2.result.v;
  626.         var b = conn3.result.v;
  627.         var a2 = Math.min(a, b) - 0.1;
  628.         var b2 = Math.max(a, b) + 0.1;
  629.         return new Point(range_convert(a2, b2, -1.0, 1.0, p.x), range_convert(a2, b2, -1.0, 1.0, p.y));
  630.     };
  631. });
  632.  
  633. var bor = new Op("or", [Cond, Cond], Cond, function (env_ignored, connectors) {
  634.     var conn1 = connectors[0];
  635.     var conn2 = connectors[1];
  636.     return function () {
  637.         var cond1 = conn1.result;
  638.         var cond2 = conn2.result;
  639.         return new Cond(cond1.v || cond2.v);
  640.     };
  641. });
  642.  
  643. var band = new Op("and", [Cond, Cond], Cond, function (env_ignored, connectors) {
  644.     var conn1 = connectors[0];
  645.     var conn2 = connectors[1];
  646.     return function () {
  647.         var cond1 = conn1.result;
  648.         var cond2 = conn2.result;
  649.         return new Cond(cond1.v && cond2.v);
  650.     };
  651. });
  652.  
  653. var fif = new Op("fif", [Cond, Scalar, Scalar], Scalar, function (env_ignored, connectors) {
  654.     var conn1 = connectors[0];
  655.     var conn2 = connectors[1];
  656.     var conn3 = connectors[2];
  657.     return function () {
  658.         var cond = conn1.result;
  659.         var u = conn2.result;
  660.         var v = conn3.result;
  661.         if (cond.v)
  662.             return u;
  663.         return v;
  664.     };
  665. });
  666.  
  667. var cif = new Op("cif", [Cond, Color, Color], Color, function (env_ignored, connectors) {
  668.     var conn1 = connectors[0];
  669.     var conn2 = connectors[1];
  670.     var conn3 = connectors[2];
  671.     return function () {
  672.         var cond = conn1.result;
  673.         var u = conn2.result;
  674.         var v = conn3.result;
  675.         if (cond.v)
  676.             return u;
  677.         return v;
  678.     };
  679. });
  680.  
  681. var pif = new Op("pif", [Cond, Point, Point], Point, function (env_ignored, connectors) {
  682.     var conn1 = connectors[0];
  683.     var conn2 = connectors[1];
  684.     var conn3 = connectors[2];
  685.     return function () {
  686.         var cond = conn1.result;
  687.         var u = conn2.result;
  688.         var v = conn3.result;
  689.         if (cond.v)
  690.             return u;
  691.         return v;
  692.     };
  693. });
  694.  
  695. var rgbv = new Op("rgbv", [Point, Point], Color, function (env_ignored, connectors) {
  696.     var conn1 = connectors[0];
  697.     var conn2 = connectors[1];
  698.     return function () {
  699.         var rg = conn1.result;
  700.         var bv = conn2.result;
  701.         var v = bv.y;
  702.         return new Color(rg.x * v, rg.y * v, bv.x * v);
  703.     };
  704. });
  705.  
  706. var hsl = new Op("hsl", [Point, Scalar], Color, function (env_ignored, connectors) {
  707.     var conn1 = connectors[0];
  708.     var conn2 = connectors[1];
  709.     return function () {
  710.         var hl = conn1.result;
  711.         var ss = conn2.result;
  712.         var h = range_convert(-1.0, 1.0, 0.0, 1.0, hl.x / 2.0);
  713.         var s = range_convert(-1.0, 1.0, 0.0, 1.0, ss.v);
  714.         var l = range_convert(-1.0, 1.0, 0.0, 1.0, hl.y);
  715.         var rgb = Color.rgb_of_hsl(h, s, l);
  716.         return new Color(2.0 * rgb.r - 1.0, 2.0 * rgb.g - 1.0, 2.0 * rgb.b - 1.0);
  717.     };
  718. });
  719.  
  720. var bw = new Op("bw", [Scalar], Color, function (env_ignored, connectors) {
  721.     var conn1 = connectors[0];
  722.     return function () {
  723.         var x = conn1.result.v;
  724.         return new Color(x, x, x);
  725.     };
  726. });
  727.  
  728. var all_ops = [saturate, palette_pf, palette_pp, scalar, pmult, protfold, dist, rotate,
  729.                fold, pplus, fplus, ftimes, fmix, pmix, fatan, fmax,
  730.                cmix, fless, negative, discretize, inrange, pfoci, pclosestmax, fclosest,
  731.                torus, bor, band, fif, cif, pif, rgbv, hsl, bw];
  732.  
  733. class Env {
  734.     constructor() {
  735.         this.scalars = Env.rand_scalars(10);
  736.         this.foci = Env.rand_foci(Random.randint(5, 20));
  737.         this.palette = [new Color(-1.0, -1.0, -1.0), new Color(1.0, 0.0, 1.0)].concat(Env.random_palette(Random.randint(2, 10)));
  738.     }
  739.    
  740.     static rand_scalars(n) {
  741.         var res = new Array(n);
  742.         for(var i = 0; i < n; ++i)
  743.             res[i] = new Scalar(Random.randfloat(-1.0, 1.0));
  744.         return res;
  745.     };
  746.    
  747.     static rand_foci(n) {
  748.         var res = new Array(n);
  749.         for(var i = 0; i < n; ++i){
  750.             var x = Random.randfloat(-1.0, 1.0);
  751.             var y = Random.randfloat(-1.0, 1.0);
  752.             res[i] = new Point(x, y);
  753.         }
  754.         return res;
  755.     };
  756.  
  757.     static rand_color() {
  758.         var r = Random.randfloat(-1.0, 1.0);
  759.         var g = Random.randfloat(-1.0, 1.0);
  760.         var b = Random.randfloat(-1.0, 1.0);
  761.         return new Color(r, g, b);
  762.     };
  763.        
  764.     static random_palette(n) {
  765.         var p = new Array(n);
  766.         for(var i = 0; i < n; ++i)
  767.             p[i] = Env.rand_color();
  768.         var k = Random.randint(-15, 15);
  769.         var h = 0.1;
  770.         for (var i = 0; i < k; ++i){
  771.             p = p.map(function (c) {
  772.                 var pf = Color.palette_force(c, p);
  773.                 return new Color(c.r + h * pf.r, c.g + h * pf.g, c.b + h * pf.b);
  774.             });
  775.         }
  776.         return p;
  777.     };
  778. };
  779.  
  780.  
  781. class Gene {
  782.     constructor(op, connectors) {
  783.         this.op = op;
  784.         this.connectors = connectors;
  785.         this.result = null;
  786.         this.f = null;
  787.     };
  788.    
  789.     compile(env) {
  790.         this.f = this.op.f(env, this.connectors);
  791.     };
  792.    
  793.     run() {
  794.         this.result = this.f();
  795.     }
  796.    
  797.     static get_sort(rna, s) {
  798.         return rna.filter(g => g.op.result == s).reverse();
  799.     };
  800.    
  801.     static connectible(op, rna) {
  802.         return op.args.every(arg => rna.some(g => g.op.result == arg));
  803.     };
  804.  
  805.     static connect(op, rna) {
  806.         return new Gene(op, op.args.map(arg => Random.pick_exp(Gene.get_sort(rna, arg), 0.2)));
  807.     };
  808.    
  809.     static random_rna(ops, seed_ext, res, n) {
  810.         var seed = seed_ext.slice();
  811.         var rna = new Array();
  812.         var j = n;
  813.         while (1) {
  814.             if (j <= 1) {
  815.                 var connectible_ops = ops.filter(op => Gene.connectible(op, seed));
  816.                 var avail_ops = connectible_ops.filter(op => op.result == res);
  817.                 if (avail_ops.length) {
  818.                     rna.push(Gene.connect(Random.pick(avail_ops), seed));
  819.                     return rna;
  820.                 }
  821.                 if (j < -n - 5) {
  822.                     var avail_ops = all_ops.filter(op => Gene.connectible(op, seed) && op.result == res);
  823.                     rna.push(Gene.connect(Random.pick(avail_ops), seed));
  824.                     return rna;
  825.                 }
  826.                 var g = Gene.connect(Random.pick(connectible_ops), seed);
  827.                 rna.push(g);
  828.                 seed.push(g);
  829.                 --j;
  830.                 continue;
  831.             }
  832.             var op = Random.pick(ops);
  833.             if (Gene.connectible(op, seed)) {
  834.                 var g = Gene.connect(op, seed);
  835.                 rna.push(g);
  836.                 seed.push(g);
  837.                 --j;
  838.                 continue;
  839.             }
  840.             var argsn = op.args.length;
  841.             var arg_lengths = Random.distribute(Random.randint(1, j - 1), argsn);
  842.             var left_len = j;
  843.             var conn = new Array(argsn);
  844.             var old_seed = seed.slice();
  845.             for (var i = argsn - 1; i >= 0; --i) {
  846.                 var sub = Gene.random_rna(ops, old_seed, op.args[i], arg_lengths[i]);
  847.                 left_len -= sub.length;
  848.                 conn[i] = sub[sub.length - 1];
  849.                 rna = rna.concat(sub);
  850.                 seed = seed.concat(sub);
  851.             }
  852.             var g = new Gene(op, conn);
  853.             rna.push(g);
  854.             seed.push(g);
  855.             j = left_len;
  856.         }
  857.     };
  858.  
  859.     static optimize(rna) {
  860.         var used = [rna[rna.length - 1]];
  861.         var conn = used[0].connectors.slice();
  862.         for (var i = 0; i < conn.length; ++i) {
  863.             var gene = conn[i];
  864.             if (!used.includes(gene)) {
  865.                 used.push(gene);
  866.                 conn = conn.concat(gene.connectors);
  867.             }
  868.         }
  869.         return rna.filter(g => used.includes(g));
  870.     };  
  871. };
  872.  
  873. class DNA {
  874.     constructor(genes, coords, t) {
  875.         this.genes = genes;
  876.         this.coords = coords;
  877.         this.t = t;
  878.         this.result = null;
  879.     }
  880.    
  881.     run(x, y) {
  882.         this.coords.x = x;
  883.         this.coords.y = y;
  884.         var l = this.genes.length;
  885.         for (var i = 0; i < l; ++i) {
  886.             this.genes[i].run();
  887.         }
  888.         return this.genes[l - 1].result.torgb();
  889.     };
  890.    
  891.     static compile(rna, env, coords, t){
  892.         for (var i = 0; i < rna.length; ++i) {
  893.             rna[i].compile(env);
  894.         }
  895.         return new DNA(rna, coords, t);
  896.     };
  897. };
  898.  
  899. function new_picture(s) {
  900.     var seed = str_split(s);
  901.     Random.init(seed[0]);
  902.     var env = new Env();
  903.     Random.init(seed[1]);
  904.     var n = Random.randint(120, 200);
  905.     var ops_len = all_ops.length;
  906.     var ops = Random.pick_many(all_ops, Random.randint(1 + (ops_len / 5 >> 0), ops_len));
  907.     var coords = new Point(0, 0);
  908.     var t = new Scalar(0);
  909.     var gene_pt = new Gene(new Op("pt", [], Point, (env_ignored, conn_ignored) => function() { return coords;}), []);
  910.     var gene_t = new Gene(new Op("t", [], Scalar, (env_ignored, conn_ignored) => function() { return t;}), []);
  911.     var rna_seed = [gene_t, gene_pt];
  912.     var rna = Gene.optimize(rna_seed.concat(Gene.random_rna(ops, rna_seed, Color, n)));
  913.     return DNA.compile(rna, env, coords, t);
  914. };
  915.  
  916. function compute_pixel(dna, x, y) {
  917.     var color = dna.run(x, y);
  918.     return "rgb(" + String(color.r) + "," + String(color.g) + "," + String(color.b) + ")";
  919. };
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top