Использование данных из массива в функции - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь на практике просто симулировать солнечную систему, но у меня небольшая проблема.

Я хочу сохранить данные простой планеты в массиве данных, а затем использовать данные изэтот массив для рисования планет.Однако я не могу заставить свои пользовательские функции правильно использовать данные.

Например, так хранятся данные.

# shape as type, size, orbitradius, startx, starty
solsystem = np.array([
                     ['sun', 2, 0, (screenx // 2), (screeny // 2)],
                     ['planet', 1, 200, 200, 200]
                     ])

Функция, которую я выполняюпытаясь использовать данные в.

class makebody():
    def new(btype, size, orbitradius, x, y):
        nbody = body()
        nbody.type = btype
        nbody.size = size
        nbody.orbitradius = orbitradius
        nbody.x = x
        nbody.y = y
        nbody.color = (0, 0, 255) #blue

        if (btype == 'sun'):
            nbody.color = (255, 255, 0)  #yellow

        return nbody

Я пытался

bvec = np.vectorize(makebody.new)
    body = bvec(solsystem)

И

for t, size, orbitradius, x, y in np.ndindex(solsystem.shape):
        body = makebody.new(t, size, orbitradius, x, y)

Но ни один из них не дает желаемого результата или работывообще по этому вопросу.Как бы я поступил так, или он даже не подходит для этой работы?

1 Ответ

0 голосов
/ 23 января 2019

Я бы использовал словарь или как в этом примере список кортежей.Просто и эффективно.Затем вы можете передать свой список классу, который создаст вашу солнечную систему, а затем вы можете легко получить доступ к своим планетам и атрибутам с помощью.нотация:


class Body:

    def __init__(self, data):
        # data represents one element of solsystem
        self.btype, self.size, self.orbitradius, self.x, self.y, self.color = data

    def __str__(self):
        return f'Name:\t{self.btype}\nSize:\t{self.size}\n' \
               f'Orbit Radius:\t{self.orbitradius}\nPosition:\t{self.x}, {self.y}\nColor:\t{self.color}'


class SolarSystem:

    def __init__(self, solsystem):
        self.bodies = dict()
        for data in solsystem:
            b = Body(data)
            self.bodies[b.btype] = b


if __name__ == '__main__':
    screenx = 600
    screeny = 600

    solsystem = [('sun', 2, 0, (screenx // 2), (screeny // 2), (255, 255, 0)),
                 ('earth', 1, 200, 200, 200, (0, 0, 255)),
                 ('mars', 1, 200, 200, 200, (255, 0, 0))]

    ss = SolarSystem(solsystem)

    print(ss.bodies['sun'])

    # Access attributes with e.g. ss.bodies['sun'].size for the size, etc...

Оператор print в конце вернет содержимое метода str :

Name:   sun
Size:   2
Orbit Radius:   0
Position:   300, 300
Color:  (255, 255, 0)

ss.bodies - это просто словарь со всемиваши планеты в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...