File size: 3,191 Bytes
28ac2ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# swarm_mind_v1/vector.py
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() # Sıfıra bölme hatasını önle
        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 # Zincirleme için kendini döndür

    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 # Zincirleme için kendini döndür

    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))