Page 1 sur 1

[R] Petit soucis avec "La flèche de Koch"

Posté : jeu. 04 sept. 2014 22:48
par sozary
Bonjour!
Petit soucis...
Après m'être bien entraîné en récursivité, j'ai décidé de faire la fractale du flocon de Koch!! Malheureusement, le résultat est bizarre:
l'algorithme est bon, tout marche, mais mon triangle équilatéral à les côtés inversés, sauf la base.
En gros le motif est inversé sur mon triangle équilatéral sauf à la base, et on dirait une flèche, c'est beau, certes, mais je voulais pas ça à la base -__-!
► Afficher le texte

Re: [..] Petit soucis avec "La flèche de Koch"

Posté : jeu. 04 sept. 2014 23:25
par jchd
Essaye avec ça :

Code : Tout sélectionner

For $i = 0 To $max
    _KochFlake($hGraphic, 500, 421, 200, 421, $i)
    _KochFlake($hGraphic, 200, 421, (200 + 500) / 2, Sqrt((350 ^ 2) - (300 ^ 2)), $i)
    _KochFlake($hGraphic, (200 + 500) / 2, Sqrt((350 ^ 2) - (300 ^ 2)), 500, 421, $i)
    WinSetTitle($hGUI, $title, $title & " -Génération " & $i & " -")
    Sleep(600)
Next
Par contre tu peux voir que le calcul des coordonnées ne se recoupe pas bien.

Re: [..] Petit soucis avec "La flèche de Koch"

Posté : ven. 05 sept. 2014 10:17
par Faco
Salut,
j'ai juste inversé tes coordonnées et ça passe ( et commence ta boucle à '1' vu que tu fait rien si '$i==0') :
► Afficher le texte

Re: [..] Petit soucis avec "La flèche de Koch"

Posté : ven. 05 sept. 2014 11:42
par jchd
Oui, si l'on le veut en flocon (vers l'extérieur). Ce que je voulais souligner est qu'on doit calculer les coordonnées du sommet en fonction de la taille, plutôt que de mettre une valeur litérale (qui était fausse).

Avec l'expansion vers l'extérieur on ne voit pas que le dessin est bancal.

Sinon, ça donnerait ça :

Code : Tout sélectionner

Global Const $PI = 3.141592653589793, $COS60 = Cos($PI / 3), $SIN60 = Sin($PI / 3)
Global $iTaille = 600, $iMax = 5


Local $iMarge = 50, $iH = $iTaille + 2 * $iMarge, $iV = $iTaille * 2 * Sqrt(3) / 3 + 2 * $iMarge, $sTitle = "Flocon de Koch"
Local $hGUI = GUICreate($sTitle, $iH, $iV)
GUISetState(@SW_SHOW)
_GDIPlus_Startup()
Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Local $aPts = [ _
    [$iMarge, $iMarge + $iTaille * Sqrt(3) / 2], _
    [$iH - $iMarge, $iMarge + $iTaille * Sqrt(3) / 2], _
    [$iMarge + $iTaille / 2, $iMarge] _
]
For $i = 1 To $iMax
    _KochFlake($hGraphic, $aPts[0][0], $aPts[0][1], $aPts[1][0], $aPts[1][1], $i)
    _KochFlake($hGraphic, $aPts[2][0], $aPts[2][1], $aPts[0][0], $aPts[0][1], $i)
    _KochFlake($hGraphic, $aPts[1][0], $aPts[1][1], $aPts[2][0], $aPts[2][1], $i)
    WinSetTitle($hGUI, $sTitle, $sTitle & " -Génération " & $i & " -")
    Sleep(600)
