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)
ความคิดเห็น
แสดงความคิดเห็น