Я пытаюсь нарисовать восьмиугольник с Python 3.4 и Pyglet 1.2, который использует OpenGL. Мой код кажется правильным, но иногда рисунок имеет дополнительный треугольник случайного цвета (белый или черный большую часть времени) в случайном положении (0, 0 (нижний левый) угол в большинстве случаев) для одного кадра. Вот некоторые примеры:Неверно нарисованный восьмиугольник (случайный) - NEW TEST ADDED
Некоторые кадры идеальным, хотя:
Вот мой короткий метод:
from pyglet.gl import GL_TRIANGLES
from itertools import chain
C = 0.707 # const
def octagon (x, y, r, c, b, g):
""" Returns a vertex list of regular octagon with center at (x, y) and corners
distanced r away. Paints center and corners. Adds to batch b in group g. """
i = list(chain.from_iterable((0, x+1, x+2) for x in range(8)))
i.extend((0, 1, 8))
p = x, y
p += x-r, y, x+int(-C*r), y+int(C*r), x, y+r, x+int(C*r), y+int(C*r)
p += x+r, y, x+int(C*r), y+int(-C*r), x, y-r, x+int(-C*r), y+int(-C*r)
return b.add_indexed(9, GL_TRIANGLES, g, i, ('v2i', p), ('c3B', c))
Вот мой тестовый код:
import pyglet
from circle import octagon
# Constants
WIN = 900, 900, 'TEST', False, 'tool' # x, y, caption, resizable, style
CENTER = WIN[0] // 2, WIN[1] // 2
RADIUS = 100
SPEED = 0.1 # duration of frame in seconds
# Color constants
WHITE = (255, 255, 255) # for center
RED = (255, 0, 0) # for corners
# Variables
win = pyglet.window.Window(*WIN)
batch = pyglet.graphics.Batch() # recreate batch every time
def on_step(dt):
global batch
batch = pyglet.graphics.Batch()
octagon(CENTER[0], CENTER[1], RADIUS, WHITE+RED*8, batch, None)
@win.event
def on_draw():
win.clear()
batch.draw()
pyglet.clock.schedule_interval(on_step, SPEED)
pyglet.app.run()
Что я пробовал:
- Перезапуск компьютера
- Удаление папки py_cache с * .pyc файлов
- Изменение частоты кадров
- Изменение радиуса и положения
- Печать списка точек неоднократно. Ни один из них никогда не меняется (хотя изменения рисунка) и находится в допустимых диапазонах.
- Печать списка индексов. Ни одно из них не меняется, и все они действительны.
Однако ничего из этого не получилось. В чем проблема? Является ли эта ошибка воспроизводимой на вашей машине? Проблема, похоже, происходит случайным образом.
Редактировать: Это не случайно, я полагаю. Я пробовал другой тест, который не удаляет пакет каждый новый фрейм и вместо этого добавляет еще один восьмиугольник к существующему. Вот что происходит:
Кажется, все они связаны. Их центры, в частности. В конце концов, это может быть ошибка в коде.
Вот мой второй тест:
import pyglet
from circle import octagon
from random import randrange
WIN = 900, 900, 'TEST', 0, 'tool', 0, 1, 0 # vsync off to unlimit fps
RADIUS = 60
SPEED = 1.0
WHITE = (255, 255, 255) # for center
RED = (255, 0, 0) # for points
win = pyglet.window.Window(*WIN)
batch = pyglet.graphics.Batch()
def on_step(dt):
global counter
x = randrange(RADIUS, WIN[0] - RADIUS)
y = randrange(RADIUS, WIN[1] - RADIUS)
octagon(x, y, RADIUS, WHITE+RED*8, batch, None)
@win.event
def on_draw():
win.clear()
batch.draw()
pyglet.clock.schedule_interval(on_step, SPEED)
pyglet.app.run()
Он воспроизводится на моей машине. – Mekanik