Next
_GDIPlus_Shutdown()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _KochFlake($hGraph, $ix, $iy, $jx, $jy, $k)
    If $k <> 0 Then
        Local $a[2], $b[2], $c[2], $d[2], $e[2]
        $a[0] = $ix
        $a[1] = $iy
        $b[0] = $jx
        $b[1] = $jy
        $c[0] = $a[0] + ($b[0] - $a[0]) / 3
        $c[1] = $a[1] + ($b[1] - $a[1]) / 3
        $d[0] = $a[0] + 2 * ($b[0] - $a[0]) / 3
        $d[1] = $a[1] + 2 * ($b[1] - $a[1]) / 3
        $e[0] = ($c[0] + $d[0]) * $COS60 - ($d[1] - $c[1]) * $SIN60
        $e[1] = ($c[1] + $d[1]) * $COS60 + ($d[0] - $c[0]) * $SIN60
        _GDIPlus_GraphicsDrawLine($hGraph, $c[0], $c[1], $d[0], $d[1])
        _GDIPlus_GraphicsDrawLine($hGraph, $a[0], $a[1], $c[0], $c[1])
        _GDIPlus_GraphicsDrawLine($hGraph, $c[0], $c[1], $e[0], $e[1])
        _GDIPlus_GraphicsDrawLine($hGraph, $e[0], $e[1], $d[0], $d[1])
        _GDIPlus_GraphicsDrawLine($hGraph, $d[0], $d[1], $b[0], $b[1])
        _KochFlake($hGraph, $a[0], $a[1], $c[0], $c[1], $k - 1)
        _KochFlake($hGraph, $c[0], $c[1], $e[0], $e[1], $k - 1)
        _KochFlake($hGraph, $e[0], $e[1], $d[0], $d[1], $k - 1)
        _KochFlake($hGraph, $d[0], $d[1], $b[0], $b[1], $k - 1)
    EndIf
EndFunc   ;==>_KochFlake
Note : inutile de passer en paramètre une variable global et de la passer en paramètre si on ne se sert pas de celui-ci ($hGraphics --> $hGraph)

Re: [..] Petit soucis avec "La flèche de Koch"

Posté : ven. 05 sept. 2014 17:48
par TommyDDR
[quote="jchd"]Note : inutile de passer en paramètre une variable global et de la passer en paramètre si on ne se sert pas de celui-ci ($hGraphics --> $hGraph)

Code : Tout sélectionner

Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
...
_KochFlake($hGraphic, $aPts[0][0], $aPts[0][1], $aPts[1][0], $aPts[1][1], $i)[/quote]
Je suis totalement d'accord.
Mais : Une variable Local déclaré hors d'une fonction n'est pas considérée comme Global ?

Code : Tout sélectionner

Opt("MustDeclareVars", 1)

Local $test = 5

test()

Func test()
    ConsoleWrite($test & @LF)
EndFunc

Re: [..] Petit soucis avec "La flèche de Koch"

Posté : ven. 05 sept. 2014 18:01
par sozary
Merci pour vos réponses, mais la solution de Faco me semble plus que simpliste et est la plus proche de la mienne, donc c'est surtout celle la que j'ai retenu :)!
Merci!

Re: [R] Petit soucis avec "La flèche de Koch"

Posté : ven. 05 sept. 2014 18:47
par jchd
Oui mais le résultat est faux !

A part ça, j'ai juste rendu paramétrable la taille du côté et calculé à partir de ça.

Re: [..] Petit soucis avec "La flèche de Koch"

Posté : ven. 05 sept. 2014 21:34
par mikell
TommyDDR a écrit :Mais : Une variable Local déclaré hors d'une fonction n'est pas considérée comme Global ?
Thus saith the wiki
there is no point declaring any variables in the main body of a script as Local - they will be Global regardless

Re: [R] Petit soucis avec "La flèche de Koch"

Posté : ven. 05 sept. 2014 22:00
par jchd
Pas d'accord du tout, mais ce n'est pas le lieu d'un tel débat.

Re: [R] Petit soucis avec "La flèche de Koch"

Posté : ven. 05 sept. 2014 23:08
par sozary
J'ai fais quelques modif jchd, histoire de faire un code correct :)

Re: [R] Petit soucis avec "La flèche de Koch"

Posté : ven. 05 sept. 2014 23:11
par jchd
Bon. Il fonctionnait le mien au moins ?