Итак, предполагая, что моя математика верна (что, скорее всего, нет) , эти функции должны возвращать то, что вы ищете:
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)) )
)
Вы могли бы даже построить .complicate()
, выполняя догадки на основе self.type
и всегда возвращая координаты.
def __iter__(self, *args, **kwargs):
if self.type == 'normalized':
return self.complicate()
else:
return self.cords
Обычно я просто работаю с одним типом объекта, поэтому, возможно, я не лучший учитель в этом вопросе. Но это имеет смысл для меня, и, надеюсь, это полезно для вас. Желаем удачи!