Попытка сопоставить диапазон значений (положительных и отрицательных) соответствующим значениям в другом диапазоне.

Вопрос или проблема

Я работаю над ASCII-форматированным тепловым картографом для стола 3D-принтера. У меня есть массив цветов (длиной 107), и сетка стола может иметь широкий спектр значений, которые всегда будут включать отрицательные и положительные значения – пример ниже:

{"mesh_matrix": [
    [ 0.240094, 0.178237, 0.114668, 0.054469, 0.001266, -0.042774, -0.076938, -0.101971, -0.120074, -0.134906, -0.151581, -0.17667, -0.218202 ], 
    [ 0.126341, 0.10407, 0.054248, -0.002618, -0.05146, -0.082652, -0.092006, -0.080773, -0.055648, -0.02876, -0.017682, -0.045426, -0.140442 ], 
    [ 0.12967, 0.115636, 0.068095, 0.010321, -0.040461, -0.073068, -0.082363, -0.069252, -0.040688, -0.009667, 0.00477, -0.022463, -0.122497 ], 
    [ 0.200219, 0.175653, 0.124276, 0.064281, 0.009271, -0.031736, -0.054312, -0.058614, -0.049389, -0.035969, -0.032275, -0.056816, -0.132687 ], 
    [ 0.298821, 0.255262, 0.198163, 0.136783, 0.07823, 0.027458, -0.012731, -0.041688, -0.060917, -0.074073, -0.086965, -0.107555, -0.145957 ], 
    [ 0.396996, 0.334024, 0.272435, 0.211874, 0.152394, 0.094456, 0.038925, -0.012924, -0.059411, -0.098447, -0.127539, -0.143785, -0.143875 ], 
    [ 0.476957, 0.399923, 0.337079, 0.280125, 0.223227, 0.163025, 0.098625, 0.031606, -0.033983, -0.091625, -0.132331, -0.144644, -0.114635 ], 
    [ 0.531606, 0.449362, 0.389391, 0.338633, 0.287678, 0.23076, 0.165761, 0.09421, 0.021282, -0.044201, -0.08977, -0.099308, -0.053054 ], 
    [ 0.564536, 0.487167, 0.43397, 0.391022, 0.348181, 0.299085, 0.24115, 0.175572, 0.107325, 0.045164, 0.001623, -0.006987, 0.039427 ], 
    [ 0.590031, 0.526586, 0.482725, 0.447438, 0.412655, 0.373249, 0.327031, 0.274756, 0.220117, 0.16975, 0.13323, 0.123075, 0.154741 ], 
    [ 0.633064, 0.589288, 0.554874, 0.524556, 0.494505, 0.462327, 0.427067, 0.389203, 0.350654, 0.31477, 0.286343, 0.271598, 0.278198 ], 
    [ 0.7293, 0.705362, 0.676938, 0.645575, 0.61262, 0.579226, 0.546345, 0.514736, 0.484958, 0.457376, 0.432156, 0.409267, 0.388482 ], 
    [ 0.925094, 0.913319, 0.882748, 0.840219, 0.791376, 0.740674, 0.691375, 0.645551, 0.604082, 0.566656, 0.531771, 0.496733, 0.457656 ]
]}

В приведенных данных минимальное значение -0.218202, а максимальное значение 0.925094.
Таким образом, если у меня есть массив из 107 символов, мы сопоставим -0.218202 с colors[0], а 0.925094 с colors[-1].

Что я пытался сделать:

  1. Получить положительное значение минимального значения сетки и использовать его в качестве смещения для всех значений. Это означало бы, что я работал с диапазоном, который был бы 0 до 1.143296 вместо -0.218202 до 0.925094.
  2. Взять максимальное значение нового диапазона (1.143296) и разделить его на количество цветов в массиве цветов – 107/1.143296 = 93.5890618003
  3. Взять это значение и умножить его на смещенное значение сетки, округлить результат и использовать его как индекс для цвета: например, если значение сетки 0.496733, то colorIdx = round((0.496733+0.218202)*93.5890618003) = 67

Ваши данные – это JSON. Так как вы пометили , вы, возможно, ищете процессор JSON для командной строки. Например, с jq это можно решить следующим образом, повторяя ваши шаги:

< input.json jq --argjson n 107 '
  ([.[][][]] | [min, $n / (max - min)]) as [$min, $s]
  | .[][][] |= ($s * (. - $min) | round)
'
{
  "mesh_matrix": [
    [
      43,
      37,
      31,
      26,
      21,
      16,
      13,
      11,
      9,
      8,
      6,
      4,
      0
    ],
    [
      32,
      30,
      25,
      20,
      16,
      13,
      12,
      13,
      15,
      18,
      19,
      16,
      7
    ],
    [
      33,
      31,
      27,
      21,
      17,
      14,
      13,
      14,
      17,
      20,
      21,
      18,
      9
    ],
    [
      39,
      37,
      32,
      26,
      21,
      17,
      15,
      15,
      16,
      17,
      17,
      15,
      8
    ],
    [
      48,
      44,
      39,
      33,
      28,
      23,
      19,
      17,
      15,
      13,
      12,
      10,
      7
    ],
    [
      58,
      52,
      46,
      40,
      35,
      29,
      24,
      19,
      15,
      11,
      8,
      7,
      7
    ],
    [
      65,
      58,
      52,
      47,
      41,
      36,
      30,
      23,
      17,
      12,
      8,
      7,
      10
    ],
    [
      70,
      62,
      57,
      52,
      47,
      42,
      36,
      29,
      22,
      16,
      12,
      11,
      15
    ],
    [
      73,
      66,
      61,
      57,
      53,
      48,
      43,
      37,
      30,
      25,
      21,
      20,
      24
    ],
    [
      76,
      70,
      66,
      62,
      59,
      55,
      51,
      46,
      41,
      36,
      33,
      32,
      35
    ],
    [
      80,
      76,
      72,
      70,
      67,
      64,
      60,
      57,
      53,
      50,
      47,
      46,
      46
    ],
    [
      89,
      86,
      84,
      81,
      78,
      75,
      72,
      69,
      66,
      63,
      61,
      59,
      57
    ],
    [
      107,
      106,
      103,
      99,
      94,
      90,
      85,
      81,
      77,
      73,
      70,
      67,
      63
    ]
  ]
}

Демо

Ответ или решение

Для создания ASCII-тепловой карты для сетки стола 3D-принтера необходимо сопоставить диапазон значений (как положительных, так и отрицательных) с соответствующими значениями в другом диапазоне, представленном в виде массива цветов. Ваша задача состоит в том, чтобы правильно преобразовать значения из массива mesh_matrix, чтобы они соответствовали индексам в массиве цветов длиной 107.

Для этого процесса можно выделить несколько подходов. Я опишу шаги, которые вы можете использовать для реализации данного преобразования:

  1. Определение минимального и максимального значений:
    Для начала, вам нужно найти минимальное и максимальное значения в массиве mesh_matrix. Как вы уже правильно указали, минимальное значение составляет -0.218202, а максимальное — 0.925094.

  2. Смещение значений:
    Чтобы работать только с положительными числами, можно выполнить смещение всех значений, добавив к ним абсолютное значение минимального элемента:
    [
    \text{новое значение} = \text{старое значение} + 0.218202
    ]
    После этой операции ваши данные будут в диапазоне от 0 до 1.143296.

  3. Вычисление коэффициента масштабирования:
    После получения нового диапазона вы можете вычислить коэффициент масштабирования, который позволит сопоставить значения с индексами массива цветов:
    [
    \text{коэффициент} = \frac{107}{\text{максимальное значение} – \text{минимальное значение}} = \frac{107}{1.143296} \approx 93.589
    ]

  4. Преобразование значений в индексы цвета:
    Теперь вы можете взять каждое значение в массиве mesh_matrix, чтобы определить его соответствующий индекс цвета:
    [
    \text{index} = \text{round}((\text{значение} + 0.218202) \times 93.589)
    ]
    Правильное округление позволяет избежать ошибок при индексировании.

  5. Применение результата:
    Теперь вы можете заменить каждое значение в mesh_matrix на соответствующий индекс цвета. Например, для значения 0.496733:
    [
    \text{index} = \text{round}((0.496733 + 0.218202) \times 93.589) = 67
    ]
    Это будет соответствовать позиции в вашем массиве цветов.

Для выполнения всех вышеперечисленных шагов вы можете использовать различные языки программирования. Если вы хотите сделать это в командной строке с использованием jq, то вот пример команды, который вы можете использовать для преобразования JSON данных:

jq --argjson n 107 '
  ([.[][][]] | [min, $n / (max - min)]) as [$min, $s]
  | .[][][] |= round($s * (. - $min))
' input.json

Эта команда извлекает значения из JSON, находит минимальное и максимальное значения, вычисляет коэффициент масштабирования и заменяет значения в матрице на соответствующие индексы.

После выполнения приведенных шагов у вас будет новая матрица, где каждый элемент будет заменен на индекс цвета, который можно использовать для создания вашей тепловой карты.

Оцените материал
Добавить комментарий

Капча загружается...