Width & Height are props, and movement-paths animate in
This commit is contained in:
parent
211792acdb
commit
070c3ef848
2 changed files with 91 additions and 30 deletions
114
src/Viz.svelte
114
src/Viz.svelte
|
@ -1,11 +1,39 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import parsed_requests from "/data/parsed_requests.json";
|
import parsed_requests from "/data/parsed_requests.json";
|
||||||
|
|
||||||
$: console.log(parsed_requests);
|
import { draw } from "svelte/transition";
|
||||||
|
|
||||||
// TODO: pass these from main.ts (or vice versaas)
|
// these are passed from main.ts (or vice versaas)
|
||||||
const width = 2160;
|
export let width = 0;
|
||||||
const height = 3840;
|
export let height = 0;
|
||||||
|
|
||||||
|
const node_positions_percentages = {
|
||||||
|
APM: [13.829853909464873, 11.277305564859935],
|
||||||
|
IWO: [82.20349794238683, 92.52914963452248],
|
||||||
|
BC: [13.829853909464873, 10.235638898193269],
|
||||||
|
ARTIS: [37.36555349794344, 14.373622178489617],
|
||||||
|
BHBPU: [18.895388888889407, 8.009932889956616],
|
||||||
|
CEDLA: [32.88047119341627, 21.36735134591498],
|
||||||
|
UBGW: [7.420491769548115, 13.544746441851984],
|
||||||
|
IVIR: [33.838187242798554, 17.768099884380575],
|
||||||
|
OTM: [80.81460905349795, 93.83123296785581],
|
||||||
|
JB: [34.30115020576152, 19.538933217713907],
|
||||||
|
REC: [32.38571810699577, 16.229534855698518],
|
||||||
|
AMC: [81.82347530864213, 90.12737486852306],
|
||||||
|
PCHH: [10.320697530863542, 3.927002725110166],
|
||||||
|
BETA: [78.14333127572034, 26.257884003417413],
|
||||||
|
UBB: [10.198269547325893, 16.40932977518532],
|
||||||
|
};
|
||||||
|
|
||||||
|
const node_positions = Object.fromEntries(
|
||||||
|
Object.entries(node_positions_percentages).map(([k, p]) => [
|
||||||
|
k,
|
||||||
|
[(p[0] / 100) * width, (p[1] / 100) * height],
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
$: console.log(parsed_requests);
|
||||||
|
|
||||||
// preprocess data
|
// preprocess data
|
||||||
const nodes = parsed_requests.nodes;
|
const nodes = parsed_requests.nodes;
|
||||||
|
@ -16,29 +44,31 @@
|
||||||
const valid_nodes = nodes
|
const valid_nodes = nodes
|
||||||
.filter((n) => n.lat && n.lon)
|
.filter((n) => n.lat && n.lon)
|
||||||
.map((node) => {
|
.map((node) => {
|
||||||
// const { x: x1, y: y1 } = latLonToOffsets(node.lat, node.lon, 100000, 100000)
|
node["x"] = node_positions[node.code][0];
|
||||||
const { x: x1, y: y1 } = latLonToOffsets(
|
node["y"] = node_positions[node.code][1];
|
||||||
node.lat,
|
// const { x: x1, y: y1 } = latLonToOffsets(
|
||||||
node.lon,
|
// node.lat,
|
||||||
100000,
|
// node.lon,
|
||||||
100000,
|
// 100000,
|
||||||
);
|
// 100000,
|
||||||
console.log(x1, y1);
|
// );
|
||||||
const x2 = inverse_lerp(1358, 1380, x1);
|
// console.log(x1, y1);
|
||||||
const y2 = inverse_lerp(32862, 32900, y1);
|
// const x2 = inverse_lerp(1358, 1380, x1);
|
||||||
|
// const y2 = inverse_lerp(32862, 32900, y1);
|
||||||
|
|
||||||
const margin = 200;
|
// const margin = 200;
|
||||||
const x = x2 * (width - 2 * margin) + margin;
|
// const x = x2 * (width - 2 * margin) + margin;
|
||||||
const y = y2 * (height - 2 * margin) + margin;
|
// const y = y2 * (height - 2 * margin) + margin;
|
||||||
// console.log(x2, y2)
|
// // console.log(x2, y2)
|
||||||
// console.log(node)
|
// // console.log(node)
|
||||||
|
|
||||||
node["x"] = x;
|
// node["x"] = x;
|
||||||
node["y"] = y;
|
// node["y"] = y;
|
||||||
return node;
|
return node;
|
||||||
});
|
});
|
||||||
|
|
||||||
// create an index to access the node objects by their name
|
// create an index to access the node objects by their name
|
||||||
|
|
||||||
const nodeMap = Object.fromEntries(valid_nodes.map((d) => [d["name"], d]));
|
const nodeMap = Object.fromEntries(valid_nodes.map((d) => [d["name"], d]));
|
||||||
const edgeIndexBarcode = buildIndex(edges, "Barcode");
|
const edgeIndexBarcode = buildIndex(edges, "Barcode");
|
||||||
// console.log(edgeIndexBarcode);
|
// console.log(edgeIndexBarcode);
|
||||||
|
@ -56,7 +86,7 @@
|
||||||
return l;
|
return l;
|
||||||
});
|
});
|
||||||
|
|
||||||
function degreesToRadians(degrees) {
|
function degreesToRadians(degrees: number) {
|
||||||
return (degrees * Math.PI) / 180;
|
return (degrees * Math.PI) / 180;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,7 +106,7 @@
|
||||||
return { x, y };
|
return { x, y };
|
||||||
}
|
}
|
||||||
|
|
||||||
function lerp(X, Y, t) {
|
function lerp(X: number, Y: number, t: number) {
|
||||||
return X * t + Y * (1 - t);
|
return X * t + Y * (1 - t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +178,7 @@
|
||||||
|
|
||||||
// find radius of arc based on distance between points
|
// find radius of arc based on distance between points
|
||||||
// add a jitter to spread out the lines when links are stacked
|
// add a jitter to spread out the lines when links are stacked
|
||||||
const dr = Math.sqrt(dx * dx + dy * dy) * (0.7 + Math.random() * 0.6);
|
const dr = Math.sqrt(dx * dx + dy * dy) * (0.7 + Math.random() * 0.5);
|
||||||
|
|
||||||
// "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y
|
// "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y
|
||||||
return `M ${m.sourceX},${m.sourceY} A ${dr},${dr} 0 0,1 ${m.targetX},${m.targetY}`;
|
return `M ${m.sourceX},${m.sourceY} A ${dr},${dr} 0 0,1 ${m.targetX},${m.targetY}`;
|
||||||
|
@ -156,7 +186,30 @@
|
||||||
|
|
||||||
console.log(movements);
|
console.log(movements);
|
||||||
|
|
||||||
let drawn_movements = movements;
|
let drawn_movements = movements; //.filter((m, i) => i < 100);
|
||||||
|
|
||||||
|
import { onMount, onDestroy } from "svelte";
|
||||||
|
let paused = false;
|
||||||
|
onMount(() => {
|
||||||
|
let interval = null;
|
||||||
|
|
||||||
|
interval = setInterval(() => {
|
||||||
|
if (paused) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// TODO: change scene
|
||||||
|
// timeElapsed += 1;
|
||||||
|
|
||||||
|
// if (remainingTime === 0) {
|
||||||
|
// clearInterval(interval);
|
||||||
|
// deleteTimer();
|
||||||
|
// }
|
||||||
|
}, 10000);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
clearInterval(interval);
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<h1>library of <span id="motiontitle">motions</span></h1>
|
<h1>library of <span id="motiontitle">motions</span></h1>
|
||||||
|
@ -169,7 +222,10 @@
|
||||||
<svg {width} {height}>
|
<svg {width} {height}>
|
||||||
<g id="movements">
|
<g id="movements">
|
||||||
{#each drawn_movements as m}
|
{#each drawn_movements as m}
|
||||||
<path d={get_path_d(m)}></path>
|
<path
|
||||||
|
in:draw|global={{ duration: 5000 + Math.random() * 10000 }}
|
||||||
|
d={get_path_d(m)}
|
||||||
|
></path>
|
||||||
{/each}
|
{/each}
|
||||||
</g>
|
</g>
|
||||||
<g id="libraries">
|
<g id="libraries">
|
||||||
|
@ -177,14 +233,12 @@
|
||||||
<g id={node.code} transform="translate({node.x}, {node.y})">
|
<g id={node.code} transform="translate({node.x}, {node.y})">
|
||||||
<circle r="5"></circle>
|
<circle r="5"></circle>
|
||||||
<circle r="20"></circle>
|
<circle r="20"></circle>
|
||||||
<text class="nodeTitle" y="4" x="35">{node.name}</text>
|
<text class="nodeTitle" y="13" x="35">{node.name}</text>
|
||||||
</g>
|
</g>
|
||||||
{/each}
|
{/each}
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
#about {
|
#about {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
@ -204,7 +258,7 @@
|
||||||
stroke-width: 10;
|
stroke-width: 10;
|
||||||
}
|
}
|
||||||
path {
|
path {
|
||||||
stroke: #bc89ff10;
|
stroke: #bc89ff15;
|
||||||
stroke-width: 2px;
|
stroke-width: 2px;
|
||||||
fill: none;
|
fill: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,14 @@ document.getElementById('canvas')!.style.width = `${width}px`;
|
||||||
document.getElementById('canvas')!.style.height = `${height}px`;
|
document.getElementById('canvas')!.style.height = `${height}px`;
|
||||||
|
|
||||||
const app = new Viz({
|
const app = new Viz({
|
||||||
|
// see https://svelte.dev/docs/client-side-component-api
|
||||||
target: document.getElementById('viz')!,
|
target: document.getElementById('viz')!,
|
||||||
|
props: {
|
||||||
|
width: width,
|
||||||
|
height: height
|
||||||
|
},
|
||||||
|
// intro: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
export default app
|
export default app
|
||||||
|
|
Loading…
Reference in a new issue