Nano Hash - криптовалюты, майнинг, программирование

Обнаружение всех пикселей в шестиугольнике с помощью JS/HTML5 Canvas

В javascript у меня есть карта, которую я хотел бы наложить на гексы и превратить эти гексы либо в зеленый (земля), либо в синий (вода) в зависимости от того, сколько земли находится в гексе. Я предполагаю, что это как-то связано с определением цвета пикселя, и если он находится в диапазоне, который я считаю синим, то он считается «водой», как только он достигает определенного количества пикселей, которые являются водой, он просто превращается в воду кафельная плитка.

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

Чтобы нарисовать шестигранник, я использую следующее

    function hex(x = 0, y = 0, side = 0, size = 10) {
    ctx.beginPath();
    ctx.moveTo(x + size * Math.cos(0), y + size * Math.sin(0));

    for (side; side < 7; side++) {
        ctx.lineTo(x + size * Math.cos(side * 2 * Math.PI / 6), y + size * Math.sin(side * 2 * Math.PI / 6));
    }
}

Но я не понимаю, как я мог бы использовать это для определения, какие пиксели обнаруживать. Я не силен в математике.


  • "Я плохо разбираюсь в математике" — тогда лучше поправляйтесь и/или проведите надлежащее исследование. В той форме, в которой она сейчас, это просто слишком широко. Предлагаем начать с кругов вместо шестиугольников (для измерения пикселей, а не окончательного отображения) - определить, какие пиксели попадают в круг, проще, чем сделать то же самое для шестиугольника. 29.05.2018
  • Если бы я знал, как это понять помимо того, что я сказал, я бы не спрашивал. Ваш комментарий не является ни полезным, ни информативным. Я уже потратил некоторое время на поиски и попытки выяснить ответ, и я не смог найти ничего, что могло бы помочь. 29.05.2018
  • Затем вам нужно поработать над своими базовыми исследовательскими навыками. Введите что-то вроде "что такое математика, чтобы проверить, находится ли точка внутри шестиугольника" в Google уже дает вам множество подходов. 29.05.2018

Ответы:


1

Вы можете сканировать шестнадцатеричный код построчно, как прямоугольник. Но ваш внутренний цикл должен изменять свои пределы.

Ваш гекс с плоской вершиной, для (0,0)-центрированного гекса левая верхняя вершина имеет координаты (-side/2, -side * Sqrt(3)/2). Пусть p = Sqrt(3)/2.

Таким образом, пределы внешней (координаты Y) петли равны

  -side * p .. side * p

Для заданной координаты y пределы x равны

-(side - 0.5 * Abs(y)) / p  .. (side - 0.5 * Abs(y)) / p

Дельфийский код:

var
  ix, iy, side: Integer;
  cf: Double;
begin
  cf := Sqrt(3) / 2;
  side := 100;
  for iy :=  - Round(cf * side) to Round(cf * side) do
     for ix := - Round((side - 0.5 * Abs(iy) / cf)) to
                 Round((side - 0.5 * Abs(iy) / cf)) do
         Canvas.Pixels[ix + 200, iy + 200] := clBlue;

генерирует

введите здесь описание изображения

29.05.2018
  • Я не уверен, что понимаю это... Я никогда не использовал код Delphi. Похоже, вы используете 2 цикла for и просто рисуете пиксели в шестнадцатеричном синем цвете по мере продвижения ... это правильно? Сторона означает размер, а 200 — смещение от стороны? 30.05.2018
  • Насколько я понимаю - ваша задача проверить все пиксели внутри некоторого шестиугольника. Я прохожусь по всем пикселям внутри шестиугольника и закрашиваю их только для демонстрации. 200 — это просто сдвиг, чтобы поместить шестнадцатеричный код в центр экрана. Да, сторона = размер 30.05.2018
  • Да, это то, что я хочу сделать. Вопрос: знаете ли вы, что пошаговое выполнение на вашем пути хуже или лучше, чем метод заливки формы JS/canvas для раскрашивания? Мне нужна сетка 266x533, а такое количество гексов убивает мой браузер ^.^ Просто интересно, есть ли более эффективный способ сделать это 30.05.2018
  • Если вам нужно проверить каждый пиксель каждого гекса - это самый эффективный способ. Если вам нужно рисовать заполненные гексы - лучше использовать полигональные графические примитивы. 30.05.2018
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..