用 Phython 展示太阳系的运动模型

用 Phython 展示太阳系的运动模型

1,sun

静态图片展示

# init the Solar System Icons
ico_solar = pygame.image.load( "solar.jpg" )

2,sky

背景黑色,静态展示,叠加随机的星星

# draw sky
def draw_sky(sw_init):
    
    if sw_init:
        sw_init = False
        for i in range(1,50,1):
            rand_x = random.randint(1,790)
            rand_y = random.randint(1,790)
            star = [rand_x, rand_y]
            stars.append( star )
    else:
        # draw Sun
        playgd.blit( ico_solar, [pos_sun[0]-50,pos_sun[1]-50] )

        for star in stars :
            pygame.draw.rect( playgd, [255,255,255],[star[0],star[1],2,2],1 )

3,planet

行星的动画模型展示是绕太阳旋转的,每个行星可以设定不同的图形,旋转半径,起始位置,旋转速度

构造一个行星的类如下,包含初始化和每帧移动两个函数

class planet_m(pygame.sprite.Sprite):
    def __init__(self, img, loc, radius, spd ):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(img)
        self.rect = self.image.get_rect()
        self.pos = loc
        self.radius = radius
        self.speed = spd
        self.angle = 0
        print( "p_x="+str(self.pos[0])+";p_y="+str(self.pos[1]) )
        self.rect = self.rect.move( self.pos )
        
    def move( self ):
        
        delt_x = int( self.radius * cos( radians(self.angle) ) ) 
        delt_y = int( self.radius * sin( radians(self.angle) ) )
        self.angle += self.speed
        delt_x -= int( self.radius * cos( radians(self.angle) ) ) 
        delt_y -= int( self.radius * sin( radians(self.angle) ) ) 
        #print( "angle="+str(self.angle)+"; delt_x="+str(delt_x)+", delt_y="+str(delt_y) )
        self.rect = self.rect.move( [ -delt_x, delt_y])

4,planet circle

简化行星的公转轨迹为圆形,画出多个圆形的轨迹

    # draw tracks & planets
    for i in range(1,7,1):
        pygame.draw.circle( playgd, [50,50,50],pos_sun, 50+50*i,2 )

最终演示效果如下图所示