Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2016-06-26T22:04:26+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Ocaml - Création d'image en ascii art, message #1158162016-06-26T22:04:26+02:00Mathemataume/@Mathemataumehttps://zestedesavoir.com/forums/sujet/6411/ocaml-creation-dimage-en-ascii-art/?page=1#p115816<p>Bonsoir !</p>
<p>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.</p>
<p><figure><img alt="" src="http://img11.hostingpics.net/pics/903967sujetTP1.png"><figcaption>Image utilisateur</figcaption></figure></p>
<p>Voici donc ce que j'ai fait pour cette première partie :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="n">type</span> <span class="n">coord</span> <span class="o">=</span> <span class="n">Coord</span> <span class="n">of</span> <span class="kt">float</span><span class="o">*</span><span class="kt">float</span> <span class="p">;;</span>
<span class="n">let</span> <span class="n">string_of_coord</span> <span class="n">c</span> <span class="o">=</span>
<span class="n">let</span> <span class="n">Coord</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span> <span class="o">=</span> <span class="n">c</span> <span class="n">in</span>
<span class="s">"("</span> <span class="o">^</span> <span class="n">string_of_float</span> <span class="n">a</span> <span class="o">^</span> <span class="s">";"</span> <span class="o">^</span> <span class="n">string_of_float</span> <span class="n">b</span> <span class="o">^</span> <span class="s">")"</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">coordinate</span> <span class="n">x</span> <span class="n">y</span> <span class="o">=</span>
<span class="n">Coord</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">translate_point</span> <span class="n">p</span> <span class="n">v</span> <span class="o">=</span>
<span class="n">let</span> <span class="n">Coord</span><span class="p">(</span><span class="n">px</span><span class="p">,</span><span class="n">py</span><span class="p">)</span> <span class="o">=</span> <span class="n">p</span> <span class="n">in</span>
<span class="n">let</span> <span class="n">Coord</span><span class="p">(</span><span class="n">vx</span><span class="p">,</span><span class="n">vy</span><span class="p">)</span> <span class="o">=</span> <span class="n">v</span> <span class="n">in</span>
<span class="n">Coord</span><span class="p">(</span><span class="n">px</span><span class="o">+</span><span class="p">.</span><span class="n">vx</span><span class="p">,</span><span class="n">py</span><span class="o">+</span><span class="p">.</span><span class="n">vy</span><span class="p">)</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">inv_translate_point</span> <span class="n">p</span> <span class="n">v</span> <span class="o">=</span>
<span class="n">let</span> <span class="n">Coord</span><span class="p">(</span><span class="n">px</span><span class="p">,</span><span class="n">py</span><span class="p">)</span> <span class="o">=</span> <span class="n">p</span> <span class="n">in</span>
<span class="n">let</span> <span class="n">Coord</span><span class="p">(</span><span class="n">vx</span><span class="p">,</span><span class="n">vy</span><span class="p">)</span> <span class="o">=</span> <span class="n">v</span> <span class="n">in</span>
<span class="n">Coord</span><span class="p">(</span><span class="n">px</span><span class="o">-</span><span class="p">.</span><span class="n">vx</span><span class="p">,</span><span class="n">py</span><span class="o">-</span><span class="p">.</span><span class="n">vy</span><span class="p">)</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">rotate_point</span> <span class="n">p</span> <span class="n">t</span> <span class="o">=</span>
<span class="n">let</span> <span class="n">Coord</span><span class="p">(</span><span class="n">px</span><span class="p">,</span><span class="n">py</span><span class="p">)</span> <span class="o">=</span> <span class="n">p</span> <span class="n">in</span>
<span class="n">Coord</span><span class="p">(</span><span class="n">px</span><span class="o">*</span><span class="p">.</span><span class="n">cos</span><span class="p">(</span><span class="n">t</span><span class="p">)</span><span class="o">-</span><span class="p">.</span><span class="n">py</span><span class="o">*</span><span class="p">.</span><span class="n">sin</span><span class="p">(</span><span class="n">t</span><span class="p">),</span><span class="n">px</span><span class="o">*</span><span class="p">.</span><span class="n">sin</span><span class="p">(</span><span class="n">t</span><span class="p">)</span><span class="o">+</span><span class="p">.</span><span class="n">py</span><span class="o">*</span><span class="p">.</span><span class="n">cos</span><span class="p">(</span><span class="n">t</span><span class="p">))</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">inv_rotate_point</span> <span class="n">p</span> <span class="n">t</span> <span class="o">=</span>
<span class="n">let</span> <span class="n">Coord</span><span class="p">(</span><span class="n">px</span><span class="p">,</span><span class="n">py</span><span class="p">)</span> <span class="o">=</span> <span class="n">p</span> <span class="n">in</span>
<span class="n">Coord</span><span class="p">(</span><span class="n">px</span><span class="o">*</span><span class="p">.</span><span class="n">cos</span><span class="p">(</span><span class="o">-</span><span class="p">.</span><span class="n">t</span><span class="p">)</span><span class="o">-</span><span class="p">.</span><span class="n">py</span><span class="o">*</span><span class="p">.</span><span class="n">sin</span><span class="p">(</span><span class="o">-</span><span class="p">.</span><span class="n">t</span><span class="p">),</span><span class="n">px</span><span class="o">*</span><span class="p">.</span><span class="n">sin</span><span class="p">(</span><span class="o">-</span><span class="p">.</span><span class="n">t</span><span class="p">)</span><span class="o">+</span><span class="p">.</span><span class="n">py</span><span class="o">*</span><span class="p">.</span><span class="n">cos</span><span class="p">(</span><span class="o">-</span><span class="p">.</span><span class="n">t</span><span class="p">))</span>
<span class="p">;;</span>
</pre></div>
</td></tr></table>
<p>La deuxième partie du tp est la suivante :</p>
<p><figure><img alt="" src="http://img11.hostingpics.net/pics/665207Screenshotfrom20160626220011.png"><figcaption>Image utilisateur</figcaption></figure></p>
<p>Mais c'est là que je bloque ! J'en suis au dernier point (définir intersect_figure). Voici ce que j'ai écris :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="n">type</span> <span class="n">fig_spec</span> <span class="o">=</span>
<span class="o">|</span> <span class="n">Circle</span> <span class="n">of</span> <span class="kt">float</span>
<span class="o">|</span> <span class="n">Rectangle</span> <span class="n">of</span> <span class="kt">float</span><span class="o">*</span><span class="kt">float</span>
<span class="o">|</span> <span class="n">Line</span> <span class="n">of</span> <span class="kt">float</span>
<span class="p">;;</span>
<span class="n">type</span> <span class="n">figure</span> <span class="o">=</span>
<span class="n">Figure</span> <span class="n">of</span> <span class="kt">char</span><span class="o">*</span><span class="p">(</span><span class="kt">float</span><span class="o">*</span><span class="kt">float</span><span class="p">)</span><span class="o">*</span><span class="kt">float</span><span class="o">*</span><span class="n">fig_spec</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">circle</span> <span class="n">r</span> <span class="o">=</span>
<span class="n">Figure</span><span class="p">(</span><span class="sc">'+'</span><span class="p">,(</span><span class="mf">0.</span><span class="p">,</span><span class="mf">0.</span><span class="p">),</span><span class="mf">0.</span><span class="p">,</span><span class="n">Circle</span> <span class="n">r</span><span class="p">)</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">rectangle</span> <span class="n">w</span> <span class="n">h</span> <span class="o">=</span>
<span class="n">Figure</span><span class="p">(</span><span class="sc">'+'</span><span class="p">,(</span><span class="mf">0.</span><span class="p">,</span><span class="mf">0.</span><span class="p">),</span><span class="mf">0.</span><span class="p">,</span><span class="n">Rectangle</span> <span class="p">(</span><span class="n">w</span><span class="p">,</span><span class="n">h</span><span class="p">))</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">line</span> <span class="n">l</span> <span class="o">=</span>
<span class="n">Figure</span><span class="p">(</span><span class="sc">'+'</span><span class="p">,(</span><span class="mf">0.</span><span class="p">,</span><span class="mf">0.</span><span class="p">),</span><span class="mf">0.</span><span class="p">,</span><span class="n">Line</span> <span class="n">l</span><span class="p">)</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">color_figure</span> <span class="n">f</span> <span class="n">c</span> <span class="o">=</span>
<span class="n">let</span> <span class="n">Figure</span><span class="p">(</span><span class="n">col</span><span class="p">,(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">),</span><span class="n">ang</span><span class="p">,</span><span class="n">spec</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span> <span class="n">in</span>
<span class="n">Figure</span><span class="p">(</span><span class="n">c</span><span class="p">,(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">),</span><span class="n">ang</span><span class="p">,</span><span class="n">spec</span><span class="p">)</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">translate_figure</span> <span class="n">f</span> <span class="n">dx</span> <span class="n">dy</span> <span class="o">=</span>
<span class="n">let</span> <span class="n">Figure</span><span class="p">(</span><span class="n">col</span><span class="p">,(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">),</span><span class="n">ang</span><span class="p">,</span><span class="n">spec</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span> <span class="n">in</span>
<span class="n">Figure</span><span class="p">(</span><span class="n">col</span><span class="p">,(</span><span class="n">x</span><span class="o">+</span><span class="p">.</span><span class="n">dx</span><span class="p">,</span><span class="n">y</span><span class="o">+</span><span class="p">.</span><span class="n">dy</span><span class="p">),</span><span class="n">ang</span><span class="p">,</span><span class="n">spec</span><span class="p">)</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">rotate_figure</span> <span class="n">f</span> <span class="n">dt</span> <span class="o">=</span>
<span class="n">let</span> <span class="n">Figure</span><span class="p">(</span><span class="n">col</span><span class="p">,(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">),</span><span class="n">ang</span><span class="p">,</span><span class="n">spec</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span> <span class="n">in</span>
<span class="n">Figure</span><span class="p">(</span><span class="n">col</span><span class="p">,(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">),</span><span class="n">ang</span><span class="o">+</span><span class="p">.</span><span class="n">dt</span><span class="p">,</span><span class="n">spec</span><span class="p">)</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">float_abs</span> <span class="n">a</span> <span class="o">=</span>
<span class="k">if</span> <span class="n">a</span> <span class="o"><</span> <span class="mf">0.</span>
<span class="n">then</span> <span class="o">-</span><span class="p">.</span><span class="n">a</span>
<span class="k">else</span> <span class="n">a</span>
<span class="p">;;</span>
<span class="n">let</span> <span class="n">intersect_figure</span> <span class="n">grain</span> <span class="n">p</span> <span class="n">f</span> <span class="o">=</span>
<span class="n">let</span> <span class="n">Figure</span><span class="p">(</span><span class="n">_</span><span class="p">,</span><span class="n">cent</span><span class="p">,</span><span class="n">ang</span><span class="p">,</span><span class="n">_</span><span class="p">)</span> <span class="o">=</span> <span class="n">f</span> <span class="n">in</span>
<span class="n">let</span> <span class="n">Coord</span><span class="p">(</span><span class="n">px</span><span class="p">,</span><span class="n">py</span><span class="p">)</span> <span class="o">=</span> <span class="n">p</span> <span class="n">in</span>
<span class="n">let</span> <span class="n">p2</span> <span class="o">=</span> <span class="n">inv_translate_point</span> <span class="n">p</span> <span class="n">cent</span> <span class="n">in</span>
<span class="n">let</span> <span class="n">p1</span> <span class="o">=</span> <span class="n">inv_rotate_point</span> <span class="n">p2</span> <span class="n">ang</span> <span class="n">in</span>
<span class="n">match</span> <span class="n">f</span> <span class="n">with</span>
<span class="o">|</span> <span class="n">Figure</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">_</span><span class="p">,</span><span class="n">_</span><span class="p">,</span><span class="n">Circle</span> <span class="n">r</span><span class="p">)</span> <span class="o">-></span> <span class="k">if</span> <span class="n">px</span><span class="o">*</span><span class="p">.</span><span class="n">px</span><span class="o">+</span><span class="p">.</span><span class="n">py</span><span class="o">*</span><span class="p">.</span><span class="n">py</span> <span class="o"><=</span> <span class="n">r</span><span class="o">*</span><span class="p">.</span><span class="n">r</span> <span class="n">then</span> <span class="n">Some</span> <span class="n">x</span> <span class="k">else</span> <span class="n">None</span>
<span class="o">|</span> <span class="n">Figure</span><span class="p">(</span><span class="n">y</span><span class="p">,</span><span class="n">_</span><span class="p">,</span><span class="n">_</span><span class="p">,</span><span class="n">Rectangle</span> <span class="p">(</span><span class="n">w</span><span class="p">,</span><span class="n">h</span><span class="p">))</span> <span class="o">-></span> <span class="k">if</span> <span class="n">float_abs</span><span class="p">(</span><span class="n">px</span><span class="p">)</span> <span class="o"><=</span> <span class="n">w</span><span class="o">/</span><span class="mf">.2</span><span class="p">.</span> <span class="o">&&</span> <span class="n">float_abs</span><span class="p">(</span><span class="n">py</span><span class="p">)</span> <span class="o"><=</span> <span class="n">h</span><span class="o">/</span><span class="mf">.2</span><span class="p">.</span> <span class="n">then</span> <span class="n">Some</span> <span class="n">y</span> <span class="k">else</span> <span class="n">None</span>
<span class="o">|</span> <span class="n">Figure</span><span class="p">(</span><span class="n">z</span><span class="p">,</span><span class="n">_</span><span class="p">,</span><span class="n">_</span><span class="p">,</span><span class="n">Line</span> <span class="n">l</span><span class="p">)</span> <span class="o">-></span> <span class="k">if</span> <span class="n">float_abs</span><span class="p">(</span><span class="n">px</span><span class="p">)</span> <span class="o"><=</span> <span class="n">l</span><span class="o">/</span><span class="mf">.2</span><span class="p">.</span> <span class="o">&&</span> <span class="n">float_abs</span><span class="p">(</span><span class="n">py</span><span class="p">)</span> <span class="o"><=</span> <span class="n">grain</span> <span class="n">then</span> <span class="n">Some</span> <span class="n">z</span> <span class="k">else</span> <span class="n">None</span>
<span class="p">;;</span>
</pre></div>
</td></tr></table>
<p>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 …</p>
<p>Merci d'avance pour vos réponses, et bonne soirée !</p>