{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a2698a95",
   "metadata": {},
   "source": [
    "# DM 2024-25 : ellipses\n",
    "\n",
    "<!-- ## Consignes -->\n",
    "\n",
    "<!-- 1. Ce devoir est à rendre pour le **mercredi 07 mai 2025, dernier délai**, par email à julien.lavauzelle@univ-paris8.fr. -->\n",
    "<!-- 1. Vous pouvez rendre votre travail sous le format du document **.ipynb** correspondant à cette page, que vous téléchargez puis remplissez. Il est également possible de rendre votre travail sous la forme d'un ou plusieurs fichiers de script, auquel cas il faudra bien précisér en commentaire les numéros de questions. -->\n",
    "<!-- 1. Le travail **peut** être effectué par groupe de deux, auquel cas vous **devez** m'envoyer votre composition de binôme par email avant le **mercredi 16 avril 2025**, dernier délai. -->\n",
    "<!-- 1. **Important :** une fois votre travail rendu, vous devez être capable **d'expliquer précisément** toute réponse que vous y avez écrit. Vous pouvez être convoqués jusqu'au **vendredi 16 mai 2025** pour expliquer vos réponses. Si vous n'arrivez pas à expliquer l'une de vos réponses, la note de zéro sera donnée à l'ensemble du devoir. -->\n",
    "\n",
    "## Présentation du sujet\n",
    "\n",
    "Ce devoir contient **deux parties** relativement indépendantes, ayant pour thème commun les ellipses. Dans la première partie, on construit une ellipse passant par $5$ points génériques du plan. Dans la seconde, on modélise le déplacement d'une boule dans un billard de forme elliptique.\n",
    "\n",
    "Passons aux définitions formelles. Une ellipse est un cas particulier de conique. Une **conique** est une courbe du plan, qui a été historiquement introduite comme l'intersection d'un plan et d'un cône de révolution.\n",
    "\n",
    "On distingue **3 familles** principales de coniques (et quelques cas dégénérés). Ces familles se différencient par un paramètre réel positif appelé l'excentricité.\n",
    "1. Les **hyperboles** sont des coniques d'excentricité $e > 1$, elles sont formées de deux branches infinies.\n",
    "2. Les **paraboles** sont des coniques d'excentricité $e = 1$, elles sont formées d'une unique branche infinie.\n",
    "3. Les **ellipses** sont des coniques d'excentricité $e < 1$, elles sont formées d'une branche de longueur finie.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "Dans ce devoir, on s'intéressera uniquement au cas des **ellipses**.\n",
    "\n",
    "\n",
    "## Partie A : construction d'une conique passant par 5 points du plan\n",
    "\n",
    "L'objectif de cette partie est de réaliser concrètement, pour les ellipses, le théorème des cinq points de Pascal : \"par cinq points génériques du plan passe une unique conique\".\n",
    "\n",
    "\n",
    "Très généralement, une conique a pour **équation cartésienne** \n",
    "\n",
    "$$\n",
    "A x^2 + 2B xy + C y^2 + 2D x + 2E y + F = 0\n",
    "$$\n",
    "\n",
    "où $(A, B, C, D, E, F)$ sont $6$ paramètres réels dont au moins l'un des trois premiers est non-nul, et où $(x,y)$ est le couple abscisse/ordonnée d'un point de la conique.\n",
    "\n",
    "Par exemple, le cercle unité d'équation $x^2 + y^2 = 1$ est une conique de paramètres $(A, B, C, D, E, F) = (1, 0, 1, 0, 0, -1)$.\n",
    "\n",
    "On peut démontrer qu'une conique est une **ellipse** si et seulement si les paramètres $(A, B, C, D, E, F)$ vérifient les deux contraintes suivantes :\n",
    "\n",
    "$$\n",
    "    AC > B^2 \\quad \\text{ et } \\quad (BD-AE)^2 > (D^2 -AF)(B^2-AC)\n",
    "$$\n",
    "\n",
    "\n",
    "**Question 1.** Écrire une fonction `est_ellipse` qui prend en entrée une liste de $6$ paramètres, et qui teste si ces paramètres définissent une ellipse."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a1313e42",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39fc7a75",
   "metadata": {},
   "source": [
    "La fonction `implicit_plot` permet de dessiner une courbe plane par une équation cartésienne implicite. Par exemple, les droites d'équation $x = 1$ et $5y + 3x + 7 = 0$ peuvent être dessinées de la sorte :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c68e39f6",
   "metadata": {},
   "outputs": [],
   "source": [
    "var('x')\n",
    "var('y')\n",
    "D1 = implicit_plot(x-1, (x, -3, 3), (y, -3, 3))\n",
    "D2 = implicit_plot(5*y+3*x+7, (x, -3, 3), (y, -3, 3))\n",
    "D1.show()\n",
    "D2.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "13b3499b",
   "metadata": {},
   "source": [
    "Les arguments `(x, -3, 3)` et `(y, -3, 3)` précisent que, pour l'affichage, les variables $x$ et $y$ prennent des valeurs entre $-3$ et $3$.\n",
    "\n",
    "\n",
    "**Question 2.** Pour les paramètres suivants, décider si la conique est une ellipse, et si c'est le cas, l'afficher grâce à la fonction `implicit_plot`.\n",
    "1. $(A, B, C, D, E, F) = (1, 0, 1, 0, 0, -4)$\n",
    "2. $(A, B, C, D, E, F) = (0, 2, 0, 1, 1, -1)$\n",
    "3. $(A, B, C, D, E, F) = (4, 1, 2, 1, 1, -4)$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dce8f84b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a08bf394",
   "metadata": {},
   "source": [
    "Le **théorème des cinq points**, démontré notamment par Blaise Pascal, affirme qu'il existe une unique conique passant par cinq points qui ne sont pas trois à trois alignés.\n",
    "\n",
    "On rappelle que trois points $P, Q, R$ du plan sont alignés si la matrice formée des vecteurs $\\overrightarrow{PQ}$ et $\\overrightarrow{PR}$ n'est pas inversible. Autrement dit, si l'égalité\n",
    "\n",
    "$$\n",
    "    (x_Q-x_P)(y_R-y_P) = (y_Q-y_P)(x_R-x_P) \n",
    "$$\n",
    "\n",
    "est satisfaite.\n",
    "\n",
    "\n",
    "**Question 3.**\n",
    "1. Écrire une fonction qui teste si 3 points du plan $P$, $Q$ et $R$ sont alignés.\n",
    "2. Écrire une fonction qui teste si une liste de 5 points contient, parmi ces 5 points, 3 points alignés.\n",
    "3. Afficher les $5$ points du plan suivants (avec la fonction `points` vue en cours), puis vérifier que $3$ des points sont bien alignés :\n",
    "\n",
    "$$\n",
    "    P_1 = (0, 1) \\quad P_2 = (2, -3) \\quad P_3 = (3, 2) \\quad P_4 = (-1, -4) \\quad P_5 = (-3, 0)\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5c370df4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d11ecfff",
   "metadata": {},
   "source": [
    "Pour obtenir les paramètres $(A, B, C, D, E, F)$ de l'équation d'une conique qui passe par $5$ points, il \"suffit\" de résoudre le système d'équations correspondant. Si les points sont notés $P_i = (x_i, y_i)$ pour $i = 1, ..., 5$, alors les $5$ équations à satisfaire pour que l'ellipse passe par les $5$ points sont :\n",
    "\n",
    "$$\n",
    "    A \\cdot x_i^2 + B \\cdot 2x_i y_i + C \\cdot y_i^2 + D \\cdot 2x_i + E \\cdot 2y_i + F = 0, \\quad \\forall i \\in \\{ 1, \\dots, 5 \\}\n",
    "$$\n",
    "\n",
    "où les **inconnues** du système sont les paramètres $(A, B, C, D, E, F)$ de l'ellipse.\n",
    "\n",
    "\n",
    "\n",
    "**Question 4.** Écrire une fonction qui prend en entrée $5$ points que l'on suppose non trois-à-trois alignés, et qui retourne une solution du système linéaire décrit plus haut."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d924e010",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "396a8802",
   "metadata": {},
   "source": [
    "**Question 5.** Déduire des questions précédentes une fonction qui, étant donné cinq points du plan, retourne l'équation d'une **ellipse** (donc, un cas particulier de conique) passant par $5$ points, et ce uniquement lorsqu'elle est unique, c'est-à-dire :\n",
    " - lorsque les 5 points donnés ne contiennent pas 3 points alignés,\n",
    " - lorsque la conique construite forme bien une ellipse.\n",
    "Votre fonction retournera `None` si les conditions ci-dessus ne sont pas respectées."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fadf3d8e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1537139b",
   "metadata": {},
   "source": [
    "**Question 6.** Construire l'ellipse passant par les points : $(0,-1), (0,1), (0.8, -0.9), (1,0), (-1,0)$. Puis, afficher sur un même graphique ces $5$ points (en rouge) et l'ellipse correspondant (en bleu)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7e1b2ba2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b6ad5f1",
   "metadata": {},
   "source": [
    "On pourra également construire les ellipses associées aux points suivants :\n",
    "- $(-2,-1), (-1,-1.1), (1, -0.6), (1,0.8), (0,1.2)$ ;\n",
    "- $(-0.2, 2.6), (0.3, 1.8), (0.4, 0.1), (0.2, -1.9), (-0.1,-1)$.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "## Partie B : billard elliptique\n",
    "\n",
    "Le but de cette partie est de répondre à la problématique suivante. On se donne un **billard de forme elliptique**, et on lance une boule au hasard, en supposant que le roulement est parfait (elle ne s'arrête jamais) et que les rebonds sur les bords du billard sont idéaux. Cette boule passera-t-elle par toutes les régions du billard ? \n",
    "\n",
    "![rebonds-billard-1](../../images/rebonds-billard-1.gif)\n",
    "![rebonds-billard-2](../../images/rebonds-billard-2.gif)\n",
    "\n",
    "\n",
    "Pour simplifier les calculs, on se place dans le contexte d'un ellipse **centrée** et **réduite**, c'est-à-dire telle que le centre de l'ellipse se trouve à l'origine du plan, et telle que les axes principaux de l'ellipse sont les axes des abscisses et des ordonnées.\n",
    "\n",
    "L'équation cartésienne d'une telle ellipse peut alors s'écrire plus simplement :\n",
    "\n",
    "$$\n",
    "\\frac{x^2}{a^2} + \\frac{y^2}{b^2} = 1\n",
    "$$\n",
    "\n",
    "avec par exemple $a > b > 0$ deux paramètres réels. On note $E_{a, b}$ cette ellipse.\n",
    "\n",
    "\n",
    "**Question 7.** Écrire une fonction `point_aleatoire(a, b)` qui retourne un point aléatoire de l'ellipse $E_{a,b}$. On ne cherchera pas à rendre ce tirage uniforme. Puis, afficher en noir $10$ points tirés aléatoirement sur l'ellipse $E_{2, 1}$, elle-même affichée en bleu."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8321542b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "187d5b2f",
   "metadata": {},
   "source": [
    "Soit $P = (x_P, y_P)$ un point de l'ellipse $E_{a,b}$ et ${\\bf v} = (v_1, v_2)$ un vecteur non-nul. Ces deux éléments définissent la droite passant par $P$ et de vecteur directeur ${\\bf v}$ : ce sont les points du plan de la forme $P + t {\\bf v}$, où $t \\in \\mathbb{R}$.\n",
    "\n",
    "Si le vecteur ${\\bf v}$ n'est pas tangent à l'ellipse, alors cette droite coupe l'ellipse en un second point $Q$. Les coordonnées de $Q$ sont alors de la forme $(x_Q, y_Q) = (x_P + t v_1, y_Q + t v_2)$ avec $(x_Q/a)^2 + (y_Q/b)^2 = 1$.\n",
    "\n",
    "Pour trouver les coordonnées de $Q$, il suffit donc de résoudre l'équation du second degré en la variable réelle $t$ :\n",
    "\n",
    "$$\n",
    "    \\left(\\frac{x_P + t v_1}{a}\\right)^2 + \\left(\\frac{y_P + t v_2}{b}\\right)^2 = 1\\,. \n",
    "$$\n",
    "\n",
    "Cette équation peut être résolue par Sagemath, ou bien avec des calculs impliquant un discriminant et une racine carrée.\n",
    "\n",
    "\n",
    "\n",
    "**Question 8.** Écrire une fonction `intersection(a, b, P, v)` qui, à partir d'un point $P \\in E_{a,b}$ et d'un vecteur ${\\bf v}$ partant de $P$ dirigé vers l'intérieur de l'ellipse, calcule les cooordonnées du second point d'intersection $Q$ entre l'ellipse et la droite définie par le couple $(P, {\\bf v})$. \n",
    "\n",
    "Puis, tester la fonction par un affichage graphique des points $P$ et $Q$ et du segment $PQ$, pour les valeurs suivantes : $a = 2$, $b = 1$, $P = (-1, -\\sqrt{3}/2)$, ${\\bf v} = (1, 1)$. \n",
    "\n",
    "Pour afficher un segment $PQ$, on utilise la fonction d'affichage `line([P, Q])`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6d37c9c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e5ae11b",
   "metadata": {},
   "source": [
    "On veut maintenant simuler un rebond de la boule de billard sur le bord de l'ellipse. Supposons que la boule parte d'un point $P$, et se déplace rectilignement selon un vecteur directeur ${\\bf v}$. À son arrivée au bord du billard (disons, en un point $Q$ de l'ellipse), la boule rebondira de manière **symétrique** par rapport à la normale à l'ellipse, calculée en $Q$. Ainsi, après rebond, le nouveau vecteur incident ${\\bf v'}$ doit être tel que la droite normale à l'ellipse forme une **médiatrice** de l'angle obtenu par les vecteurs ${\\bf v}$ et ${\\bf v'}$ au point de contact avec l'ellipse.\n",
    "\n",
    "\n",
    "![image-rebond-billard](../../images/billard-devoir2025.png)\n",
    "\n",
    "<!-- <only student> -->\n",
    "<!-- ![image-rebond-billard](../../images/billard-devoir2025.png) -->\n",
    "<!-- <endonly> -->\n",
    "\n",
    "<!-- <only teacher> -->\n",
    "<!-- ```{code-cell} -->\n",
    "<!-- uu = vector( [-2*Q[1]/b**2, 2*Q[0]/a**2] ).normalized() -->\n",
    "<!-- nn = vector( [ 2*Q[0]/a**2, 2*Q[1]/b**2]  ).normalized() -->\n",
    "\n",
    "<!-- PLOT = implicit_plot(x**2/a**2 + y**2/b**2 - 1, (x, -3, 3), (y, -2, 2)) -->\n",
    "<!-- PLOT += points([P, Q], color=\"black\", size=40) -->\n",
    "<!-- PLOT += line([P, Q], color=\"black\", thickness=0.5, linestyle=\"--\") -->\n",
    "<!-- PLOT += arrow(Q, Q+uu, color='green', arrowsize=2) -->\n",
    "<!-- PLOT += arrow(Q, Q+nn, color='green', arrowsize=2) -->\n",
    "<!-- PLOT += line([Q - 3*nn, Q+2*nn], color='green', thickness=0.5, linestyle=\"--\") -->\n",
    "<!-- M = matrix([uu, nn]).transpose() -->\n",
    "<!-- sol = M.solve_right(v) -->\n",
    "<!-- v_prime = sol[0] * uu - sol[1] * nn -->\n",
    "<!-- PLOT += arrow(Q, Q+1.2*v_prime.normalized(), color='black', arrowsize=2, width=1) -->\n",
    "<!-- PLOT += arrow(P, P+1.2*v.normalized(), color='black', arrowsize=2, width=1) -->\n",
    "<!-- PLOT += text(\"P\", P + vector([-0.2,-0.2]), color=\"black\") -->\n",
    "<!-- PLOT += text(\"Q\", Q + vector([0.2,0.15]), color=\"black\") -->\n",
    "<!-- PLOT += text(\"v\", P + vector([-0.1,0.1]) + 0.5*v.normalized(), color=\"black\") -->\n",
    "<!-- PLOT += text(\"v'\", Q + vector([0.2,0]) + 0.5*v_prime.normalized(), color=\"black\") -->\n",
    "<!-- PLOT += text(\"n\", Q + vector([-0.2,0]) + 1.1*nn, color=\"green\") -->\n",
    "<!-- PLOT += text(\"u\", Q + vector([0,0.1]) + 1.1*uu, color=\"green\") -->\n",
    "\n",
    "<!-- PLOT.show(figsize=6) -->\n",
    "<!-- ``` -->\n",
    "<!-- <endonly> -->\n",
    "\n",
    "\n",
    "Pour effectuer la simulation du rebond, l'idée est d'exprimer le vecteur incident ${\\bf v}$  dans la base orthogonale $({\\bf u}, {\\bf n})$ donnée par le vecteur tangent ${\\bf u}$ et le vecteur normal ${\\bf n}$ au point de contact avec l'ellipse.\n",
    "\n",
    "Ces vecteurs ont pour coordonnées\n",
    "\n",
    "$$\n",
    "    {\\bf u} = \\left(-\\frac{2 y_P}{b^2}, \\frac{2 x_P}{a^2}\\right) \\quad \\text{ et } \\quad {\\bf n} = \\left(\\frac{2 x_P}{a^2}, \\frac{2 y_P}{b^2}\\right)\n",
    "\n",
    "$$\n",
    "\n",
    "Une fois ${\\bf v}$ exprimé dans cette base, par exemple sous l'écriture ${\\bf v} = \\alpha {\\bf u} + \\beta {\\bf n}$, un vecteur dirceteur du rebond est alors\n",
    "\n",
    "$$\n",
    "    {\\bf v'} = \\alpha {\\bf u} - \\beta {\\bf n}\\,.\n",
    "$$\n",
    "\n",
    "\n",
    "Rappelons enfin que pour exprimer ${\\bf v}$ dans une base $({\\bf u}, {\\bf n})$, il suffit de résoudre un système linéaire approprié.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Question 9.** Écrire une fonction `changement_base(a, b, P, v)` qui retourne les coordonnées $(\\alpha, \\beta)$ de ${\\bf v}$ dans la base orthogonale $({\\bf u}, {\\bf n})$ définie ci-dessus. Pour tester sa solution, on pourra vérifier que les vecteurs $\\alpha {\\bf u} + \\beta {\\bf n}$ et ${\\bf v}$ sont égaux."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cb463261",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c71f1604",
   "metadata": {},
   "source": [
    "**Question 10.** Écrire une fonction `reflexion(a, b, P, v)` qui calcule ${\\bf v'}$, la réflexion d'un vecteur d'incidence ${\\bf v}$, au niveau d'un point $P$ de l'ellipse $E_{a,b}$. Illustrer la réflexion obtenue par un affichage graphique."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ce314d56",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "633e89ec",
   "metadata": {},
   "source": [
    "**Question 11.** À partir de toutes ces fonctions, écrire une procédure qui affiche les rebonds successifs d'une boule dans un billard elliptique. On affichera une vingtaine de rebonds."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c8376b47",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6098bf48",
   "metadata": {},
   "source": [
    "**Questions bonus.**\n",
    "1. Essayer d'afficher plusieurs centaines de rebonds... Si cela ne fonctionne pas, il faudra peut-être passer par des approximations, et rendre plus explicites les calculs (éviter les `solve`) : pour cela, convertissez toutes vos données en des nombres flottants à grande précision (par exemple, $1000$ bits).\n",
    "2. Les 2 foyers de l'ellipse sont les points de coordonnées $(-\\sqrt{a^2-b^2}, 0)$ et $(\\sqrt{a^2-b^2}, 0)$. Que se passe t-il si la boule passe par l'un des foyers de l'ellipse ?\n",
    "3. Répondre expérimentalement à la question d'origine : la boule de billard passera-t-elle par tous les points du billard ? Pour un billard et une position d'origine donnée (au bord du billard), on pourra identifier deux comportements typiques selon la première trajectoire."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Sagemath",
   "language": "python",
   "name": "sagemath"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
