Advertisement

python编程之 环绕卫星轨道

阅读量:

教材的第六章主要介绍了加载图片的方法及其相关的缩放、旋转等基本操作,并以一个环绕卫星DEMO为例进行展示

由于缺乏相关素材,在实施过程中飞船的环绕中心位置并非画面中央。我认为这可能与素材质量有关。如有错误,请批评指正。

未依照教材中的方案编写飞船旋转的代码,并非采用专业编程技巧;而是运用基础数学知识,在确定物体处于圆心位置的基础上计算所需角度值。草图如上所示,并不复杂。

在编写过程中,在您提供的三角函数的基础上进行操作时,在处理位置设置上会有相应的调整。总体思路就是如此。

源代码:

复制代码
 # -*- coding: utf-8 -*-

    
 """
    
 Created on Wed Jul  8 21:24:03 2015
    
   5. @author: liuchang
    
 """
    
  
    
 import random,math,pygame
    
 from pygame.locals import *
    
  
    
 #定义 坐标类
    
  
    
 def wrap_angle(angle):
    
     return angle%360
    
  
    
  
    
 def print_text(font,x,y,text,color=(255,255,255)):
    
     imgText=font.render(text,True,color)
    
     screen.blit(imgText,(x,y))
    
     
    
  
    
 class Point(object):
    
     def __init__(self,x,y):
    
     self.__x = x
    
     self.__y = y
    
     def getx(self):
    
     return self.__x
    
     def setx(self,x):
    
     self.__x = x
    
  
    
     x = property(getx,setx)     
    
     def gety(self):
    
     return self.__y
    
     def sety(self,y):
    
     self.__y = y
    
     y = property(gety,sety)
    
     
    
     def __str__(self):
    
     return "{X:"+"{:.0f}".format(self.x)+ \
    
     ",Y:"+"{:.0f}".format(self.y)+"}"
    
  
    
  
    
 pygame.init()
    
 screen = pygame.display.set_mode((1000,700))
    
 pygame.display.set_caption("orbit demo")
    
 font = pygame.font.Font(None,60)
    
 space = pygame.image.load("backnew.jpg").convert()
    
 planet = pygame.image.load("glazed.png").convert_alpha()
    
 ship = pygame.image.load("ship.png").convert_alpha()
    
 s_width,s_height = ship.get_size()
    
 width,height = planet.get_size()
    
 ship = pygame.transform.smoothscale(ship,(s_width//10,s_height//10))
    
  
    
 pos = Point(0,0)
    
 old_pos = Point(0,0)
    
 angle = 0.0
    
 #angle = wrap_angle(angle -0.1)
    
 radius = 250
    
  
    
 while True:
    
  
    
    
    
     for event in pygame.event.get():
    
     if event.type== QUIT:
    
         sys.exit()
    
     keys = pygame.key.get_pressed()
    
     if keys[K_ESCAPE]:
    
         sys.exit()
    
     #background        
    
     screen.blit(space,(0,0))
    
     #palnet
    
     screen.blit(planet,(500-width/2,350-height/2))
    
     #ship
    
     angle = wrap_angle(angle +0.1)#转动
    
     pos.x = math.cos(math.radians(angle))*radius
    
     pos.y = math.sin(math.radians(angle))*radius
    
     
    
     r_angle = -angle+180
    
     r_ship = pygame.transform.rotate(ship,r_angle)
    
     screen.blit(r_ship,(720+pos.x-width/2,550+pos.y-height/2))
    
     
    
     #screen.blit(ship,(50,50))
    
     print_text(font,0,20,"rotation:"+"{:.2f}".format(angle))
    
     print_text(font,400,20,"rotation angle:"+"{:.2f}".format(r_angle))
    
     pygame.display.update()

截图:

前期完成的这些小型演示项目相对容易,并不在意细节上的复杂性。重点应放在思想上以及具体实施环节中的细节处理上。希望在后续难度提升时也能保持稳定性。

全部评论 (0)

还没有任何评论哟~