|
|
|
import math
|
|
import random
|
|
|
|
class Vector2D:
|
|
"""2 Boyutlu Vektör Sınıfı."""
|
|
def __init__(self, x=0.0, y=0.0):
|
|
self.x = x
|
|
self.y = y
|
|
|
|
def __str__(self):
|
|
"""Vektörün string temsilini döndürür."""
|
|
return f"Vector2D({self.x:.2f}, {self.y:.2f})"
|
|
|
|
def __add__(self, other):
|
|
"""Vektör toplama (+) operatörü."""
|
|
return Vector2D(self.x + other.x, self.y + other.y)
|
|
|
|
def __sub__(self, other):
|
|
"""Vektör çıkarma (-) operatörü."""
|
|
return Vector2D(self.x - other.x, self.y - other.y)
|
|
|
|
def __mul__(self, scalar):
|
|
"""Skaler ile çarpma (*) operatörü."""
|
|
return Vector2D(self.x * scalar, self.y * scalar)
|
|
|
|
def __truediv__(self, scalar):
|
|
"""Skaler ile bölme (/) operatörü."""
|
|
if scalar == 0:
|
|
return Vector2D()
|
|
return Vector2D(self.x / scalar, self.y / scalar)
|
|
|
|
def magnitude_squared(self):
|
|
"""Vektörün büyüklüğünün karesini döndürür (sqrt daha yavaştır)."""
|
|
return self.x * self.x + self.y * self.y
|
|
|
|
def magnitude(self):
|
|
"""Vektörün büyüklüğünü (uzunluğunu) döndürür."""
|
|
mag_sq = self.magnitude_squared()
|
|
if mag_sq == 0:
|
|
return 0.0
|
|
return math.sqrt(mag_sq)
|
|
|
|
def normalize(self):
|
|
"""Vektörü birim vektöre dönüştürür (büyüklüğü 1 yapar)."""
|
|
mag = self.magnitude()
|
|
if mag > 0:
|
|
self.x /= mag
|
|
self.y /= mag
|
|
return self
|
|
|
|
def get_normalized(self):
|
|
"""Vektörün normalize edilmiş bir kopyasını döndürür."""
|
|
mag = self.magnitude()
|
|
if mag == 0:
|
|
return Vector2D()
|
|
return Vector2D(self.x / mag, self.y / mag)
|
|
|
|
def limit(self, max_magnitude):
|
|
"""Vektörün büyüklüğünü verilen maksimum değerle sınırlar."""
|
|
if self.magnitude_squared() > max_magnitude * max_magnitude:
|
|
self.normalize()
|
|
self.x *= max_magnitude
|
|
self.y *= max_magnitude
|
|
return self
|
|
|
|
def distance_squared(self, other):
|
|
"""İki vektör arasındaki mesafenin karesini döndürür."""
|
|
dx = self.x - other.x
|
|
dy = self.y - other.y
|
|
return dx * dx + dy * dy
|
|
|
|
def distance(self, other):
|
|
"""İki vektör arasındaki mesafeyi döndürür."""
|
|
return math.sqrt(self.distance_squared(other))
|
|
|
|
def set_magnitude(self, magnitude):
|
|
"""Vektörün büyüklüğünü ayarlar."""
|
|
self.normalize()
|
|
self.x *= magnitude
|
|
self.y *= magnitude
|
|
return self
|
|
|
|
def heading(self):
|
|
"""Vektörün açısını (radyan cinsinden) döndürür."""
|
|
return math.atan2(self.y, self.x)
|
|
|
|
@staticmethod
|
|
def random_vector():
|
|
"""Rastgele bir yönü olan birim vektör oluşturur."""
|
|
angle = random.uniform(0, 2 * math.pi)
|
|
return Vector2D(math.cos(angle), math.sin(angle)) |