2026-06-01 08:40:23 +02:00

43 lines
1.5 KiB
JavaScript

// scoring.js - accuracy calculation
/**
* Calculate a score from the drawn path points.
* NOTE: Currently uses an effort-based approximation.
* TODO: Replace with real polygon comparison (IoU or Hausdorff distance).
* @param {{ x: number, y: number }[]} drawnPoints
* @returns {number} Score between 0 and 100.
*/
export function calculateScore(drawnPoints) {
if (!drawnPoints || drawnPoints.length < 10) return 0;
const effort = Math.min(drawnPoints.length / 300, 1); // 0-1
const base = 40 + Math.round(effort * 45); // 40-85
const jitter = Math.round((Math.random() - 0.5) * 14); // +/-7
return Math.max(0, Math.min(100, base + jitter));
}
/**
* Compare a drawn polygon against a reference polygon.
* Stub - reserved for future IoU / Hausdorff implementation.
* @param {{ x: number, y: number }[]} _drawnPoints
* @param {{ x: number, y: number }[]} _referencePolygon - Normalised 0-1 coords.
* @returns {number} Score between 0 and 100.
*/
export function compareShapes(_drawnPoints, _referencePolygon) {
// TODO: implement real shape comparison
return 0;
}
/**
* Map a numeric score to a letter grade with colour.
* @param {number} score
* @returns {{ label: string, color: string }}
*/
export function getGrade(score) {
if (score >= 90) return { label: "S", color: "#f0b429" };
if (score >= 75) return { label: "A", color: "#41b869" };
if (score >= 60) return { label: "B", color: "#1a7fc4" };
if (score >= 40) return { label: "C", color: "#7a9aaa" };
return { label: "D", color: "#e05c5c" };
}