Ocaml - Création d'image en ascii art

a marqué ce sujet comme résolu.

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.

Image utilisateur

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 :

Image utilisateur

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
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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