convert.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. const jab2hex = jab => d3.jab(...jab).formatHex();
  2. const rgb2hex = rgb => d3.rgb(...rgb).formatHex();
  3. const jab2hue = ([, a, b]) => rad2deg * Math.atan2(b, a);
  4. const rgb2hue = rgb => d3.hsl(d3.rgb(...rgb)).h || 0;
  5. const jab2lit = ([j]) => j;
  6. const rgb2lit = rgb => d3.hsl(d3.rgb(...rgb)).l || 0;
  7. const hex2rgb = hex => {
  8. const { r, g, b } = d3.color(hex);
  9. return [r, g, b];
  10. };
  11. const buildVectorData = (vector, toHue, toLightness, toHex) => {
  12. const sqMag = vectorDot(vector, vector);
  13. const mag = Math.sqrt(sqMag);
  14. const unit = vector.map(c => c / mag);
  15. const hue = toHue(vector);
  16. const lightness = toLightness(vector);
  17. const hex = toHex(vector);
  18. return { vector, sqMag, mag, unit, hue, lightness, hex };
  19. };
  20. const buildClusterData = (size, inertia, mu1, mu2, mu3, nu1, nu2, nu3, toHue, toLightness, toHex) => ({
  21. size, inertia,
  22. mu: buildVectorData([mu1, mu2, mu3], toHue, toLightness, toHex),
  23. nu: [nu1, nu2, nu3],
  24. });
  25. const buildPokemonData = ([name, size, ...values]) => ({
  26. name,
  27. jab: {
  28. total: buildClusterData(size, ...values.slice(0, 7), jab2hue, jab2lit, jab2hex),
  29. clusters: [
  30. buildClusterData(...values.slice(7, 15), jab2hue, jab2lit, jab2hex),
  31. buildClusterData(...values.slice(15, 23), jab2hue, jab2lit, jab2hex),
  32. buildClusterData(...values.slice(23, 31), jab2hue, jab2lit, jab2hex),
  33. ],
  34. },
  35. rgb: {
  36. total: buildClusterData(size, ...values.slice(31, 38), rgb2hue, rgb2lit, rgb2hex),
  37. clusters: [
  38. buildClusterData(...values.slice(38, 46), rgb2hue, rgb2lit, rgb2hex),
  39. buildClusterData(...values.slice(46, 54), rgb2hue, rgb2lit, rgb2hex),
  40. buildClusterData(...values.slice(54, 62), rgb2hue, rgb2lit, rgb2hex),
  41. ],
  42. },
  43. });
  44. const pokemonData = databaseV2.map(row => buildPokemonData(row));