Mercurial > personal > weather-server
annotate weather_server/static/script.js @ 15:df3e0534c994
Tighten up MADRegistry:
- Use only one map for registry.
- Make the user construct it,
to avoid modifying global state.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Fri, 11 Oct 2019 20:50:50 -0400 |
parents | 4eaa9d69c4e2 |
children |
rev | line source |
---|---|
12
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
1 'use strict'; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
2 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
3 /** |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
4 * Converts Celsius to Fahrenheit. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
5 * @param {number} tempC |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
6 * @return {number} The temperature in Fahrenheit. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
7 */ |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
8 function cToF(tempC) { |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
9 return tempC * 9 / 5 + 32; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
10 } |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
11 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
12 const MAGNUS_B = 17.62; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
13 const MAGNUS_C = 243.12; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
14 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
15 /** |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
16 * The gamma function to calculate dew point. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
17 * |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
18 * @param {number} tempC The temperature, in degrees Celsius. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
19 * @param {number} rhPct The relative humidity, in percent. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
20 * @return {number} The value of the gamma function. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
21 */ |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
22 function gammaFn(tempC, rhPct) { |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
23 return Math.log(rhPct / 100) + MAGNUS_B * tempC / (MAGNUS_C + tempC); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
24 } |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
25 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
26 /** |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
27 * Calculates the dew point. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
28 * |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
29 * @param {number} tempC The temperature, in degrees Celsius. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
30 * @param {number} rhPct The relative humidity, in percent. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
31 * @return {number} The dew point, in degrees Celsius. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
32 */ |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
33 function dewPointC(tempC, rhPct) { |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
34 const gamma = gammaFn(tempC, rhPct); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
35 return MAGNUS_C * gamma / (MAGNUS_B - gamma); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
36 } |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
37 |
13
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
38 const HISTORY_SECONDS = 86400; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
39 |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
40 /** |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
41 * Sets up everything. |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
42 * @param {HTMLElement} tempElement The element where temperature data is. |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
43 * @param {HTMLElement} dewPointElement The element where the dew point is. |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
44 */ |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
45 async function setUp(tempElement, dewPointElement) { |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
46 const nowTS = new Date().getTime() / 1000; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
47 const startTS = nowTS - HISTORY_SECONDS; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
48 const query = new URL(location.href); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
49 query.pathname = query.pathname + '/recent'; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
50 query.search = ''; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
51 query.searchParams.set('seconds', String(HISTORY_SECONDS)); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
52 const results = await fetch(query.href); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
53 if (!results.ok) return; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
54 const data = await results.json(); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
55 if (data.length === 0) return; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
56 |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
57 const tempsF = data.map(s => [s.sample_time, cToF(s.temp_c)]); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
58 const dewPointsF = data.map( |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
59 s => [s.sample_time, cToF(dewPointC(s.temp_c, s.rh_pct))]); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
60 setUpElement(tempElement, [startTS, nowTS], tempsF); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
61 setUpElement(dewPointElement, [startTS, nowTS], dewPointsF); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
62 } |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
63 |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
64 /** |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
65 * Sets up charting for this element. |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
66 * @param {HTMLElement} element The element to put a graph in. |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
67 * @param {[number, number]} timeRange The `[start, end]` of the time range. |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
68 * @param {[number, number][]} data The data to chart. |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
69 */ |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
70 function setUpElement(element, timeRange, data) { |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
71 element.insertBefore(document.createElement('canvas'), element.firstChild); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
72 element.classList.remove('plain'); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
73 element.classList.add('fancy'); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
74 const doDraw = () => redrawCanvas(element, data, timeRange); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
75 doDraw(); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
76 addEventListener('resize', doDraw); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
77 } |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
78 |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
79 /** |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
80 * |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
81 * @param {HTMLElement} element The parent element to put the `<canvas>` in. |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
82 * @param {[number, number][]} data The data to chart. |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
83 * @param {[number, number]} xRange The `[start, end]` of the X range to plot. |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
84 */ |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
85 function redrawCanvas(element, data, xRange) { |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
86 let canvas = element.getElementsByTagName('canvas')[0]; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
87 if (!canvas) { |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
88 canvas = document.createElement('canvas'); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
89 element.insertBefore(canvas, element.firstChild); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
90 } |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
91 const dpr = window.devicePixelRatio || 1; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
92 const cssSize = element.getBoundingClientRect(); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
93 const pxSize = [cssSize.width * dpr, cssSize.height * dpr]; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
94 canvas.width = pxSize[0]; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
95 canvas.height = pxSize[1]; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
96 const ctx = canvas.getContext('2d'); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
97 ctx.clearRect(0, 0, pxSize[0], pxSize[1]); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
98 const computed = getComputedStyle(element); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
99 ctx.strokeStyle = computed.color; |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
100 drawChart(ctx, data, xRange, pxSize); |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
101 } |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
102 |
12
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
103 /** The height of the chart in degrees. */ |
13
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
104 const CHART_RANGE_DEGREES = 15; |
12
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
105 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
106 /** |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
107 * Charts some data. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
108 * |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
109 * @param {CanvasRenderingContext2D} ctx The context to draw in. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
110 * @param {[number, number][]} data The data to chart, as `[x, y]` pairs. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
111 * @param {[number, number]} xRange The bounds of the X axis to draw. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
112 * @param {[number, number]} size The `[width, height]` of the context. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
113 */ |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
114 function drawChart(ctx, data, xRange, size) { |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
115 const yRange = calculateYRange(data.map(d => d[1])); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
116 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
117 ctx.lineWidth = 1.5; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
118 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
119 ctx.beginPath(); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
120 const first = project(data[0], size, xRange, yRange); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
121 ctx.moveTo(...first); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
122 for (const pt of data) { |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
123 const projected = project(pt, size, xRange, yRange); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
124 ctx.lineTo(...projected); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
125 } |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
126 ctx.stroke(); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
127 } |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
128 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
129 /** |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
130 * Determines what the Y range of the chart should be. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
131 * @param {number[]} ys The Y values of the chart. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
132 * @return {[number, number]} The lowest and highest values of the range. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
133 */ |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
134 function calculateYRange(ys) { |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
135 const yMax = Math.max(...ys); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
136 const yMin = Math.min(...ys); |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
137 const yMid = (yMin + yMax) / 2; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
138 const lastY = ys[ys.length - 1]; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
139 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
140 // We want the last value to be, at most, at the top or bottom 1/4 line |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
141 // of the chart. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
142 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
143 // If the middle of the range is already close enough, just use that. |
13
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
144 if (CHART_RANGE_DEGREES / 4 <= Math.abs(yMid - lastY)) { |
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
145 return [yMid - CHART_RANGE_DEGREES / 2, yMid + CHART_RANGE_DEGREES / 2]; |
12
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
146 } |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
147 // Otherwise, clamp the chart range. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
148 if (lastY < yMid) { |
13
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
149 return [lastY - CHART_RANGE_DEGREES / 4, lastY + 3 * CHART_RANGE_DEGREES / 4]; |
12
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
150 } |
13
4eaa9d69c4e2
Extremely basic version of the graph drawer.
Paul Fisher <paul@pfish.zone>
parents:
12
diff
changeset
|
151 return [lastY - 3 * CHART_RANGE_DEGREES / 4, lastY + CHART_RANGE_DEGREES / 4]; |
12
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
152 } |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
153 |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
154 /** |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
155 * Projects a Cartesian coordinate into Canvas space. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
156 * |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
157 * @param {[number, number]} coord The `[x, y]` coordinate to project. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
158 * @param {[number, number]} size The `[width, height]` of the context. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
159 * @param {[number, number]} xRange The range of X values in the context. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
160 * @param {[number, number]} yRange The range of Y values in the context. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
161 * @return {[number, number]} The `[x, y]` coordinate in Canvas space. |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
162 */ |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
163 function project(coord, size, xRange, yRange) { |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
164 const [x, y] = coord; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
165 const [xMin, xMax] = xRange; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
166 const xSpan = xMax - xMin; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
167 const [yMin, yMax] = yRange; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
168 const ySpan = yMax - yMin; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
169 const [xSize, ySize] = size; |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
170 return [ |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
171 (x - xMin) / xSpan * xSize, |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
172 (yMax- y) / ySpan * ySize, |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
173 ] |
9e6289598d8c
Add script to draw charts with initial functions.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
174 } |