File size: 2,144 Bytes
6bda4a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Utilitaires de mapping et calculs de coordonnées
import { getConfig } from '../config/mapConfig.js';

/**
 * Calcule les dimensions de mapping pour les coordonnées UMAP
 * @param {Array} fonts - Array des données de polices
 * @returns {Object} - Objet contenant les fonctions de mapping et les dimensions
 */
export function calculateMappingDimensions(fonts) {
  const xValues = fonts.map(d => d.x);
  const yValues = fonts.map(d => d.y);
  
  const xMin = Math.min(...xValues);
  const xMax = Math.max(...xValues);
  const yMin = Math.min(...yValues);
  const yMax = Math.max(...yValues);

  const offset = getConfig('ui.positions.leva.top', 20); // Utiliser la position de Leva comme offset
  const mapX = (x) => ((x - xMin) / (xMax - xMin)) * (window.innerWidth - 2 * offset) + offset;
  const mapY = (y) => ((yMax - y) / (yMax - yMin)) * (window.innerHeight - 2 * offset) + offset;

  return {
    mapX,
    mapY,
    dimensions: { xMin, xMax, yMin, yMax, offset }
  };
}

/**
 * Génère une transformation SVG pour un glyphe
 * @param {number} x - Coordonnée X
 * @param {number} y - Coordonnée Y
 * @param {number} scale - Facteur d'échelle
 * @returns {string} - Transformation SVG
 */
export function createGlyphTransform(x, y, scale) {
  return `translate(${x}, ${y}) scale(${scale})`;
}

/**
 * Applique une transformation de zoom à une transformation existante
 * @param {string} originalTransform - Transformation originale
 * @param {Object} zoomTransform - Transformation de zoom D3
 * @param {number} baseGlyphSize - Taille de base des glyphes
 * @returns {string} - Nouvelle transformation
 */
export function applyZoomTransform(originalTransform, zoomTransform, baseGlyphSize) {
  const translateMatch = originalTransform.match(/translate\(([^,]+),([^)]+)\)/);
  if (!translateMatch) return zoomTransform;

  const origX = parseFloat(translateMatch[1]);
  const origY = parseFloat(translateMatch[2]);
  
  const newX = zoomTransform.applyX(origX);
  const newY = zoomTransform.applyY(origY);
  const inverseScale = zoomTransform.k;
  
  return `translate(${newX},${newY}) scale(${baseGlyphSize * inverseScale})`;
}