{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "98c133a9",
   "metadata": {},
   "source": [
    "# 21-11 · Vector2 и точное движение\n",
    "\n",
    "Практика к разделу [«Точное движение с Vector2»](../../site/chapters/glava-21/21-11-vector2-tochnoe-dvizhenie.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f07bda88",
   "metadata": {},
   "source": [
    "## Цель\n",
    "\n",
    "Посчитать нормализацию вектора направления и ограничение позиции границами игрового поля — той же логикой, что использует Player.move()."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7982a2c6",
   "metadata": {},
   "source": [
    "## Рабочий пример"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ff23e122",
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
    "\n",
    "def normalizovat(dx, dy):\n",
    "    dlina = math.hypot(dx, dy)\n",
    "    if dlina == 0:\n",
    "        return (0.0, 0.0)\n",
    "    return (dx / dlina, dy / dlina)\n",
    "\n",
    "\n",
    "def zazhat_poziciyu(x, y, granicy):\n",
    "    levaya, verhnyaya, pravaya, nizhnyaya = granicy\n",
    "    return (max(levaya, min(x, pravaya)), max(verhnyaya, min(y, nizhnyaya)))\n",
    "\n",
    "\n",
    "nx, ny = normalizovat(1, 1)\n",
    "print(\"Нормализованный диагональный вектор:\", (nx, ny))\n",
    "print(\"Его длина:\", math.hypot(nx, ny))\n",
    "\n",
    "x, y = zazhat_poziciyu(-10, 1000, (0, 0, 480, 720))\n",
    "print(\"Позиция после ограничения:\", (x, y))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af0c2856",
   "metadata": {},
   "source": [
    "## Проверка результата"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "66a79b8e",
   "metadata": {},
   "outputs": [],
   "source": [
    "assert math.isclose(math.hypot(nx, ny), 1.0, abs_tol=1e-9)\n",
    "assert (x, y) == (0, 720)\n",
    "print(\"Верно: диагональ нормализована к единичной длине, позиция зажата в границах поля.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "023d9746",
   "metadata": {},
   "source": [
    "## Задание ★ Базовая практика\n",
    "\n",
    "Проверьте, что горизонтальное и нормализованное диагональное перемещения на одинаковой скорости и dt дают одинаковую длину пути."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ec91ff85",
   "metadata": {},
   "outputs": [],
   "source": [
    "SKOROST, DT = 200.0, 1 / 60\n",
    "\n",
    "pryamo = SKOROST * DT\n",
    "dx, dy = normalizovat(1, 1)\n",
    "diagonal = math.hypot(dx * SKOROST * DT, dy * SKOROST * DT)\n",
    "\n",
    "assert math.isclose(pryamo, diagonal, rel_tol=1e-9)\n",
    "print(\"Верно: нормализация делает диагональную скорость равной прямой, а не быстрее.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "language_info": {
   "name": "python",
   "version": "3.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
