Skip to content

Commit

Permalink
added loadPath generation
Browse files Browse the repository at this point in the history
  • Loading branch information
tjjfvi committed Oct 3, 2018
1 parent 32e1aa3 commit 673c0f4
Show file tree
Hide file tree
Showing 3 changed files with 325 additions and 3 deletions.
143 changes: 143 additions & 0 deletions createLoadPath.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@

Array.createRandomSortFunction = () => {
let map = new Map([]);

let lookup = v => {
if(map.get(v)) return map.get(v);
let o = Math.random();
map.set(v, o);
return o;
}

return (a, b) => lookup(a) - lookup(b);
};

Array.prototype.shuffle = function(){
return this.sort(Array.createRandomSortFunction());
}


const { edges, svgHeader, svgFooter, classesOrder } = require("./loadPathData.js");

module.exports = () => {

edges.shuffle();

return genSvg();

};


function loop(begin, edgeInds){

let gen = _(begin, begin, edgeInds, true);
let value;
let done = false;

while(!done && !value)
({ value, done } = gen.next());

return value || { edgeInds: [], reverses: [] };


function* _(begin, point, edgeInds, isStart){

if(point === begin && !isStart)
return { edgeInds: [], reverses: [] };

yield;

let nextEdges = edges
.map((e, i) => [e, i])
.filter(([_, i]) => !~edgeInds.indexOf(i))
.filter(([e]) => e[0] === point || e[1] === point)
.map(([e, i]) => ({ edge: e, ind: i, point: e[0] === point ? e[1] : e[0] }))
.map(e => ({ ...e, reverse: e.edge[0] !== e.point }))
.map(e => ({ ...e, gen: _(begin, e.point, [...edgeInds, e.ind]) }))
;

for(let i = 0; nextEdges.length; i++){
i %= nextEdges.length;

let { ind, reverse, gen } = nextEdges[i];
let { value, done } = gen.next();

yield value ? { edgeInds: [ind, ...value.edgeInds], reverses: [reverse, ...value.reverses] } : value;

if(done) nextEdges.splice(i--, 1);
}

return;

}

}

function fill(begin){

let { edgeInds, reverses } = loop(begin, []);

outer: while(true){

let points = edgeInds.map(ei => edges[ei]).map((e, i) => e[+reverses[i]]).map((p, i) => ({ point: p, ind: i }));

points.shuffle();

while(points.length) {

let { point, ind } = points[0];

let extraEdges = edges
.map((e, i) => [e, i])
.filter(([e]) => e[0] === point || e[1] === point)
.filter(([e, i]) => !~edgeInds.indexOf(i))
;

if(extraEdges.length) {

let { edgeInds: newEdgeInds, reverses: newReverses } = loop(point, edgeInds);

edgeInds.splice(ind + 1, 0, ...newEdgeInds);
reverses.splice(ind + 1, 0, ...newReverses);

points.shift();

continue outer;

}

points.shift();

}

break;

}

return { edgeInds, reverses };

}

function genSvg(){

let { edgeInds, reverses } = fill(edges[0][+(Math.random() > .5)]);

let paths = edgeInds.map(ei => edges[ei]).map((e, i) => ({
class: e.class,
...(!reverses[i] ?
{ 0: e[1], 1: e[0] } :
{ 0: e[0], 1: e[1] }
)
})).reduceRight((acc, e) => {
return acc[0] && acc[0].class === e.class ?
[{ class: e.class, points: [e[0], ...acc[0].points] }, ...acc.slice(1)] :
[{ class: e.class, points: [e[0], e[1]] }, ...acc]
}, []).map((p, i) => ({ ...p, order: i })).sort((a, b) => classesOrder.indexOf(a.class) - classesOrder.indexOf(b.class));

let svg = svgHeader + paths.map(p =>
`<polyline class="${p.class}" order="${p.order}" points="${p.points.map(p => p.join(",")).join(" ")}"/>`
).join("") + svgFooter;

return svg;

}
172 changes: 172 additions & 0 deletions loadPathData.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
let mapping = {};
let counters = {};

