Проблема с созданием стабильных гексагональных сеток ⇐ Python
Проблема с созданием стабильных гексагональных сеток
витрина в Pyglet
Я пытаюсь решить проблему уже несколько недель. Я хочу создать шестиугольную сетку. Изначально я начал с Pygame, а теперь пробую с Pyglet. К сожалению, мне не удалось создать точную сетку ни с одной из библиотек.
В примере ниже я просто перемещаю эту сетку в демонстрационных целях. Однако я заметил, что форма шестиугольников непостоянна; они постоянно перемещаются и изменяются. В Pygame проблема еще более выражена, и мне не удалось найти ее решение.
Вот фрагмент кода, с которым я работал:
импортировать пиглет из фигур импорта Pyglet окно = pyglet.window.Window(1500, 1000) пакет = pyglet.graphics.Batch() def Calc_points(размер: кортеж[int,int], координата: кортеж[int,int]=(0,0)) -> list[tuple[float,float]]: б, а = размер а, б = 1/4*а, 1/2*б x0, y0 = координата x1, y1 = x0+b, y0+a x2, y2 = x1+b, y1+a у3 = у2+а у4 = у3+а возвращаться [ (х0, у1), (х1, у0), (х2, у1), (х2, у3), (х1, у4), (х0, у3), (х0, у1) ] def hex_mul(размер: кортеж[float,float], pos: кортеж[float,float]) -> кортеж[float,float]: """учитывая размер шестиугольника и положение в сетке шестиугольников, выводится реальная координата""" х, у = позиция б, а = размер а, б = 1/2*а, 1/2*б координата = (x * 2 * b + y % 2 * b, у*3/2*а) обратная координата из математического импорта sqrt размер = 20,0 граница = 2,0 размер = (квадрат(3)/2*размер,размер) граница = (sqrt(3)/2*граница,граница) уменьшенный_размер = (размер[0] — граница[0], размер[1] — граница[1]) шестиугольники = [] p = Calc_points(уменьшенный_размер) для y в диапазоне (200): для x в диапазоне (200): координата = hex_mul(размер, (x,y)) r_coord = (координата[0] + граница[0]/2, координата[1] + граница[1]/2) shape = shape.Polygon(*p, color=(180,170,160,255), пакет=пакет) shape.position = r_coord шестиугольники.append( форма ) @window.event защита on_draw(): для s в шестиугольниках: x, y = s.position s.position = (x+0,8, y+0,7) окно.очистить() пакетная обработка.draw() пиглет.app.run() [*]Настройка параметров генерации шестиугольной сетки как в Pygame, так и в Pyglet. [*]Экспериментируем с различными методами рендеринга и обновления. Ожидаемый результат:
Я ожидал создать стабильную шестиугольную сетку, которая останется последовательной, не искажается и не смещается во время движения и/или постоянных промежутков между шестиугольниками. Однако, несмотря на мои попытки, мне не удалось добиться желаемой стабильности ни с помощью Pygame, ни с Pyglet.
(Если возможно, я бы предпочел использовать pygame, так как я к нему уже привык.)
после применения приближения qsrt в pygame
витрина в Pyglet
Я пытаюсь решить проблему уже несколько недель. Я хочу создать шестиугольную сетку. Изначально я начал с Pygame, а теперь пробую с Pyglet. К сожалению, мне не удалось создать точную сетку ни с одной из библиотек.
В примере ниже я просто перемещаю эту сетку в демонстрационных целях. Однако я заметил, что форма шестиугольников непостоянна; они постоянно перемещаются и изменяются. В Pygame проблема еще более выражена, и мне не удалось найти ее решение.
Вот фрагмент кода, с которым я работал:
импортировать пиглет из фигур импорта Pyglet окно = pyglet.window.Window(1500, 1000) пакет = pyglet.graphics.Batch() def Calc_points(размер: кортеж[int,int], координата: кортеж[int,int]=(0,0)) -> list[tuple[float,float]]: б, а = размер а, б = 1/4*а, 1/2*б x0, y0 = координата x1, y1 = x0+b, y0+a x2, y2 = x1+b, y1+a у3 = у2+а у4 = у3+а возвращаться [ (х0, у1), (х1, у0), (х2, у1), (х2, у3), (х1, у4), (х0, у3), (х0, у1) ] def hex_mul(размер: кортеж[float,float], pos: кортеж[float,float]) -> кортеж[float,float]: """учитывая размер шестиугольника и положение в сетке шестиугольников, выводится реальная координата""" х, у = позиция б, а = размер а, б = 1/2*а, 1/2*б координата = (x * 2 * b + y % 2 * b, у*3/2*а) обратная координата из математического импорта sqrt размер = 20,0 граница = 2,0 размер = (квадрат(3)/2*размер,размер) граница = (sqrt(3)/2*граница,граница) уменьшенный_размер = (размер[0] — граница[0], размер[1] — граница[1]) шестиугольники = [] p = Calc_points(уменьшенный_размер) для y в диапазоне (200): для x в диапазоне (200): координата = hex_mul(размер, (x,y)) r_coord = (координата[0] + граница[0]/2, координата[1] + граница[1]/2) shape = shape.Polygon(*p, color=(180,170,160,255), пакет=пакет) shape.position = r_coord шестиугольники.append( форма ) @window.event защита on_draw(): для s в шестиугольниках: x, y = s.position s.position = (x+0,8, y+0,7) окно.очистить() пакетная обработка.draw() пиглет.app.run() [*]Настройка параметров генерации шестиугольной сетки как в Pygame, так и в Pyglet. [*]Экспериментируем с различными методами рендеринга и обновления. Ожидаемый результат:
Я ожидал создать стабильную шестиугольную сетку, которая останется последовательной, не искажается и не смещается во время движения и/или постоянных промежутков между шестиугольниками. Однако, несмотря на мои попытки, мне не удалось добиться желаемой стабильности ни с помощью Pygame, ни с Pyglet.
(Если возможно, я бы предпочел использовать pygame, так как я к нему уже привык.)
после применения приближения qsrt в pygame
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение