我正在尝试进行简单的太阳系模拟,但是遇到一个小问题。
我想将简单的行星数据存储在numpy数组中,然后使用该数组中的数据绘制行星。但是,我似乎无法获得自定义函数来正确使用数据。
例如,这就是数据的存储方式。
# 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)
但是,这些方法都无法达到预期的效果,或者根本无法解决问题。我将如何去做,还是numpy甚至不是这项工作的正确工具?
答案 0 :(得分:0)
我将使用字典或在此示例中使用元组列表。简单有效。然后,您可以将列表输入到类中并生成太阳系,然后可以使用轻松访问行星和属性。表示法:
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...
最后的打印语句将返回 str 方法的内容:
Name: sun
Size: 2
Orbit Radius: 0
Position: 300, 300
Color: (255, 255, 0)
ss.bodies只是一本列出所有行星的字典。