2015-05-18 2 views
1

Я пытаюсь нарисовать восьмиугольник с Python 3.4 и Pyglet 1.2, который использует OpenGL. Мой код кажется правильным, но иногда рисунок имеет дополнительный треугольник случайного цвета (белый или черный большую часть времени) в случайном положении (0, 0 (нижний левый) угол в большинстве случаев) для одного кадра. Вот некоторые примеры:Неверно нарисованный восьмиугольник (случайный) - NEW TEST ADDED

bug1 bug2 bug3

Некоторые кадры идеальным, хотя:

fine

Вот мой короткий метод:

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 файлов
  • Изменение частоты кадров
  • Изменение радиуса и положения
  • Печать списка точек неоднократно. Ни один из них никогда не меняется (хотя изменения рисунка) и находится в допустимых диапазонах.
  • Печать списка индексов. Ни одно из них не меняется, и все они действительны.

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

Редактировать: Это не случайно, я полагаю. Я пробовал другой тест, который не удаляет пакет каждый новый фрейм и вместо этого добавляет еще один восьмиугольник к существующему. Вот что происходит:

connected

Кажется, все они связаны. Их центры, в частности. В конце концов, это может быть ошибка в коде.

Вот мой второй тест:

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() 
+0

Он воспроизводится на моей машине. – Mekanik

ответ

2

Ваш список индексов неверен: i = list(chain.from_iterable((0, x+1, x+2) for x in range(8))) [0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 6, 0, 6, 7, 0, 7, 8, 0, 8, 9 , 0, 1, 8]

range(7) Должно быть.

+0

Спасибо! Прекрасно работает. Также смог нарисовать 16-гольник и теперь применить его для рисования любого '8 * N-gon'. –

Смежные вопросы