const data = {
svgHeader: `
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="200 200 1096 1528" style="enable-background:new 0 0 1296 1728;" xml:space="preserve">
<style>
svg * {
fill: none;
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
stroke-miterlimit: 10;
}
.back {
stroke: #969696;
}
.ghost {
stroke: #c8c8c8;
}
.front {
stroke: #000000;
}
</style>
`.replace(/\s+/g, " "),
svgFooter: "</svg>",
classesOrder: ["back", "ghosts", "front"],
edges: [
{ class: "back", 0: [571.3, 660.3], 1: [574.3, 753.5] },
{ class: "back", 0: [522.8, 676.7], 1: [528.4, 778.4] },
{ class: "back", 0: [463.4, 696.9], 1: [472.4, 808.5] },
{ class: "back", 0: [574.3, 753.5], 1: [528.4, 778.4] },
{ class: "back", 0: [472.4, 808.5], 1: [528.4, 778.4] },
{ class: "back", 0: [402.9, 844], 1: [472.4, 808.5] },
{ class: "back", 0: [574.3, 753.5], 1: [577.2, 839.6] },
{ class: "back", 0: [528.4, 778.4], 1: [533.5, 871.4] },
{ class: "back", 0: [472.4, 808.5], 1: [480.5, 909.6] },
{ class: "back", 0: [577.2, 839.6], 1: [533.5, 871.4] },
{ class: "back", 0: [480.5, 909.6], 1: [533.5, 871.4] },
{ class: "back", 0: [415.6, 955], 1: [480.5, 909.6] },
{ class: "back", 0: [488.3, 1002.1], 1: [480.5, 909.6] },
{ class: "back", 0: [538, 956.9], 1: [533.5, 871.4] },
{ class: "back", 0: [579.8, 919.5], 1: [577.2, 839.6] },
{ class: "back", 0: [538, 956.9], 1: [579.8, 919.5] },
{ class: "back", 0: [488.3, 1002.1], 1: [538, 956.9] },
{ class: "back", 0: [427.1, 1055.1], 1: [488.3, 1002.1] },
{ class: "back", 0: [660.2, 666.7], 1: [660.2, 763.3] },
{ class: "back", 0: [756.5, 673.6], 1: [751.9, 773.6] },
{ class: "back", 0: [574.3, 753.5], 1: [660.2, 763.3] },
{ class: "back", 0: [751.9, 773.6], 1: [660.2, 763.3] },
{ class: "back", 0: [851.8, 785.2], 1: [751.9, 773.6] },
{ class: "back", 0: [659.3, 852.1], 1: [747.6, 865.5] },
{ class: "back", 0: [751.9, 773.6], 1: [747.6, 865.5] },
{ class: "back", 0: [843.2, 880], 1: [747.6, 865.5] },
{ class: "back", 0: [577.2, 839.6], 1: [659.3, 852.1] },
{ class: "back", 0: [660.2, 763.3], 1: [659.3, 852.1] },
{ class: "back", 0: [658.9, 934.1], 1: [579.8, 919.5] },
{ class: "back", 0: [659.3, 852.1], 1: [658.9, 934.1] },
{ class: "back", 0: [747.6, 865.5], 1: [743.7, 949.9] },
{ class: "back", 0: [658.9, 934.1], 1: [743.7, 949.9] },
{ class: "back", 0: [835.1, 967], 1: [743.7, 949.9] },
{ class: "back", 0: [622.9, 974.6], 1: [538, 956.9] },
{ class: "back", 0: [658.9, 934.1], 1: [622.9, 974.6] },
{ class: "back", 0: [743.7, 949.9], 1: [714.5, 993.6] },
{ class: "back", 0: [622.9, 974.6], 1: [714.5, 993.6] },
{ class: "back", 0: [813.9, 1014.4], 1: [714.5, 993.6] },
{ class: "back", 0: [679.2, 1046.7], 1: [788, 1072.4] },
{ class: "back", 0: [714.5, 993.6], 1: [679.2, 1046.7] },
{ class: "back", 0: [635.1, 1110.7], 1: [679.2, 1046.7] },
{ class: "back", 0: [622.9, 974.6], 1: [579.5, 1023.5] },
{ class: "back", 0: [526.1, 1081.6], 1: [579.5, 1023.5] },
{ class: "back", 0: [679.2, 1046.7], 1: [579.5, 1023.5] },
{ class: "back", 0: [488.3, 1002.1], 1: [579.5, 1023.5] },
{ class: "ghost", 0: [427.1, 1055.1], 1: [861.3, 681.2] },
{ class: "ghost", 0: [755.5, 1143], 1: [571.3, 660.3] },
{ class: "ghost", 0: [835.1, 967], 1: [388.7, 720.1] },
{ class: "ghost", 0: [579.8, 919.5], 1: [777.5, 762.5] },
{ class: "front", 0: [415.6, 955], 1: [427.1, 1055.1] },
{ class: "front", 0: [402.9, 844], 1: [415.6, 955] },
{ class: "front", 0: [388.7, 720.1], 1: [402.9, 844] },
{ class: "front", 0: [526.1, 1081.6], 1: [519.5, 978] },
{ class: "front", 0: [512, 862.3], 1: [519.5, 978] },
{ class: "front", 0: [503.8, 732.7], 1: [512, 862.3] },
{ class: "front", 0: [632.3, 746.6], 1: [633.4, 882.9] },
{ class: "front", 0: [634.1, 1003.3], 1: [633.4, 882.9] },
{ class: "front", 0: [635.1, 1110.7], 1: [634.1, 1003.3] },
{ class: "front", 0: [777.5, 762.5], 1: [769, 905.6] },
{ class: "front", 0: [761.9, 1031.4], 1: [769, 905.6] },
{ class: "front", 0: [755.5, 1143], 1: [761.9, 1031.4] },
{ class: "front", 0: [388.7, 720.1], 1: [503.8, 732.7] },
{ class: "front", 0: [632.3, 746.6], 1: [503.8, 732.7] },
{ class: "front", 0: [777.5, 762.5], 1: [632.3, 746.6] },
{ class: "front", 0: [402.9, 844], 1: [512, 862.3] },
{ class: "front", 0: [633.4, 882.9], 1: [512, 862.3] },
{ class: "front", 0: [769, 905.6], 1: [633.4, 882.9] },
{ class: "front", 0: [519.5, 978], 1: [415.6, 955] },
{ class: "front", 0: [634.1, 1003.3], 1: [519.5, 978] },
{ class: "front", 0: [761.9, 1031.4], 1: [634.1, 1003.3] },
{ class: "front", 0: [427.1, 1055.1], 1: [526.1, 1081.6] },
{ class: "front", 0: [635.1, 1110.7], 1: [526.1, 1081.6] },
{ class: "front", 0: [755.5, 1143], 1: [635.1, 1110.7] },
{ class: "front", 0: [777.5, 762.5], 1: [812.7, 729.3] },
{ class: "front", 0: [839.9, 702.5], 1: [812.7, 729.3] },
{ class: "front", 0: [861.3, 681.2], 1: [839.9, 702.5] },
{ class: "front", 0: [851.8, 785.2], 1: [830.3, 816.8] },
{ class: "front", 0: [769, 905.6], 1: [803.5, 856.6] },
{ class: "front", 0: [761.9, 1031.4], 1: [795.4, 970.1] },
{ class: "front", 0: [821.8, 920.3], 1: [795.4, 970.1] },
{ class: "front", 0: [843.2, 880], 1: [821.8, 920.3] },
{ class: "front", 0: [835.1, 967], 1: [813.9, 1014.4] },
{ class: "front", 0: [788, 1072.4], 1: [813.9, 1014.4] },
{ class: "front", 0: [755.5, 1143], 1: [788, 1072.4] },
{ class: "front", 0: [861.3, 681.2], 1: [851.8, 785.2] },
{ class: "front", 0: [839.9, 702.5], 1: [830.3, 816.8] },
{ class: "front", 0: [812.7, 729.3], 1: [803.5, 856.6] },
{ class: "front", 0: [851.8, 785.2], 1: [843.2, 880] },
{ class: "front", 0: [830.3, 816.8], 1: [821.8, 920.3] },
{ class: "front", 0: [803.5, 856.6], 1: [795.4, 970.1] },
{ class: "front", 0: [843.2, 880], 1: [835.1, 967] },
{ class: "front", 0: [821.8, 920.3], 1: [813.9, 1014.4] },
{ class: "front", 0: [795.4, 970.1], 1: [788, 1072.4] },
{ class: "front", 0: [388.7, 720.1], 1: [463.4, 696.9] },
{ class: "front", 0: [522.8, 676.7], 1: [463.4, 696.9] },
{ class: "front", 0: [571.3, 660.3], 1: [522.8, 676.7] },
{ class: "front", 0: [660.2, 666.7], 1: [619.1, 684.6] },
{ class: "front", 0: [568, 706.6], 1: [619.1, 684.6] },
{ class: "front", 0: [503.8, 732.7], 1: [568, 706.6] },
{ class: "front", 0: [632.3, 746.6], 1: [684.1, 717.3] },
{ class: "front", 0: [724.5, 693.1], 1: [684.1, 717.3] },
{ class: "front", 0: [756.5, 673.6], 1: [724.5, 693.1] },
{ class: "front", 0: [571.3, 660.3], 1: [660.2, 666.7] },
{ class: "front", 0: [756.5, 673.6], 1: [660.2, 666.7] },
{ class: "front", 0: [861.3, 681.2], 1: [756.5, 673.6] },
{ class: "front", 0: [839.9, 702.5], 1: [724.5, 693.1] },
{ class: "front", 0: [619.1, 684.6], 1: [724.5, 693.1] },
{ class: "front", 0: [522.8, 676.7], 1: [619.1, 684.6] },
{ class: "front", 0: [812.7, 729.3], 1: [684.1, 717.3] },
{ class: "front", 0: [568, 706.6], 1: [684.1, 717.3] },
{ class: "front", 0: [463.4, 696.9], 1: [568, 706.6] },
{ class: "front", 0: [830.3, 816.8], 1: [803.5, 856.6] },
].map(e => {

[0, 1].map(i => {

let str = e[i] + "";

counters[str] = (counters[str] || 0) + 1;

if(mapping[str]) return e[i] = mapping[str];

mapping[str] = e[i];

return;

});

return e;

}),
};

