AETHER Engine
Analisi del motore di calcolo vettoriale e relazionale. Aether gestisce la complessità spaziale attraverso algoritmi di geometria computazionale e ottimizzazione vincolata.
Spatial Intelligence Engine
Il cuore geometrico di Aether opera in uno spazio cartesiano virtuale dove l'unità di misura fondamentale è il centimetro (cm). Il sistema gestisce la trasformazione tra il mondo reale e la rappresentazione a schermo tramite una pipeline di calibrazione dinamica.
Trasforma i metadati della planimetria raster in un ambiente metrico. Calcola il coefficiente cmPerPixel analizzando il vettore euclideo tra due punti definiti dall'utente.
Esegue uno stress-test spaziale su ogni oggetto. La funzione campiona 5 punti critici (vertici + baricentro) e verifica la loro appartenenza al set di poligoni roomPaths, garantendo che nessun elemento "esca" dal perimetro dell'evento.
Collision Logic (SAT Implementation)
Per gestire la rotazione arbitraria dei tavoli, Aether implementa il Separating Axis Theorem (SAT). Invece di semplici Bounding Box (AABB), il motore proietta i vertici delle entità su assi normali per rilevare overlap millimetrici.
// Algoritmo di proiezione e rilevamento collisione function polygonsCollide(pts1, pts2, minGap) { const axes = getNormalAxes(pts1).concat(getNormalAxes(pts2)); for (let axis of axes) { const p1 = project(pts1, axis); const p2 = project(pts2, axis); if (!overlap(p1, p2, minGap)) return false; } return true; }
Parametri Critici di Collisione:
| Costante | Valore | Descrizione |
|---|---|---|
TABLE_MIN_GAP | 100cm | Spazio minimo tra i bordi dei tavoli |
WALL_CLEARANCE | 50cm | Buffer di sicurezza per il passaggio dei camerieri |
SEAT_RAD | 30cm | Raggio di ingombro calcolato per ogni seduta |
Table Entity Schema
L'entità Table non è un semplice asset grafico, ma un contenitore complesso di proprietà fisiche e stati di occupazione.
{
name: string, // ID univoco (es. "Tavolo 12")
x, y: float, // Coordinate World-Space in cm
config: {
forma: enum, // round | rect | semi | main_table
w_cm: int, // Larghezza/Diametro
h_cm: int, // Profondità
rotazione: float, // Angolo di rotazione in gradi
optimize55: bool // Pitch sedute ridotto (55cm vs 60cm)
},
guests: Array<Guest> // Slot mappati in base alla forma
}
Guest Entity Schema
Ogni ospite è trattato come un'entità relazionale atomica definita da vincoli di attrazione (Link) e repulsione (Avoid).
{
uid: string, // Identificatore univoco globale
n, ln: string, // Nome e Cognome
colorTag: hex, // Gruppo sociale di appartenenza
linkedGroupId: string, // UID per prossimità forzata (📎)
avoidGuestUids: array, // UIDs per repulsione sociale (⛔)
confirmStatus: enum, // confirmed | pending | declined
ageRange: string, // bambino | ragazzo | adulto | senior
menuType: string, // standard | vegan | glutenfree...
cateringNote: text // Allergie e intolleranze (Allerta PDF)
}
Heuristic Optimization (The 🪄 Logic)
L'assegnazione dei posti è un problema di ottimizzazione combinatoria. Aether utilizza un'euristica "Greedy with Rebalancing" basata su una Scoring Matrix. Ogni sedia riceve un punteggio dinamico che riflette l'affinità dell'ospite con il contesto circostante.
| Fattore Relazionale | Punteggio (Bias) | Logica Algoritmica |
|---|---|---|
| Link Partner | +125.000 | Forza la vicinanza assoluta (distanza euclidea < 95cm). |
| VIP Hierarchy | +800.000 | Ancoraggio prioritario ai tavoli di tipo main_table. |
| Avoid Rule (⛔) | -9.000 | Repulsione poligonale per UID presenti in avoidGuestUids. |
| Color Affinity | +500 | Incentiva raggruppamenti per colorTag (es. team, famiglie). |
| Age Balancing | +165 | Bias di coerenza tra fasce d'età (bambini con bambini). |
Rendering Pipeline & Methods
La pipeline di rendering è costruita su un ciclo ad alta frequenza che utilizza requestAnimationFrame. Il disegno è puramente procedurale (vettoriale), garantendo nitidezza a qualsiasi livello di zoom.
Il metodo principale di disegno. Implementa una logica di rotazione locale (ctx.rotate) e calcola dinamicamente la curvatura dei nomi degli invitati lungo il perimetro del tavolo.
Disegna i confini delle aree supportando curve di Bézier quadratiche. Gestisce il riempimento con gradienti radiali per dare profondità allo spazio.
Rendering di micro-elementi vettoriali. Disegna l'icona VIP sopra la seduta occupata, utilizzando coordinate locali relative al centro del tavolo.
Camera Projection System
Aether utilizza un modello di camera virtuale per separare lo spazio dei dati (World) dallo spazio dei pixel (Screen).
// Conversione Screen -> World (Cruciale per il Drag & Drop) function screenToWorld(clientX, clientY) { return { x: (clientX - camera.x) / camera.zoom, y: (clientY - camera.y) / camera.zoom }; }
Proprietà della Camera:
- Zoom Range: 0.1x a 5.0x (Precisione sub-millimetrica).
- Panning: Implementato tramite traslazione matriciale dell'origine del Canvas.
- Layering: L'engine disegna in ordine (FloorPlan → Grid → Areas → Objects → Overlays) per gestire correttamente le trasparenze.