Могу ли я рисовать с использованием нормализованных координат в pyglet? - PullRequest
0 голосов
/ 29 апреля 2019

В графической документации pyglet показано, как рисовать точки в 2-мерном пространстве с использованием координат экрана

pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
    ('v2i', (10, 15, 30, 35))
)

Я хочу иметь возможность рисовать, используя нормализованные координаты, которые находятся в диапазоне от [-1, 1] на каждой оси, но, как правило, используя вызов отрисовки, я должен дать вершины в виде координат пикселей.

Причина, по которой я хочу это сделать, заключается в том, что я буду рисовать функции как домена, так и диапазона [-1, 1], поэтому очень удобно рисовать с использованием нормализованных координат и не нужно беспокоиться о преобразовании.

1 Ответ

0 голосов
/ 30 апреля 2019

Итак, предполагая, что моя математика верна (что, скорее всего, нет) , эти функции должны возвращать то, что вы ищете:

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

Обычно я просто работаю с одним типом объекта, поэтому, возможно, я не лучший учитель в этом вопросе. Но это имеет смысл для меня, и, надеюсь, это полезно для вас. Желаем удачи!

...