Python : Animation : เก็บข้อมูลไว้ใน Vector


import math

class Vector2():
 def __init__(self,x=0.,y=0.):
  self.x = x
  self.y = y
  if hasattr(x,"__getitem__") :
   x,y = x
   self._v = [float(x),float(y)]
  else :
   self._v = [float(x),float(y)]
  
  
 def __str__(self):
  return "Vector2D  x:{},y:{}".format(self.x,self.y)
  
 # creates Vector2 instance from 2 points
 @classmethod
 def create_from_points(self, P1, P2):
  return self(P2[0]-P1[0], P2[1]-P1[1])
  
 def magnitude(self):
  return math.sqrt(self.x*self.x + self.y*self.y)
  
 def get_unitvector(self):
  magnitude = self.magnitude()
  x = self.x/magnitude
  y = self.y/magnitude 
  return Vector2(x,y)
  
 def direction(self):
  uv = self.get_unitvector()
  return math.atan2(uv.y,uv.x) 
  
 def normalize(self):
  magnitude = self.magnitude()
  self.x /= magnitude
  self.y /= magnitude  
  
 #vector operations 
 def __neg__(self):
  #a vector with same magnitude but different direction
  return Vector2(-self.x,-self.y)
 
 def __add__(self,v2d):
  # vector + vector  = new vector
  return Vector2(self.x + v2d.x, self.y + v2d.y)
  
 def __sub__(self,v2d):
  # vector + vector  = new vector
  return Vector2(self.x - v2d.x, self.y - v2d.y)
  
 def __mul__(self,scalar):
  # vector multiply by a scalar value result is a new Vector2
  return Vector2(self.x*scalar,self.y*scalar) 

 def __truediv__(self,scalar):
  # vector multiply by a scalar value result is a new Vector2
  return Vector2(self.x / scalar, self.y / scalar) 

 def __getitem__(self,index):
  return self._v[index]
  
 def __setitem__(self,index,value):
  self._v[index] = 1.0 * value
  



if __name__ == "__main__" :
 a = (0,0)
 b = (5,5)
 c = (7,8)
 ab = Vector2.create_from_points(a,b)
 ac = Vector2.create_from_points(a,c)

 print("Vector AB : {}".format(ab)) 
 print("Vector AC : {}".format(ac)) 
 print("Vector AB + AC: {}".format(ab+ac)) 
 print("Vector AB - AC: {}".format(ab-ac)) 
 print("Vector AB * 2: {}".format(ab*2)) 
 print("Vector AB / 2: {}".format(ab / 2)) 











ยกตัวอย่างการใช้ Vector มาช่วยเรื่อง 2D animation เริ่มด้วยสร้าง Vector ขึ้นมา 2 Vectors  ใช้เก็บข้อมูลของ Object และ step หรือ speed การใช้ Vector เก็บข้อมูล speed ก็เพราะในเคลื่อนที่ 2 มิติจะต้องใช้ข้อมูลท้้งด้านแกน x และ แกน y ไปพร้อมกัน

if __name__ == "__main__" :
 step = Vector2(0.5,2.) # 0.5 steps on x axis, 2 steps on y axis
 position = Vector2(1,4) # start from (0,0)
 for i in range(10) :
  position += step # position vector steps
  print(position)



ความคิดเห็น