diff --git a/vectorized2d/vector2d.py b/vectorized2d/vector2d.py
index d33e6f6..f054ca7 100644
--- a/vectorized2d/vector2d.py
+++ b/vectorized2d/vector2d.py
@@ -84,6 +84,24 @@ class Vector2D(Array2D):
         new_direction = self.direction + rotation_angle
         return Vector2D(magnitude=self.norm, direction=new_direction)
 
+    @staticmethod
+    @njit
+    def _calc_angle_diff(direction_from: np.ndarray, direction_to: np.ndarray) -> np.ndarray:
+        raw_diff = direction_to - direction_from
+        diff = np.abs(raw_diff) % (2 * np.pi)
+        diff[diff > np.pi] = 2 * np.pi - diff[diff > np.pi]
+
+        mask = ((raw_diff >= -np.pi) & (raw_diff <= 0)) | ((raw_diff >= np.pi) & (raw_diff <= 2 * np.pi))
+        diff[mask] *= -1
+        return diff
+
+    def angle_to(self, v_towards: Vector2D):
+        """
+        Returns the angle between the current vector(s) and v_towards.
+        The angle is defined such that [(self.direction + angle) % 2*pi = v_towards.direction]
+        """
+        return self._calc_angle_diff(direction_from=self.direction, direction_to=v_towards.direction)
+
     @staticmethod
     @njit
     def _direction(v: Vector2D) -> np.ndarray:

Add "Calc angle between vectors" method to Vector2D
diff --git a/tests/test_vector2d.py b/tests/test_vector2d.py
index 75fd5f0..c400c54 100644
--- a/tests/test_vector2d.py
+++ b/tests/test_vector2d.py
@@ -107,3 +107,17 @@ def test_rotation():
     expected_angles = (direction + rotation) % 360
 
     assert np.allclose(np.rad2deg(v_rotated.direction), expected_angles)
+
+
+def test_angle_to():
+    direction = np.random.random(size=(5000,)) * randint(1, 360) + 1
+    rotation = np.random.random(size=(5000,)) * randint(-180, 180)
+    magnitude = np.random.random(size=(5000,)) * randint(1, 20) + 1
+
+    v = Vector2D(magnitude=magnitude, direction=direction, direction_units=Vector2D.Units.DEGREES)
+    v_rotated = v.rotated(rotation_angle=rotation, rotation_units=Vector2D.Units.DEGREES)
+    angle_diff = v.angle_to(v_rotated)
+    assert np.allclose(np.rad2deg(angle_diff), rotation)
+
+    angle_diff = v_rotated.angle_to(v)
+    assert np.allclose(np.rad2deg(angle_diff), -rotation)
\ No newline at end of file

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
3.8
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi==2025.1.31
charset-normalizer==3.4.1
codecov==2.1.13
coverage==7.6.1
exceptiongroup==1.2.2
fast-enum==1.3.0
idna==3.10
importlib_metadata==8.5.0
iniconfig==2.1.0
llvmlite==0.41.1
numba==0.58.1
numpy==1.24.4
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
pytest-cov==5.0.0
requests==2.32.3
tomli==2.2.1
urllib3==2.2.3
-e git+https://github.com/mishana/vectorized2d.git@2e7da39fab9afcea100a8b813de86db2f5922314#egg=vectorized2d
zipp==3.20.2

name: vectorized2d
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=24.2=py38h06a4308_0
  - python=3.8.20=he870216_0
  - readline=8.2=h5eee18b_0
  - setuptools=75.1.0=py38h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.44.0=py38h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - codecov==2.1.13
      - coverage==7.6.1
      - exceptiongroup==1.2.2
      - fast-enum==1.3.0
      - idna==3.10
      - importlib-metadata==8.5.0
      - iniconfig==2.1.0
      - llvmlite==0.41.1
      - numba==0.58.1
      - numpy==1.24.4
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytest-cov==5.0.0
      - requests==2.32.3
      - tomli==2.2.1
      - urllib3==2.2.3
      - zipp==3.20.2
prefix: /opt/conda/envs/vectorized2d

tests/test_vector2d.py::test_angle_to
tests/test_vector2d.py::test_create_single_vector_with_magnitude_and_direction tests/test_vector2d.py::test_create_multi_vector_with_vectors tests/test_vector2d.py::test_create_single_vector_with_direction_degrees tests/test_vector2d.py::test_create_multi_vector_with_vectors_degrees tests/test_vector2d.py::test_create_multi_vector_with_single_mag_multi_dir tests/test_vector2d.py::test_create_multi_vector_with_multi_mag_single_dir tests/test_vector2d.py::test_project_v1_onto_v2 tests/test_vector2d.py::test_direction tests/test_vector2d.py::test_rotation
vectorized2d/vector2d.py
vectorized2d/vector2d.py