WIP WIP
This commit is contained in:
+48
-4
@@ -3,11 +3,12 @@ import { type Component, createSignal, onMount } from "solid-js";
|
|||||||
import {
|
import {
|
||||||
drawEdge,
|
drawEdge,
|
||||||
drawNode,
|
drawNode,
|
||||||
|
type Edge,
|
||||||
type Graph,
|
type Graph,
|
||||||
type Node,
|
type Node,
|
||||||
type PositionPartial,
|
type PositionPartial,
|
||||||
} from "#/lib/Graph.ts";
|
} from "#/lib/Graph.ts";
|
||||||
import { createVector, type Vector } from "#/lib/Vector.ts";
|
import { createVector, scale, type Vector } from "#/lib/Vector.ts";
|
||||||
|
|
||||||
function drawGraph<T extends PositionPartial>(
|
function drawGraph<T extends PositionPartial>(
|
||||||
graph: Graph<T>,
|
graph: Graph<T>,
|
||||||
@@ -21,10 +22,52 @@ function drawGraph<T extends PositionPartial>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function applyRepulsion(
|
||||||
|
nodes: Array<{ position: Vector; velocity: Vector }>,
|
||||||
|
): void {
|
||||||
|
const strength = 16;
|
||||||
|
|
||||||
|
nodes.forEach((node, index) => {
|
||||||
|
node.velocity = createVector(0, 0);
|
||||||
|
for (let i = 0; i < nodes.length; i++) {
|
||||||
|
if (index === i) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const a = node.position;
|
||||||
|
const b = nodes[i].position;
|
||||||
|
|
||||||
|
const dx = a.x - b.x;
|
||||||
|
const dy = a.y - b.y;
|
||||||
|
|
||||||
|
const direction = createVector(dx, dy);
|
||||||
|
|
||||||
|
const distanceSquare = dx * dx + dy * dy;
|
||||||
|
|
||||||
|
const magnitude = strength / distanceSquare;
|
||||||
|
|
||||||
|
scale(direction, magnitude);
|
||||||
|
|
||||||
|
node.velocity.x += direction.x;
|
||||||
|
node.velocity.y += direction.y;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function doTheHookeThing<T extends { position: Vector; velocity: Vector }>([
|
||||||
|
a,
|
||||||
|
b,
|
||||||
|
]: Edge<T>): void {
|
||||||
|
const edgeLength = 32;
|
||||||
|
const stiffness = 0.8;
|
||||||
|
const displacement = 0;
|
||||||
|
const f = stiffness * displacement;
|
||||||
|
}
|
||||||
|
|
||||||
function placeNodes<T extends PositionPartial>(graph: Graph<T>): void {
|
function placeNodes<T extends PositionPartial>(graph: Graph<T>): void {
|
||||||
const visited: Array<Node<T>> = [];
|
const visited: Array<Node<T>> = [];
|
||||||
const currentPosition = createVector();
|
const currentPosition = createVector();
|
||||||
const radius = 24;
|
const radius = 24;
|
||||||
|
const dist = radius * 1.5;
|
||||||
|
|
||||||
for (const [node, neighbours] of graph.entries()) {
|
for (const [node, neighbours] of graph.entries()) {
|
||||||
if (visited.includes(node)) {
|
if (visited.includes(node)) {
|
||||||
@@ -38,12 +81,13 @@ function placeNodes<T extends PositionPartial>(graph: Graph<T>): void {
|
|||||||
neighbours.forEach((neighbour, index) => {
|
neighbours.forEach((neighbour, index) => {
|
||||||
const fraction = (index + 1) / neighbours.length;
|
const fraction = (index + 1) / neighbours.length;
|
||||||
const rad = Math.PI * 2 * fraction;
|
const rad = Math.PI * 2 * fraction;
|
||||||
neighbour.position.x = currentPosition.x + radius * Math.cos(rad);
|
|
||||||
neighbour.position.y = currentPosition.y + radius * Math.sin(rad);
|
neighbour.position.x = currentPosition.x + dist * Math.cos(rad);
|
||||||
|
neighbour.position.y = currentPosition.y + dist * Math.sin(rad);
|
||||||
visited.push(neighbour);
|
visited.push(neighbour);
|
||||||
});
|
});
|
||||||
|
|
||||||
currentPosition.y += radius * 2;
|
currentPosition.y += dist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-1
@@ -42,13 +42,20 @@ const nodes: Array<TestNode> = [
|
|||||||
{ position: createVector(), label: "hai" },
|
{ position: createVector(), label: "hai" },
|
||||||
{ position: createVector(), label: "sea" },
|
{ position: createVector(), label: "sea" },
|
||||||
{ position: createVector(), label: "vot" },
|
{ position: createVector(), label: "vot" },
|
||||||
|
{ position: createVector(), label: "zoe" },
|
||||||
|
{ position: createVector(), label: "asm" },
|
||||||
];
|
];
|
||||||
|
|
||||||
const edges: Array<Edge<TestNode>> = [
|
const edges: Array<Edge<TestNode>> = [
|
||||||
[nodes[0], nodes[1]],
|
[nodes[0], nodes[1]],
|
||||||
[nodes[0], nodes[2]],
|
[nodes[0], nodes[2]],
|
||||||
[nodes[0], nodes[3]],
|
|
||||||
[nodes[4], nodes[5]],
|
[nodes[4], nodes[5]],
|
||||||
|
[nodes[5], nodes[3]],
|
||||||
|
[nodes[1], nodes[2]],
|
||||||
|
[nodes[0], nodes[3]],
|
||||||
|
[nodes[2], nodes[6]],
|
||||||
|
[nodes[5], nodes[7]],
|
||||||
|
[nodes[5], nodes[6]],
|
||||||
];
|
];
|
||||||
|
|
||||||
const graph = createGraph<TestNode>(nodes, edges);
|
const graph = createGraph<TestNode>(nodes, edges);
|
||||||
|
|||||||
@@ -29,6 +29,13 @@ export function getDistance(a: Vector, b: Vector): number {
|
|||||||
return Math.sqrt(dx * dx + dy * dy);
|
return Math.sqrt(dx * dx + dy * dy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getDistanceSquared(a: Vector, b: Vector): number {
|
||||||
|
const dx = a.x - b.x;
|
||||||
|
const dy = a.y - b.y;
|
||||||
|
|
||||||
|
return dx * dx + dy * dy;
|
||||||
|
}
|
||||||
|
|
||||||
export function getSquared(vector: Vector): number {
|
export function getSquared(vector: Vector): number {
|
||||||
return vector.x * vector.x + vector.y * vector.y;
|
return vector.x * vector.x + vector.y * vector.y;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user