Bonjour,
J'essaye actuellement de mettre en place un algorithme récurrent en caml permettant de tracer les figures ci contre :
http://img293.imageshack.us/my.php?i...rcursiftn3.jpg
Merci d'avance pour votre aide !!![]()
Bonjour,
J'essaye actuellement de mettre en place un algorithme récurrent en caml permettant de tracer les figures ci contre :
http://img293.imageshack.us/my.php?i...rcursiftn3.jpg
Merci d'avance pour votre aide !!![]()
On peut difficilement t'aider sans voir le travail que tu as fait (ou alors on bosse tout seul, mais ce n'est plus de l'aide, c'est de l'assistanat). Tu nous montres le début de ton travail ?
Biensur ^^' :
Je coince ici ^^
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 type point = int * int ;; let (creer_point : int -> int -> point) = function x -> function y -> (x, y);; let (abscisse : point -> int) = function (x, y) -> x ;; let (ordonnee : point -> int) = function (x, y) -> y ;; let tracerCarre a taille = Graphics.set_color Graphics.red; Graphics.fill_rect (abscisse a) (ordonnee a) taille taille; ;; let p = creer_point 0 0;; let rec carrecursif a taille = if taille <2 then tracercarre a taille else begin ??
Merci !
Si la taille du carré est plus grande que 2, il faut que tu rappelles ta procédure récursive en plusieurs endroits de ton carré (au lieu de le peindre en entier), avec une taille plus petite. Tu as une idée de comment exprimer les coordonnées de ces différents points de rappel en fonction de a et de taille ?
Remarque sur le code : les fonctions "abcisse" et "ordonnee" existent déjà dans la bibliothèque standard, elles sont nommées "fst" (first, premier champ du couple) et "snd" (second). Par ailleurs tu peux aussi utiliser un motif à la place :
Au lieu de nommer la position "a", je la nomme "(x, y)", ce qui a pour effet de la décomposer en un couple, et de nommer le premier élément "x", et l'autre "y".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 let tracerCarre (x,y) taille = Graphics.set_color Graphics.red; Graphics.fill_rect x y taille taille
Au passage, tu n'es pas obligé de préciser les types de tes fonctions (c'est lourd et si tu veux changer de type, tu dois tout modifier, ce qui n'est pas très pratique), et tu peux imbriquer plusieurs arguments à la suite :
(la fonction creer_point étant, au passage, relativement inutile : "creer_point 0 0" est assez agréablement remplacé par "(0, 0)")
Code : Sélectionner tout - Visualiser dans une fenêtre à part let creer_point x y = (x, y)
Oui, justement c'est la ou je bloque, je ne sais pas du tout par quelles coordonnées je dois commencer la récurrence...
Quel que soit le niveau de récursion, la zone globale ressemble à ça :
Dans le cas du "carré récursif 1", tu dois ne rien faire dans les carrés gris, peindre le carré rouge au milieu, et rappeler la fonction récursivement dans les carrés oranges.
Maintenant, imagine que la coordonnée de départ de ton carré est "(x, y)", et sa taille "taille". Quelles sont les coordonnées et les tailles des carrés à peindre ou à rappeler ?
Par exemple, les coordonnées du carré à peindre son "(x+taille/3, y+taille/3)", et sa taille "taille/3". Tu vois pourquoi ? Tu as une idée pour les autres ?
Voila l'algorithme que j'en déduis :
Mais j'obtiens les erreurs suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 let rec carrecursif a taille = if taille <2 then tracerCarre a taille else begin let abscisse a=(abscisse a+taille)/3 in let ordonnee a=(ordonnee a+taille)/3 in let taille=taille/3 in carrecursif a taille; end;;
Ou est-ce que j'ai faux ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Warning Y: unused variable ordonnee. Warning Y: unused variable abscisse.
Pour commencer, le message n'est pas une erreur mais un "warning", donc un avertissement. Le code a bien compilé et tu peux le tester, mais le compilateur a trouvé des choses étranges (des variables inutilisées) et t'en avertis : "c'est bizarre, tu as du te tromper".
Le code ne veut rien dire. Tu commences par définir de nouvelles variables (qui ont, au passage, le nom de fonctions déjà définies, ce qui est en général une assez mauvaise idée), puis tu ne t'en sers pas puisque tu rappelles ta fonction avec l'ancien argument a. Relis ton code calmement et tu verras qu'il n'est pas correct, "let abcisse a = ..." ne redéfinissant en rien la variable a.
Ensuite, même s'il voulait dire quelque chose il ne serait certainement pas correct, vu qu'à chaque étape de récursion tu dois :
- peindre le carré central
- rappeler la fonction sur les 4 carrés extérieurs
Tu n'as fait qu'un seul appel récursif au lieu de 4, et aucun ordre de peinture.
Je vais essayer d'exposer mon problème plus clairement :
Mon idée est la suivant (pour la deuxième figure)
Je définis les 4 carrés du coin:
a (x,y)
b (x, 2*taille)
c (2*taille,y)
d (2*taille,2*taille)
ensuite je veux définir taille=taille/3 et rappeler les 4 fonction récursives;
Problème: Je ne sais pas comment définir les 4 carrés a b c d dans ma fonction...
Les coordonnées ne sont pas bonnes, elles dépendent toutes de x _et_ de y. Par exemple, celles du carrés central sont (x + taille/3, y + taille/3).
Commencer définir les carrés ? Tu repères le carré actuel par le point (x, y), il suffit de définir les points correspondants à ces carrés :
ou, code équivalent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part let carre_central = creer_point (x + taille/3) (y + taille/3)
Ensuite, pour pendre le carré central :
Code : Sélectionner tout - Visualiser dans une fenêtre à part let carre_central = (x + taille/3, y + taille/3)
Si tu veux définir une nouvelle variable pour la nouvelle taille, appelle la "taille2" ou taille' (avec une apostrophe, comme en maths, "taille prime"), mais pas "taille" si possible. Redéfinir des variables déjà existantes c'est en général une mauvaise idée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part tracercarre carre_central (taille / 3)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager