// @ts-check
//
import { css, DJElement, h, html, qs } from "./util";
class HalfLifeGraph extends DJElement {
static styles = css`
.container {
margin: auto;
text-align: center;
}
canvas {
border: solid 1px black;
}
`;
static template = html`
`;
/** @type number */
height = 480;
/** @type number */
width = 640;
/** @type HTMLInputElement */
input1;
/** @type number */
input1Value;
/** @type Function */
renderCb;
constructor() {
super();
const canvas = /** @type HTMLCanvasElement */ (qs("canvas", this.root));
this.input1 = /** @type HTMLInputElement */ (qs("input", this.root));
canvas.width = this.width;
canvas.height = this.height;
const context = canvas.getContext("2d");
if (!context) {
throw new Error("No context available");
}
this.renderCb = () => {
window.requestAnimationFrame(() => this.renderFrame(context));
};
this.input1.addEventListener("input", (e) => {
this.input1Value = /** @type HTMLInputElement */ (e.target).valueAsNumber;
this.renderCb();
});
this.renderCb();
}
/**
* @param {CanvasRenderingContext2D} ctx
*/
renderFrame(ctx) {
this.drawAxes(ctx);
this.drawGrid(ctx);
this.drawCurve(ctx);
}
/**
* @param {CanvasRenderingContext2D} ctx
*/
drawAxes(ctx) {
const startY = 0;
const endY = 10;
const startX = 0;
const endX = 10;
ctx.beginPath();
ctx.moveTo(startX, this.height - startY);
ctx.lineTo(startX, this.height - endY);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(startX, this.height - startY);
ctx.lineTo(endX, this.height - startY);
ctx.stroke();
}
/**
* @param {CanvasRenderingContext2D} ctx
*/
drawGrid(ctx) {
/**
const step = this.width / V0D
for (let i = 0; i < thing; i++) {
ctx.beginPath();
ctx.moveTo(i, );
ctx.lineTo(i);
}
*/
}
/**
* @param {CanvasRenderingContext2D} ctx
*/
drawCurve(ctx) {
// A = A_0 * (1/2) ^ t / h
// h = half life
// t = point in time
// A_0 = initial
// A = current concentration
// TODO
// https://pharmacy.ufl.edu/files/2013/01/5127-28-equations.pdf
/**
* @param {number} x
*/
function y(x) {
return x ** 2;
}
const xEnd = 2;
const yEnd = 2;
const samples = 100;
const step = this.width / samples;
ctx.beginPath();
ctx.moveTo(0, this.height);
for (let i = 0; i < this.width; i += step) {
ctx.lineTo(i, this.height - y(i / this.width * xEnd) * this.height / yEnd);
}
ctx.stroke();
}
}
customElements.define("half-life-graph", HalfLifeGraph);