gestion_table_tournante_libre/test/bandes.js

57 lines
2.6 KiB
JavaScript
Raw Normal View History

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// L'épreuve des bandes, partagée par les épreuves de la géométrie des tables
// et du mobilier : une liste de noms passe-t-elle sur une autre table ? Le
// calcul est écrit ici à part de listeSurTable (src/geometrie/tables.js),
// qu'il éprouve : seule la hauteur de ligne supposée vient du module, une
// valeur et non un calcul.
import { constante } from '../src/geometrie/constantes.js';
import { HAUTEUR_LIGNE_SUPPOSEE, geometrieTable } from '../src/geometrie/tables.js';
export { HAUTEUR_LIGNE_SUPPOSEE };
/**
* Les fautes « une liste passe sur une autre table » d'un ensemble de tables
* posées : pour chaque paire ordonnée, la bande du bloc de noms de la
* première — LARGEUR_BLOC_NOMS_CM de large depuis origineListe, places + 1
* lignes de HAUTEUR_LIGNE_SUPPOSEE, en-tête d'une table gelée compris —
* recoupe le carré d'emprise de la seconde, bords exclus.
*
* @param {Array<{id?: number, position: {x: number, y: number}, forme: 'ronde'|'carree', places: number}>} posees
* id, l'identifiant de la table ; son rang compté depuis 1 quand il manque
* @param {{avec?: number|null}} [options] avec : seules les paires où figure
* la table de cet identifiant sont examinées
* @returns {{fautes: string[], paires: number}} les fautes, et le nombre de
* paires examinées
*/
export function fautesBandes(posees, { avec = null } = {}) {
const largeur = constante('LARGEUR_BLOC_NOMS_CM');
const geometries = posees.map(({ id, position, forme, places }, rang) => ({
g: geometrieTable({ id: id ?? rang + 1, numero: rang + 1, forme, position }, places),
places,
}));
const fautes = [];
let paires = 0;
for (const { g, places } of geometries) {
const bande = {
gauche: g.origineListe.x,
droite: g.origineListe.x + largeur,
haut: g.origineListe.y,
bas: g.origineListe.y + (places + 1) * HAUTEUR_LIGNE_SUPPOSEE,
};
for (const { g: autre } of geometries) {
if (autre === g || (avec !== null && g.id !== avec && autre.id !== avec)) continue;
paires += 1;
const e = autre.rayonEmprise;
const recoupe =
autre.centre.x + e > bande.gauche &&
autre.centre.x - e < bande.droite &&
autre.centre.y + e > bande.haut &&
autre.centre.y - e < bande.bas;
if (recoupe) fautes.push(`bloc de la table ${g.id} (${g.centre.x}, ${g.centre.y}) sur la table ${autre.id} (${autre.centre.x}, ${autre.centre.y})`);
}
}
return { fautes, paires };
}