我可以在 pyglet 中使用归一化坐标绘制吗?
Can I draw using normalized coordinates in pyglet?
在 pyglet 图形文档中,它演示了如何使用屏幕坐标在 2d space 中绘制点
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v2i', (10, 15, 30, 35))
)
我希望能够使用标准化坐标进行绘制,每个轴上的坐标范围为 [-1, 1],但正常使用绘图调用时,我必须根据像素坐标给出顶点。
我想这样做的原因是我将绘制域和范围[-1, 1]的函数,所以使用归一化坐标绘制非常合适,而不必担心转换。
所以,假设我的数学是正确的(它肯定不是),这些函数应该return你正在寻找的东西:
def normalize(cords, constraint):
x_ratio, y_ratio = 1/constraint.width, 1/constraint.height
result = []
for x,y in zip(*[iter(cords)] * 2):
nx = ((x-(constraint.width/2))*x_ratio)*2
ny = ((y-(constraint.height/2))*y_ratio)*2
result += [nx, ny]
print(x,y, '->', nx, ny)
return result
def complicate(cords, constraint):
x_ratio, y_ratio = 1/constraint.width, 1/constraint.height
result = []
for x,y in zip(*[iter(cords)] * 2):
nx = ((x/x_ratio)/2)+(constraint.width/2)
ny = ((y/y_ratio)/2)+(constraint.height/2)
result += [nx, ny]
print(x, y, '->', nx, ny)
return result
您可以这样使用它们:
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v2i', normalize((10, 15, 30, 35), window))
)
或
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v2i', complicate((-0.975, -0.95, -0.925, -0.883), window))
)
您可能想要一种将两个世界存储在一个地方的通用方法。并将它们作为一个单一对象使用,无论您输入什么都有意义。因此您可以将归一化坐标和坐标视为同一事物。
您可以通过执行以下操作来做到这一点:
class cordinates():
def __init__(self, cords, constraint=None):
if not constraint: constraint = window
self.constraint = constraint
if min(cords) > -1 and max(cords) < 1:
self.type = 'normalized'
else:
self.type = 'complicated'
self.cords = cords
def normalize(self, constraint=None):
if not constraint: constraint = self.constraint
x_ratio, y_ratio = 1/constraint.width, 1/constraint.height
result = []
for x,y in zip(*[iter(self.cords)] * 2):
nx = ((x-(constraint.width/2))*x_ratio)*2
ny = ((y-(constraint.height/2))*y_ratio)*2
result += [nx, ny]
print(x,y, '->', nx, ny)
return result
def complicate(self, constraint=None):
if not constraint: constraint = self.constraint
x_ratio, y_ratio = 1/constraint.width, 1/constraint.height
result = []
for x,y in zip(*[iter(self.cords)] * 2):
nx = ((x/x_ratio)/2)+(constraint.width/2)
ny = ((y/y_ratio)/2)+(constraint.height/2)
result += [nx, ny]
print(x,y, '->', nx, ny)
return result
def __iter__(self, *args, **kwargs):
return self.cords
def __repr__(self, *args, **kwargs):
return str(self.cords)
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v2i', coordinates((-0.975, -0.95, -0.925, -0.883)).complicate() )
)
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v2i', coordinates((10, 15, 30, 35)) )
)
您甚至可以通过根据 self.type
并始终 return 坐标进行猜测来构建 .complicate()
。
def __iter__(self, *args, **kwargs):
if self.type == 'normalized':
return self.complicate()
else:
return self.cords
我通常只处理一种对象,所以我可能不是这方面最好的老师。但这对我来说很有意义,希望它对你有用。祝你好运!
在 pyglet 图形文档中,它演示了如何使用屏幕坐标在 2d space 中绘制点
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v2i', (10, 15, 30, 35))
)
我希望能够使用标准化坐标进行绘制,每个轴上的坐标范围为 [-1, 1],但正常使用绘图调用时,我必须根据像素坐标给出顶点。
我想这样做的原因是我将绘制域和范围[-1, 1]的函数,所以使用归一化坐标绘制非常合适,而不必担心转换。
所以,假设我的数学是正确的(它肯定不是),这些函数应该return你正在寻找的东西:
def normalize(cords, constraint):
x_ratio, y_ratio = 1/constraint.width, 1/constraint.height
result = []
for x,y in zip(*[iter(cords)] * 2):
nx = ((x-(constraint.width/2))*x_ratio)*2
ny = ((y-(constraint.height/2))*y_ratio)*2
result += [nx, ny]
print(x,y, '->', nx, ny)
return result
def complicate(cords, constraint):
x_ratio, y_ratio = 1/constraint.width, 1/constraint.height
result = []
for x,y in zip(*[iter(cords)] * 2):
nx = ((x/x_ratio)/2)+(constraint.width/2)
ny = ((y/y_ratio)/2)+(constraint.height/2)
result += [nx, ny]
print(x, y, '->', nx, ny)
return result
您可以这样使用它们:
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v2i', normalize((10, 15, 30, 35), window))
)
或
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v2i', complicate((-0.975, -0.95, -0.925, -0.883), window))
)
您可能想要一种将两个世界存储在一个地方的通用方法。并将它们作为一个单一对象使用,无论您输入什么都有意义。因此您可以将归一化坐标和坐标视为同一事物。
您可以通过执行以下操作来做到这一点:
class cordinates():
def __init__(self, cords, constraint=None):
if not constraint: constraint = window
self.constraint = constraint
if min(cords) > -1 and max(cords) < 1:
self.type = 'normalized'
else:
self.type = 'complicated'
self.cords = cords
def normalize(self, constraint=None):
if not constraint: constraint = self.constraint
x_ratio, y_ratio = 1/constraint.width, 1/constraint.height
result = []
for x,y in zip(*[iter(self.cords)] * 2):
nx = ((x-(constraint.width/2))*x_ratio)*2
ny = ((y-(constraint.height/2))*y_ratio)*2
result += [nx, ny]
print(x,y, '->', nx, ny)
return result
def complicate(self, constraint=None):
if not constraint: constraint = self.constraint
x_ratio, y_ratio = 1/constraint.width, 1/constraint.height
result = []
for x,y in zip(*[iter(self.cords)] * 2):
nx = ((x/x_ratio)/2)+(constraint.width/2)
ny = ((y/y_ratio)/2)+(constraint.height/2)
result += [nx, ny]
print(x,y, '->', nx, ny)
return result
def __iter__(self, *args, **kwargs):
return self.cords
def __repr__(self, *args, **kwargs):
return str(self.cords)
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v2i', coordinates((-0.975, -0.95, -0.925, -0.883)).complicate() )
)
pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
('v2i', coordinates((10, 15, 30, 35)) )
)
您甚至可以通过根据 self.type
并始终 return 坐标进行猜测来构建 .complicate()
。
def __iter__(self, *args, **kwargs):
if self.type == 'normalized':
return self.complicate()
else:
return self.cords
我通常只处理一种对象,所以我可能不是这方面最好的老师。但这对我来说很有意义,希望它对你有用。祝你好运!