Bonsoir !
Nouveau sur ce forum, je me tourne vers vous afin de m'aider à résoudre un problème en OCaml. Le but de ce tp est de créer des images en ASCII art. Je me permet de mettre le sujet du tp sous forme de captures d'écran, car je ne pense pas pouvoir le copier "proprement" dans mon message.
Voici donc ce que j'ai fait pour cette première partie :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | type coord = Coord of float*float ;; let string_of_coord c = let Coord(a,b) = c in "(" ^ string_of_float a ^ ";" ^ string_of_float b ^ ")" ;; let coordinate x y = Coord(x,y) ;; let translate_point p v = let Coord(px,py) = p in let Coord(vx,vy) = v in Coord(px+.vx,py+.vy) ;; let inv_translate_point p v = let Coord(px,py) = p in let Coord(vx,vy) = v in Coord(px-.vx,py-.vy) ;; let rotate_point p t = let Coord(px,py) = p in Coord(px*.cos(t)-.py*.sin(t),px*.sin(t)+.py*.cos(t)) ;; 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)) ;; |
La deuxième partie du tp est la suivante :
Mais c'est là que je bloque ! J'en suis au dernier point (définir intersect_figure). Voici ce que j'ai écris :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | type fig_spec = | Circle of float | Rectangle of float*float | Line of float ;; type figure = Figure of char*(float*float)*float*fig_spec ;; let circle r = Figure('+',(0.,0.),0.,Circle r) ;; let rectangle w h = Figure('+',(0.,0.),0.,Rectangle (w,h)) ;; let line l = Figure('+',(0.,0.),0.,Line l) ;; let color_figure f c = let Figure(col,(x,y),ang,spec) = f in Figure(c,(x,y),ang,spec) ;; let translate_figure f dx dy = let Figure(col,(x,y),ang,spec) = f in Figure(col,(x+.dx,y+.dy),ang,spec) ;; let rotate_figure f dt = let Figure(col,(x,y),ang,spec) = f in Figure(col,(x,y),ang+.dt,spec) ;; let float_abs a = if a < 0. then -.a else a ;; 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 est que je n'arrive pas à faire la translation inverse puis la rotation inverse comme indiqué dans l'énoncé. Une petite aide serait la bienvenue …
Merci d'avance pour vos réponses, et bonne soirée !
+0
-0