Форум программистов, компьютерный форум, киберфорум
Геометрия
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 28.07.2015
Сообщений: 8

Построение сетки из шестиугольников

28.07.2015, 18:22. Показов 2925. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток уважаемые математики. Так как с математикой имеются проблемы, то прошу у вас помощи. Задача - мы знаем координату центра и размеры фиксированного гексагона (обычный шестиугольник). От это гексагона, на каком то случайном расстоянии берем координату, и вокруг этой координаты, в каком то заданном радиусе, необходимо построить сетку гексагонов (пример как это должно выглядеть в теории - http://www.redblobgames.com/grids/hexagons/), координаты вершин должны быть точно такими же, как если бы они покрывались сеткой от первого константного гексагона. Буду рад любой помощи, как формулам, так и направлением куда копать.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.07.2015, 18:22
Ответы с готовыми решениями:

Построение сетки
Я хочу реализовать изменяемый ландшафт. У меня появилась идея - задать много точек имеющих радиус и если они соприкасаются то образуют...

Построение защищенной сетки
Здравствуйте еще раз, хотелось спросить у опытных спецов имеется сеть с настроенной доменной политикой, вся сеть реализована на...

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

6
Эксперт по математике/физике
 Аватар для jogano
6360 / 4067 / 1512
Регистрация: 09.10.2009
Сообщений: 7,550
Записей в блоге: 4
28.07.2015, 22:12
Ваша формулировка не понятна.
Пусть есть центр шестиугольника, заданный декартовыми координатами, и длина стороны. По ссылке предполагается, что одна из больших диагоналей ориентирована вертикально. Пусть будет так. Дальше вы пишете
Цитата Сообщение от Dangeloid Посмотреть сообщение
От это гексагона, на каком то случайном расстоянии берем координату
Координат у точки, вообще говоря, две. Это декартовы координаты, или как по ссылке, в пункте "Offset coordinates"?
Цитата Сообщение от Dangeloid Посмотреть сообщение
и вокруг этой координаты, в каком то заданном радиусе, необходимо построить сетку гексагонов
Задав начальный шестиугольник, мы уже строим сетку однозначно, и незачем привязываться к какой-то другой точке. Или вы что-то не то имели в виду? Трудно представить себе, что вы хотите.
Возможно, вам нужно построить часть сетки, заданной начальным шестиугольником, вокруг некоторой точки, чтобы вершины шестиугольников не удалялись дальше чем заданный радиус от этой точки?
0
0 / 0 / 0
Регистрация: 28.07.2015
Сообщений: 8
28.07.2015, 22:28  [ТС]
Координат у точки, вообще говоря, две. Это декартовы координаты, или как по ссылке, в пункте "Offset coordinates"?
Да все верно, мы знаем точку центра (x, y) мы знаем размер стороны шестиугольника - то есть грубо говоря у нас есть шестиугольник, координаты всех углов и центра известны.

Возможно, вам нужно построить часть сетки, заданной начальным шестиугольником, вокруг некоторой точки, чтобы вершины шестиугольников не удалялись дальше чем заданный радиус от этой точки?
да, все верно, просто вручную покрыть всю область шестиугольниками, вплоть до заданной точки я могу, но это слишком грубый подход, интересует именно возможность зная начальный шестиугольник и правило построения такой сетки, покрыть нужный радиус, без грубого перебора всех значений
0
Эксперт по математике/физике
 Аватар для jogano
6360 / 4067 / 1512
Регистрация: 09.10.2009
Сообщений: 7,550
Записей в блоге: 4
28.07.2015, 23:25
Вот пока вам координаты центра шестиугольника, вовнутрь которого попадает заданная точка:
Пусть точка плоскости имеет декартовы координаты https://www.cyberforum.ru/cgi-bin/latex.cgi?\left(x_0,y_0 \right), размер стороны 6-угольника а и сетка ориентирована как на первом рисунке пункта "Offset coordinates" - "odd-r layout" (хотя это не принципиально - можно сделать по любому из 4-х рисунков). Тогда координаты (декартовы) центров 6-угольников равны https://www.cyberforum.ru/cgi-bin/latex.cgi?\left(an \sqrt{3}+\frac{1+\left(-1 \right)^{m+1}}{2}\frac{\sqrt{3}}{2}a; \:\frac{3}{2}am \right), \: n,m \in Z
Сначала определяем m: https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
<br />
m=\left[\frac{2y_0}{3a}+\frac{1}{2} \right] (проще говоря, дробь https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{2y_0}{3a} округляется до ближайшего целого). Зная m, определяем таким же образом n: https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
<br />
n=\left[\frac{x_0}{a \sqrt{3}}+\frac{1+\left(-1 \right)^m}{4} \right]
Берёте найденную пару m,n и подставляете в формулу для декартовых координат центров, получаете цент 6-угольника, вокруг которого нужно рисовать часть сетки.

Добавлено через 17 минут
Далее, чтобы рисовать часть сетки в пределах заданного вами радиуса R, можно ввести один из трёх критериев:
1) рисовать только те 6-угольники сетки, центр которых отстоит от заданной точки https://www.cyberforum.ru/cgi-bin/latex.cgi?\left(x_0,y_0 \right) не дальше чем на R.
2) рисовать только те 6-угольники, все вершины которых отстоят от заданной точки на более чем на R.
3) рисовать только те 6-угольники, хотя бы одна вершина которых отстоит от заданной точки не более чем на R.
Какой критерий вам нужен?
2
0 / 0 / 0
Регистрация: 28.07.2015
Сообщений: 8
29.07.2015, 09:46  [ТС]
1) рисовать только те 6-угольники сетки, центр которых отстоит от заданной точки https://www.cyberforum.ru/cgi-... ft(x_0,y_0 \right) не дальше чем на R.
Вот этот критерий более подходит
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,898
Записей в блоге: 2
30.07.2015, 06:50
Лучше переформулировать так:

