| const canvas = document.getElementById("polyCanvas");
|
| const ctx = canvas.getContext("2d");
|
|
|
| const X_data = [1, 2, 3, 4, 5];
|
| const y_data = [3, 8, 15, 24, 35];
|
|
|
| function toCanvasX(x, xScale, padding) {
|
| return padding + x * xScale;
|
| }
|
|
|
| function toCanvasY(y, yScale, padding, canvasHeight) {
|
| return canvasHeight - padding - y * yScale;
|
| }
|
|
|
| function setupAndDraw(predX = null, predY = null) {
|
| const padding = 50;
|
| const canvasWidth = canvas.width = canvas.clientWidth;
|
| const canvasHeight = canvas.height = canvas.clientHeight;
|
|
|
| const xMax = 6;
|
| const yMax = 40;
|
|
|
| const xScale = (canvasWidth - 2 * padding) / xMax;
|
| const yScale = (canvasHeight - 2 * padding) / yMax;
|
|
|
|
|
| ctx.clearRect(0, 0, canvasWidth, canvasHeight);
|
|
|
|
|
| ctx.beginPath();
|
| ctx.moveTo(padding, toCanvasY(0, yScale, padding, canvasHeight));
|
| ctx.lineTo(canvasWidth - padding, toCanvasY(0, yScale, padding, canvasHeight));
|
| ctx.moveTo(toCanvasX(0, xScale, padding), padding);
|
| ctx.lineTo(toCanvasX(0, xScale, padding), canvasHeight - padding);
|
| ctx.strokeStyle = "#475569";
|
| ctx.stroke();
|
|
|
|
|
| ctx.fillStyle = "#3b82f6";
|
| X_data.forEach((x, i) => {
|
| ctx.beginPath();
|
| ctx.arc(toCanvasX(x, xScale, padding), toCanvasY(y_data[i], yScale, padding, canvasHeight), 5, 0, 2 * Math.PI);
|
| ctx.fill();
|
| });
|
|
|
|
|
| ctx.beginPath();
|
| ctx.moveTo(toCanvasX(0, xScale, padding), toCanvasY(0, yScale, padding, canvasHeight));
|
| for (let x = 0; x <= xMax; x += 0.1) {
|
| const y = x * x + 2 * x;
|
| ctx.lineTo(toCanvasX(x, xScale, padding), toCanvasY(y, yScale, padding, canvasHeight));
|
| }
|
| ctx.strokeStyle = "#ef4444";
|
| ctx.lineWidth = 2;
|
| ctx.stroke();
|
|
|
|
|
| if (predX !== null && predY !== null) {
|
| ctx.fillStyle = "#22c55e";
|
| ctx.beginPath();
|
| ctx.arc(toCanvasX(predX, xScale, padding), toCanvasY(predY, yScale, padding, canvasHeight), 6, 0, 2 * Math.PI);
|
| ctx.fill();
|
| }
|
| }
|
|
|
|
|
| function predict() {
|
| const hours = parseFloat(document.getElementById("hoursInput").value);
|
| fetch("/predict_poly", {
|
| method: "POST",
|
| body: JSON.stringify({ hours }),
|
| headers: {
|
| "Content-Type": "application/json"
|
| }
|
| })
|
| .then(res => res.json())
|
| .then(data => {
|
| const score = data.prediction;
|
| document.getElementById("predictedScore").textContent = score;
|
| document.getElementById("predictionOutput").classList.remove("hidden");
|
| setupAndDraw(hours, score);
|
| });
|
| }
|
|
|
| window.onload = () => setupAndDraw();
|
|
|