Replacer un point dans un repère relatif à une figure

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour !

Actuellement en train de faire un tp de programmation fonctionnelle en ocaml, j'aurais besoind d'aide afin de créer unf fonction.

L'énoncé est le suivant :

Définir la fonction intersect_figure : float -> coord -> figure -> char option telle que intersect_figure grain p f retourne None si le point p est en dehors de la figure f, ou Some c où c est la couleur de f sinon. L'intersection se déroule en deux étapes : I. le point p est tout d'abord replacé dans le repère relatif à la figure f 1. en faisant la translation inverse de p par rapport au centre de la figure, puis 2. en faisant la rotation inverse par rapport à l'angle de la figure; II. une fois dans le bon repère, l'intersection dépend de la nature de la figure, en supposant que (px,py) sont les coordonnées relative de p dans f : cercle : pxpx+pypy=<rr où rr est le carré du rayon du cercle …

L'énoncé continue ensuite pour le rectangle et la ligne, mais pour l'instant mon problème est sur le premier point.

Le type figure est défini comme :

1
2
3
type figure =
 Figure of char*(float*float)*float*fig_spec
;;

Le type coord est défini comme :

1
type coord = Coord of float*float ;;

Voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
let intersect_figure grain p f =
 let Figure(_,cent,ang,_) = f in
 let Coord(px,py) = p in
 let p2 = inv_translate_point p cent in
 let p1 = inv_rotate_point p2 ang in
  match f with
   | Figure(x,_,_,Circle r) -> if px*.px+.py*.py <= r*.r then Some x else None
   | Figure(y,_,_,Rectangle (w,h)) -> if float_abs(px) <= w/.2. && float_abs(py) <= h/.2. then Some y else None
   | Figure(z,_,_,Line l) -> if float_abs(px) <= l/.2. && float_abs(py) <= grain then Some z else None
;;

Je pense que le problème se situe dans le fait que je n'arrive pas à faire en sorte que le point p soit replacé dans le repère relatif à f …

Je cous remercie par avance pour vos réponses/aides !

Édité par Mathemataume

+0 -0

Si tu penses que le problème vient du faite que tu n'arrives pas à replacer p dans le repère de la figure, donner l'implémentation de inv_translate_point et inv_rotate_point me semble assez important.

Édité par Berdes

+0 -0
Auteur du sujet

Oui, tu as raison ! les voici :

1
2
3
4
5
let inv_translate_point p v =
 let Coord(px,py) = p in
 let Coord(vx,vy) = v in
Coord(px-.vx,py-.vy)
;;
1
2
3
4
let inv_rotate_point p t =
 let Coord(px,py) = p in
Coord(px*.cos(-.t)-.py*.sin(-.t),px*.sin(-.t)+.py*.cos(-.t))
;;

Ces fonctions ont été écrite selon l'énoncé suivant :

Définir la fonction inv_translate_point : coord -> coord -> coord tel que inv_translate_point p v retorune le translaté inverse (px',py') du point p = (px,py) par le vecteur v = (vx,vy).

Définir la fonction inv_rotate_point : coord -> float -> coord tel que inv_translate_point p t retorune le transformé inverse (px',py') du point p = (px,py) par la rotation d'angle t.

+0 -0

Cette réponse a aidé l'auteur du sujet

Je ne vois pas d'erreur qui saute aux yeux. Dans un cas comme ça, le plus simple est souvent de créé un exemple pour lequel ta fonction ne te retourne pas la bonne valeur. Tu devrais déjà en avoir un puisque tu t'es rendu compte que ta fonction ne te donnait pas le bon résultat. Une fois cet exemple en main, il faut exécuter ta fonction en affichant tous les résultats intermédiaires et ensuite, tu les vérifie tous à la main. Puisque le résultat final n'est pas bon, tu dois forcément avoir un résultat intermédiaire faux. À partir de là, tu te retrouvera à savoir quel ligne pose problème et quel problème elle pose, ce qui devrait te guider efficacement au bug.

+0 -0
Auteur du sujet

Merci pour ta réponse, je m'excuse de réponse si tard ! J'ai également contacté le professeur qui m'a dit où était mon erreur : c'était plus haut dans le programme, dans la définition de mon type figure.

Mais je te remercie tout de même pour l'astuce que tu m'a donné afin de savoir d'où peut provenir un bug, je l'utiliserais certainement un jour ou l'autre !

Bonne soirée !

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte