Как найти наиболее близкие округленные значения в соответствии с определенным набором критериев - PullRequest
0 голосов
/ 26 сентября 2019

Я плохо разбираюсь в математике и имею дело с конкретной проблемой рисования графиков на холсте html5.

Учитывая, что у меня есть:

  • диапазон цен между минимальной и максимальной ценой, который мне нужно поставить по оси Y
  • Определенное количество «ведер»в котором можно разделить этот ценовой диапазон.

Например, у меня могут быть исторические цены на биткойны:

  • Минимальная цена 2939,7
  • Максимальная цена 4380
  • 9 ведер для заполнения

Эти цены, однако, могут быть совершенно разными, поэтому существует определенный порядок величины:

  • раунд на 500
  • раунд на100
  • раунд на 50
  • раунд на 25
  • раунд на 10
  • раунд на 5
  • раунд на 2,5 или 2
  • раунд на 1
  • раунд на 0,5
  • раунд на 0,25 или 0,20
  • раунд на 0,10

Если бы мне пришлось увеличитьНа карте количество блоков не изменится, но уровень цен изменится.

Хороший пример того, чего я хочу достичь, это что-то вроде TradingView: https://www.tradingview.com/chart/SsrQxrf0/

enter image description here

Но уменьшено: enter image description here

У них есть способ даже динамически растягивать эти ведра.
Я думал об этом, но это действительно вызывает у меня опухоль головного мозга ...
Чтоправильный подход, чтобы начать на этом?

Я стараюсь, чтобы моя базовая стратегия была простой:

  • Определите количество пикселей для использования на группу и рассчитайте nr блоков на основе размера холста;
  • Найдите общий диапазон цен, который нужно отобразить, и определите цену за ведро путем простого деления: разница в цене между минимальным и максимальным / количественным значением ведра;
  • Теперь, как отобразить эти цены в красиво округленных сегментах?

В моем примере у меня был бы ценовой диапазон около 113,7 за ведро.
Но я понятия не имею, как использовать эту информацию, чтобы получить желаемый результат, а именноприятно вокруг этих ведер.

Любые советы по стратегиям приветствуются.

1 Ответ

0 голосов
/ 26 сентября 2019

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

const buckets = [1, 2, 2.5, 5, 10, 25, 50, 100, 200, 250, 500, 1000];

const findPriceIntervalPerGridSquare = ({ minPrice, maxPrice, nrSquares }) => {
  const priceRange = maxPrice - minPrice;

  let idealBucket;
  for(let bucket of buckets) {
    if ((priceRange / nrSquares) < bucket) {
      idealBucket = bucket;
      break;
    }
  }

  return idealBucket;
};

Если у вас есть что-то лучше, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...