changeset 20:51e09ccbfd4e

Fixed that evil heading bug committer: Jeff Sipek <jeffpc@jeff.(none)> 1121307898 -0400
author Jeff Sipek <jeffpc@jeff.(none)>
date Thu, 14 Jul 2005 02:24:58 -0400
parents ed6ca4ee664c
children 4c026c5634f9
files atc_plane.py
diffstat 1 files changed, 26 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/atc_plane.py	Sat Jul 09 03:44:01 2005 -0400
+++ b/atc_plane.py	Thu Jul 14 02:24:58 2005 -0400
@@ -107,9 +107,8 @@
 	def complete_vel(self, ijk=None, hac=None):
 		""" Recalculate all the velocity variables """
 		if ijk == None and hac == None:
-			print "Nothing calculated"
 			return
-		
+
 		if ijk == None:
 			self.vel["i"] = sin(atc_utils.torad(self.vel["heading"])) * sqrt(self.vel["speed"]**2 - self.vel["climb"]**2)
 			self.vel["j"] = cos(atc_utils.torad(self.vel["heading"])) * sqrt(self.vel["speed"]**2 - self.vel["climb"]**2)
@@ -133,10 +132,10 @@
 		
 		# FIXME: need physics
 		if (self.targetPos["Z"] != None) and (self.pos["Z"] >= (self.targetPos["Z"] - 25)) and (self.pos["Z"] <= (self.targetPos["Z"] + 25)):
-			self.vel["k"] = 0
+			self.vel["climb"] = 0
 			self.targetPos["Z"] = None
 			
-			self.complete_vel(ijk=1)
+			self.complete_vel(hac=1)
 		
 		#if (self.pos["X"] < 0) or (self.pos["Y"] < 0): # FIXME: max values
 		#	self.status = plane_RANGE
@@ -151,20 +150,32 @@
 		self.rect.move(m2pix(self.vel["i"])/10.0,m2pix(self.vel["j"])/10.0)
 		
 		self.timer = time.time() + m2pix(self.vel["speed"])**-1/10.0
-		
+
 	def calc_head(self):
-		""" Calculate heading of the airplane (in radians)"""
+		""" Calculate heading of the airplane (in degrees)"""
 		if (self.vel["i"] == self.vel["j"] == 0): # no movement
 			return 0
-		
+	
 		try:
-			head = fabs(atan(self.vel["i"]/-self.vel["j"]))
+			head = fabs(atan(self.vel["i"]/self.vel["j"]))	# yes this is "backwards"
 		except ZeroDivisionError:
 			if (self.vel["i"]>0):
-				return 90	# east
-			return 270		# west
+				return 90        		# east
+			return 270               		# west
 		
-		return head*180.0/pi
+		head = abs(head*180/pi)
+		if self.vel["i"]>0 and self.vel["j"]>0:		# quad I
+			return head
+		if self.vel["i"]<0 and self.vel["j"]>0:		# quad II
+			return 360-head
+		if self.vel["i"]<0 and self.vel["j"]<0:		# quad III
+			return 270-head
+		if self.vel["i"]>0 and self.vel["j"]<0:		# quad IV
+			return 180-head
+	
+		if self.vel["i"]==0 and self.vel["j"]>0:	# north
+			return 0
+		return 180					# south
 	
 	def calc_geo(self, xy, prefix):
 		""" Return a geographic coodrinate-formated xy """
@@ -189,10 +200,10 @@
 		if (parts[0] == "ALT"):
 			print "Changing altitude to " + parts[1] + "m"
 			self.targetPos["Z"] = int(parts[1])
-			self.vel["k"] = self.specs["climb_normal"]
+			self.vel["climb"] = self.specs["climb_normal"]
 			if (self.pos["Z"] > self.targetPos["Z"]):
-				self.vel["k"] *= -1
-			self.complete_vel(ijk=1)
+				self.vel["climb"] *= -1
+			self.complete_vel(hac=1)
 			
 		if (parts[0] == "HEAD"):
 			self.vel["heading"] = int(parts[1])
@@ -212,7 +223,7 @@
 	
 	def display(self,screen):
 		""" Put everything onto the screen """
-		rotimage = pygame.transform.rotate(self.image, 360-self.vel["heading"])
+		rotimage = pygame.transform.rotate(self.image, 360.0-self.vel["heading"])
 		screen.blit(rotimage, (int(1024/2+m2pix(self.pos["X"])), int(768/2-m2pix(self.pos["Y"]))))
 		
 		# Plane info