let discrepancies = Object.assign({}, ...Object.entries(counters).filter(([_,n]) => n !== 4).map(([k,v]) => ({ [k]: v })));

const util = require("util");

if(Object.keys(discrepancies).length) throw util.inspect(discrepancies);

module.exports = data;
13 changes: 10 additions & 3 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ const globby = require("globby");

const fs = require("fs-extra");

router.use(express.static(__dirname + "/static"));
const createLoadPath = require("./createLoadPath.js");

let nextLoadSvg = createLoadPath();

router.get("/js/preloadDependencies.js", async (req, res) => {
let paths = await fs.readdir(__dirname + "/static/js/");

console.log(paths);

paths.sort();

let slicedPaths = paths.map(p => p.slice(0, -3));
Expand All @@ -30,6 +30,13 @@ router.get("/sw.js", async (req, res) => {
res.set("Content-Type", "text/javascript").send(await fs.readFile(__dirname + "/static/" + fileName));
})

router.get("/loading.svg", (req, res) => {
res.set("Content-Type", "image/svg+xml").send(nextLoadSvg);
nextLoadSvg = createLoadPath();
})

router.use(express.static(__dirname + "/static"));

if(require.main === module) {
server.use(router);
server.listen(process.env.PORT || 35452);
Expand Down

0 comments on commit 673c0f4

Please sign in to comment.