Académique Documents
Professionnel Documents
Culture Documents
Références
Exercice 1
Implémenter un algorithme qui prend comme entrée trois points dans le plan.
vérifie que
ils forment un triangle et si l’intérieur du triangle contient l’origine (0, 0) ou
non.
Dépendances
Python 3.7.6
Utilisation
$ python q1/main.py
Contexte
● Trois points forment un triangle si l’aire de la forme qu’ils forment est > 0.
● Que A, B, C soient les sommets d’un triangle, et P un point. Que
A0,A1,A2,A3 soit la zone des triangles ABC, PBC, PAC, PAB
respectivement. Ensuite, le point P se trouve à l’intérieur du triangle ABC
iff A0 = A1+A2+A3.
Approche
Les énoncés susmentionnés sont traduits en code.
Pour vérifier si trois points forment un triangle, on utilise la fonction area() qui
calcule l’aire du triangle formé par les trois points
donnés. Si la valeur retournée est supérieure à zéro, alors
la réponse est oui. C’est exactement ce que la fonction
isTriangle() vérifie.
Pour le second problème, nous avons implémenté la fonction
containsOrigin() qui prend trois points en entrée et retourne true si le triangle
formé contient l’origine de l’axe. La façon dont il est fait est basée sur la deuxième
instruction d’en haut, en utilisant l’origine (0,0) comme point P. Initialement, les
zones des quatre triangles sont calculés. Si l’aire du grand triangle est égale à la
somme des aires des trois petits triangles, alors l’origine de l’axe est contenue dans
le triangle ABC.
Exemple 1
Les sommets C et B sont identiques, de sorte que la sortie attendue est que
les points A, B et C ne forment pas un triangle.
Exemple 2
Les sommets C sont dans la ligne AB, de sorte que la sortie attendue est encore
que les points A, B et C ne forment pas un triangle.
Exemple 3
Exemple 4
Avec un cercle de rayon r dans le plan avec (0, 0) comme centre, implémenter
un
algorithme qui trouve les points du réseau total sur la circonférence. Treillis
Les points sont des points avec des coordonnées entières.
Mise en œuvre
lattice_points.py
Instructions d’exécution
$ python3 lattice.py
Si un nombre positif est donné comme rayon r, le programme trouve les points
de réseau du cercle, les imprime et les trace également dans une figure qui est
également enregistrée comme « lattice_points.png ». Pour terminer l’application,
l’utilisateur doit fermer la fenêtre de figure qui apparaît.
Dépendances
matplotlib (pip3 install matplotlib)
La bibliothèque est utilisée pour créer un tracé du cercle avec le centre (0,0) et le
rayon r et ses points en treillis. Le cercle est de couleur bleue et ses points en
treillis sont de couleur rouge. Les coordonnées du centre et des points du réseau
sont également imprimées dans le graphique.
Idée de base et concept
L’équation d’un cercle avec le centre (0,0) et le rayon r est la suivante :
Soit xL, yL soit les coordonnées d’un point de réseau (aléatoire) P du cercle. Puisque L est un
point du cercle :
⇒
En outre, par la définition des points de réseau :
Dans la 1ère édition de l’algorithme des points de réseau, nous calculons dans la même répétition
si un point (x,y) et son point symétrique sur l’axe des x (x,-y) sont des points de réseau.
Ainsi, la 1ère édition de l’algorithme est basée sur l’implication suivante (symétrie du
cercle à travers l’axe des x) :
Pour éviter de compter chacun des points (-r,0) et (r,0) deux fois, on vérifie si
y>0.
La 2ème édition de l’algorithme est basée sur l’implication suivante (symétrie du cercle sur l’axe
y) :
e édition
Lattice Points : 3
pour x := 0 au sol (r/ 2) :
x
y := r2 2
si isInteger(y ) :
(x,y) est un point de réseau
(y,x) est un point de réseau
(x,-y) est un point de réseau
(-y,x) est un point en treillis
si x>0 :
(-x,y) est un point de réseau
(y,-x) est un point de réseau
(-x,-y) est un point en treillis
(-y,-x) est un point en treillis
La 3ème édition de l’algorithme est basée sur l’implication suivante (symétrie du cercle à travers
la ligne y=x) :
Ainsi, alors que dans la 2ème édition nous vérifiions un quatuor, dans la 3ème édition nous
vérifions une octante.
Il n’est pas nécessaire de vérifier si y>0 comme nous l’avons fait dans la 2ème
édition, puisque nous travaillons dans la 2ème octante, ce qui signifie que r / 2 y
r.
NOTA : Tous les chiffres qui sont représentés dans un ordinateur ont le
formulaire.
± 2e * nombre . Donc r sera un nombre rationnel positif.
e édition
Lattice Points : 4
si isNotInteger(r) :
Il n’y a pas de réseau.
mettre fin à
pour x := 0 au sol (r/ 2) :
y := r2 x2
si isInteger(y) :
(x,y) est un point de réseau
(y,x) est un point de réseau
(x,-y) est un point de réseau
(-y,x) est un point en treillis
si x>0 :
(-x,y) est un point de réseau
(y,-x) est un point de réseau
(-x,-y) est un point en treillis
(-y,-x) est un point en treillis
⇒
Nous sommes encore une fois basés sur le fait que le rayon donné ne peut pas
être un nombre irrationnel.
Épreuves mathématiques
Que (x , y) soit un point en treillis :
et
et
, depuis
et
, depuis
et
⇒
d soit le dernier chiffre non nul de la partie décimale de r. Ensuite
d2mod 10 = 0 (S)
depuis d2mod 10 sera dans la partie décimale de r2 , que nous voulons être
0.
❖ d = 1 d2 = 1 d2mod 10 = 1 =/ 0
❖ d = 2 d2 = 4 d2mod 10 = 4 =/ 0
❖ d = 3 d2 = 9 d2mod 10 = 9 =/ 0
❖ d = 4 d2 = 16 d2mod 10 = 6 =/ 0
❖ d = 5 d2 = 25 d2mod 10 = 5 =/ 0
❖ d = 6 d2 = 36 d2mod 10 = 6 =/ 0
❖ d = 7 d2 = 49 d2mod 10 = 9 =/ 0
❖ d = 8 d2 = 64 d2mod 10 = 4 =/ 0
❖ d = 9 d2 = 81 d2mod 10 = 1 =/ 0
Donc, d2mod 10 =/ 0 .
d2mod 10 =/ 0 ⇒
Est vrai comme le contre-positif de la phrase S.
Par conséquent, .
Étant donné que la multiplication est fermée dans l’ensemble et
.
Maintenant, laissez .
Maintenant, laissons
Puisque la multiplication est fermée dans
l’ensemble et .
contradiction Donc,
Exercice 3
Dépendances
● Python 3.7.6
● matplotlib
● numpy
Utilisation
$ python q3/main.py
Contexte
● La coque convexe d’une forme est le plus petit ensemble convexe qui la
contient. Il peut être visualisé comme la forme enfermée par un élastique
étiré autour d’un sous-ensemble délimité d’une planète.
● Algorithme convexe incrémental de coque idée de base : Tout d’abord
prendre un sous-ensemble de l’entrée assez petite pour que le
problème est facilement résolu. Puis, un par un, ajouter les éléments
restants tout en maintenant la solution à chaque étape.
● Tangente au Polygone : une ligne qui la touche sans franchir sa limite.
● Pour un polygone convexe, il y a exactement deux tangentes uniques
à partir d’un point en dehors du polygone.
Approche
Nous définissons une classe nommée Point dans Point.py, afin de représenter
les points dans le plan 2D.
L’algorithme est implémenté dans main.py. Dans le but de former l’ensemble
d’entrée, 20 points d’échantillonnage aléatoires sont créés.
Au départ, les points sont triés en fonction de leur coordonnée x. Ensuite, les
trois premiers points sont choisis de manière à commencer par un problème
trivial comme celui d’un triangle. Évidemment, la coque convexe d’un triangle
est composée de tous ses bords.
Ensuite, nous ajoutons le reste des points un par un. Pour chaque point P,
nous travaillons comme suit :
k)
Notez que, lors de la recherche de la Tangente inférieure, les points qui sont
visités mais ne sont pas des points de tangence, sont retirés de la coque.
isRightOf() .
En fin de compte, les points et la coque convexe sont tracés pour
nous donner une représentation visuelle des résultats.
Mise en œuvre
gift_wrap.py
Instructions d’exécution
$ python3 gift_wrap.py
Dépendances
● Python 3.6.9
● matplotlib (pip3 install matplotlib - vérifiez les dépendances de l’exercice 2
pour plus de détails)
● numpy (bibliothèque pré-installée)
● Sys (bibliothèque préinstallée)
Idée de base et concept
L’algorithme commence par trouver le point le plus à gauche dans les points
convexes de la coque. Si plusieurs points de l’ensemble ont la même
coordonnée minimale sur l’axe des x, nous choisissons parmi eux le point
avec la coordonnée minimale sur l’axe des y. Pour tout ensemble donné de
points, ce point appartiendra à la coque convexe de l’ensemble.
Ensuite, dans chaque itération, l’algorithme choisit un point qui n’a pas déjà été
placé dans la liste convexe de la coque. Ensuite, l’algorithme vérifie si ce point
est le prochain point du polygone convexe de la coque. Pour que cela soit vrai,
le nouveau point doit maximiser l’angle formé lorsqu’il est relié au point
précédent du polygone convexe de la coque. Comment on va vérifier ça ?
Supposons que r est le dernier point inséré dans le polygone convexe de la
coque et u est notre candidat pour le prochain point du polygone convexe de la
coque et t est un point aléatoire différent de u qui n’a pas non plus été inséré
dans la liste convexe de la coque.
Nous formons les vecteurs et . Pour maximiser l’angle, lorsque nous tournons
le vecteur vers la rotation doit être dans le sens inverse des aiguilles d’une
montre (CCW). Autrement,
l’angle formé lorsque t est choisi comme point suivant de la coque convexe est
plus grand. Donc, dans ce cas, nous définissons u = t. Si nous avons vérifié que
l’angle formé quand un point s est choisi est inférieur à l’angle formé quand u
est choisi, alors l’angle pour t sera plus grand que l’angle pour s. Donc, il n’est
pas nécessaire de vérifier deux points dans une seule itération de l’algorithme.
Now, a detail that we have to address is what happens when r,u,t are collinear.
Well, we just check if u is in the middle of them. If that’s the case we set u = t.
Otherwise we continue our search for the best candidate.
The algorithm terminates when u = r0 and the convex hull polygon is complete.
Check out the pseudocode for more details.
Convex Hull Gift Wrap Algorithm
convex_hull_list = 2d_points
return convex_hull_list
list)
u = None
while u != r0:
u = unused_points_list[0]
counter = 1
si r == r0 et u == r0 :
u = unused_points_list[1]
counter = 2
t = unused_points_list [ counter ]
si r==r0 et t == r0 :
counter ++
Go to next repetition
u = t
counter ++
si u != r0 :
return convex_hull_list
Implementation Details
There are 3 things I’d like to point out in my implementation:
−15
where 10 is the upper bound of the acceptable precision error.