错误绘制的八边形(随机)- 添加了新测试
Incorrectly drawn octagon (random) - NEW TEST ADDED
我正在尝试使用 Python 3.4 和使用 OpenGL 的 Pyglet 1.2 绘制八边形。我的代码似乎是正确的,但绘图有时在单个帧的随机位置(大多数情况下为 0、0(左下角)角)有额外的随机颜色三角形(大多数情况下为白色或黑色)。以下是一些示例:
虽然有些框架很完美:
这是我的简短方法:
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()
我尝试过的:
- 正在重启计算机
- 正在删除包含 *.pyc 文件的 py_cache 文件夹
- 改变帧率
- 改变半径和位置
- 重复打印点列表。 None 其中有变化(尽管绘图有变化)并且在有效范围内。
- 正在打印索引列表。 None 个更改并且全部有效。
然而,这些都不起作用。有什么问题?此错误在您的机器上是否可重现?这个问题似乎是随机发生的。
编辑: 我想这不是随机的。我尝试了一个不同的测试,它不会在每个新帧中删除批次,而是在现有的八边形中添加另一个八边形。事情是这样的:
看来他们都是有联系的。他们的中心,特别是。毕竟,我想这可能是代码中的错误。
这是我的第二个测试:
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()
您的索引列表不正确:
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)
.
我正在尝试使用 Python 3.4 和使用 OpenGL 的 Pyglet 1.2 绘制八边形。我的代码似乎是正确的,但绘图有时在单个帧的随机位置(大多数情况下为 0、0(左下角)角)有额外的随机颜色三角形(大多数情况下为白色或黑色)。以下是一些示例:
虽然有些框架很完美:
这是我的简短方法:
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()
我尝试过的:
- 正在重启计算机
- 正在删除包含 *.pyc 文件的 py_cache 文件夹
- 改变帧率
- 改变半径和位置
- 重复打印点列表。 None 其中有变化(尽管绘图有变化)并且在有效范围内。
- 正在打印索引列表。 None 个更改并且全部有效。
然而,这些都不起作用。有什么问题?此错误在您的机器上是否可重现?这个问题似乎是随机发生的。
编辑: 我想这不是随机的。我尝试了一个不同的测试,它不会在每个新帧中删除批次,而是在现有的八边形中添加另一个八边形。事情是这样的:
看来他们都是有联系的。他们的中心,特别是。毕竟,我想这可能是代码中的错误。
这是我的第二个测试:
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()
您的索引列表不正确:
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)
.