-дан центр "базового" гексагона (x0, y0) и известен его радиус (он же сторона) R
-найти координаты центра (x, y) гексагона покрывающего произвольную точку (x1, y1). Ну конечно найденный должен быть "в той же сетке" что и базовый

Кликните здесь для просмотра всего текста

C++
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
void HexCntr( float x0, float y0, float x1, float y1, float & x, float & y, float R )
{
  static const float sq2 = sqrt(2.0f);
  static const float sq3 = sqrt(3.0f);
 
// расстояниe между центрами
  float step = R * sq3;
  float half = step / 2;
 
// отнимаем x0, y0
  x1 -= x0;
  y1 -= y0;
 
// получаем индексы центра
  int ix = (int) (x1 / step);
  int iy = (int) (y1 / step);
 
// переводим индексы в центр гексагона 
  x = ix * step;
  y = iy * step;
 
// смещаемся в нечетной строке 
  if (iy % 2) 
   x += (x1 <0) ? -half : half; 
  
// теперь (x1, y1) или в гексагоне (x, y) или в одном из соседних
  float dx = x1 - x; 
  float dy = y1 - y;
 
  float dx2 = fabs(dx);
  float dy2 = fabs(dy);
 
// самопроверка
  assert(dx2 <= step);
  assert(dy2 <= step);
 
// сектанты 0, 3
  if (dy2 * sq3 <= dx2)  {
    if (dx2 > half) 
     x += (dx < 0) ? - step : step;
  }
 
// сектанты 1, 2, 4, 5
  else {
   if (dx2 / sq2 + dy2 / sq2 > half) {
     x += (dx < 0) ? -half : half; 
     y += (dy < 0) ? -step : step; 
   }
  }
 
// добавляем x0, y0
 x += x0;
 y += x0;
}
Edit: исправил пару багов
1
Эксперт по математике/физике
 Аватар для jogano
6360 / 4067 / 1512
Регистрация: 09.10.2009
Сообщений: 7,550
Записей в блоге: 4
30.07.2015, 16:42
Цитата Сообщение от Dangeloid Посмотреть сообщение
Вот этот критерий более подходит
Сначала определяем максимальное отклонение вверх и вниз от данной точки до центров 6-угольников сетки из неравенства https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
<br />
y_0-R\leq \frac{3}{2}am\leq y_0+R \: \Rightarrow \frac{2}{3a}\left(y_0-R \right)\leq m\leq \frac{2}{3a}\left(y_0+R \right)
Если https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{2}{3a}\left(y_0-R \right) целое число, то m пробегает все целые значения https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
<br />
m=\bar{\frac{2}{3a}\left(y_0-R \right); \: \left[ \frac{2}{3a}\left(y_0+R \right)\right]}, а если не целое, то в пределах https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
<br />
m=\bar{\left[ \frac{2}{3a}\left(y_0-R \right)\right] +1; \: \left[ \frac{2}{3a}\left(y_0+R \right)\right]}
Для каждого такого m определяем n из формулы расстояния между двумя точками
https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
<br />
\left(\left(n+\frac{1+\left(-1 \right)^{m+1}}{4} \right)a \sqrt{3}-x_0 \right)^2+\left(\frac{3}{2}am-y_0 \right)^2\leq R^2, откуда
https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
<br />
\frac{x_0-\sqrt{R^2-\left(\frac{3}{2}am-y_0 \right)^2}}{a \sqrt{3}}-\frac{1+\left(-1 \right)^{m+1}}{4}\leq n\leq \frac{x_0+\sqrt{R^2-\left(\frac{3}{2}am-y_0 \right)^2}}{a \sqrt{3}}-\frac{1+\left(-1 \right)^{m+1}}{4}
n тоже, разумеется, целые.
Говоря языком программирования, у вас будет внешний цикл типа for... по переменной m и внутренний цикл типа for... по переменной n.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.07.2015, 16:42
Помогаю со студенческими работами здесь

Построение полигональной сетки
Как средствами OpenGl представить произвольный объект в виде полигональной сетки на языке C/C++?

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

Построение сетки с точками - добавление новых элементов
Здравствуйте! На первом этапе стоит довольно простая задача - сгенерировать рандомные точки на сетке с известными координатами. ...

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

найти отношение периметров шестиугольников
докажите, что площадь правильного вписанного шестиугольника равна 3/4 площади правильного описанного шестиугольника. Найдите отношение их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru