summaryrefslogtreecommitdiff
path: root/src/nodes/Plot.tsx
blob: fbec1f438d2e73e1e7408d2d710a66999ff10f47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import { NodeShell, InputAny, InputNumber, NodeComponentProps, NodeInfo } from '../node.tsx';

export interface PlotInputs {
	data: any;
	minX: number;
	minY: number;
	maxX: number;
	maxY: number;
}

export interface PlotOutputs {}

export const Plot = ({ id, x, y, inputs }: NodeComponentProps<PlotInputs>) => {
	const data = inputs.data.value;
	const width = 400;
	const height = 400;
	const dx = inputs.maxX.value - inputs.minX.value;
	const dy = inputs.maxY.value - inputs.minY.value;

	let path = '';
	if (data !== null && data.length > 3) {
		for (let i = 0; i < data.length; i += Math.max(2, Math.floor(data.length / 1000))) {
			if (i >= data.length) break;
			const X = (data[i] - inputs.minX.value) / dx * width;
			const Y = height - (data[i+1] - inputs.minY.value) / dy * height;
			path += (i ? 'L' : 'M') + X + ' ' + Y;
		}
	}
	//alert(dx);
	return (
		<NodeShell name="Plot" id={id} x={x} y={y}>
			<InputAny name="data" label="Data" />
			<InputNumber name="minX" label="Min X" value={inputs.minX} />
			<InputNumber name="minY" label="Min Y" value={inputs.minY} />
			<InputNumber name="maxX" label="Max X" value={inputs.maxX} />
			<InputNumber name="maxY" label="Max Y" value={inputs.maxY} />
			<li>
				<svg width={width} height={height} style="background-color:white;margin:4px 8px 0 8px;">
					<path fill="none" stroke="blue" stroke-width="2" d={path} />
				</svg>
			</li>
		</NodeShell>
	);
};

export const PlotNode: NodeInfo<PlotInputs, PlotOutputs> = {
	component: Plot,
	func: () => ({}),
	inputs: { data: null, minX: -10, minY: -10, maxX: 10, maxY: 10 },
};