2016-03-16 1 views
1

J'ai actuellement un programme qui fait un arbre fractal. Cependant, je voudrais utiliser le nombre d'or dans mon arbre fractal pour obtenir des dessins plus intéressants. Je ne sais pas exactement comment l'implémenter avec des coordonnées, surtout avec java puisque (0,0) est en haut à gauche, ce qui rend les choses un peu plus confuses. Vous pouvez ignorer les paramètres adder et length, ils ne sont pas impliqués dans ce processus. Et excusez mon ignorance à ce sujet, je suis toujours en train d'essayer de comprendre comment exactement fonctionne la Golden Ratio. J'ai fait quelques recherches mais j'aimerais vraiment une réponse en termes simples.Comment faire des arbres de fractale d'or

public void paintComponent(Graphics g) 
    { 

     g.setColor(Color.RED); 

     draw(g, order, topX, topY,90,20, 200.00); 
    } 


public void draw(Graphics g, int order, int x1, int y1, double angle, int adder, double length) 
{ 
    int x2, y2, x3, y3; 
    double newAngle = Math.toRadians(angle); 

    if (order == 1) 
    { 
     return; 
    } 
    else 
    { 
     x2 = (x1 - (int)Math.round(Math.cos(newAngle) * order * 10)); 

     y2 = (y1 - (int)Math.round(Math.sin(newAngle) * order * 10)); 

     g.drawLine(x1, y1, x2, y2); 

     draw(g, order-1, x2, y2, angle+30, adder+2, length+20); 
     draw(g, order-1, x2, y2, angle-30, adder+2, length+20); 
    } 
} 

C'est ce que la sortie de courant est à un ordre de 10. enter image description here

Répondre

1

Une approche pour intégrer le ratio d'or dans votre code est de l'utiliser dans le calcul de la longueur de la branche. Ici, bien que vous ayez un paramètre length, il est inutilisé. Au lieu de cela, la longueur est calculée comme order * 10 de telle sorte que le tronc est long de 100, et à l'ordre de temps atteint 2, les feuilles sont 20 longues. Si vous utilisez le paramètre length, et recurse de sorte que chaque ordre de branchement successif soit 0.618034 la longueur de l'ancêtre, vous créez un arbre qui a des branches de tronc et de noyau plus longues et qui converge vers une sorte de broccoli détail des feuilles:

Tree with 30 degree branching and each successive branch length is 0.618 times the ancestor's length.

l'autre paramètre que vous avez le contrôle sur l'angle est, que vous avez défini à 30 degrés. Ci-dessous, j'ai converti votre code à Processing (c'est essentiellement Java, et facile à utiliser pour ce genre de choses). Vous pouvez le coller dans http://www.openprocessing.org/sketch/create et l'exécuter dans votre navigateur pour jouer. Regardez comment remplacer l'angle de 30 avec un nombre aléatoire uniforme entre 20 et 40 change l'arbre. Continuez à cliquer sur et exécutez pour voir les différents arbres.

void setup() 
{ 
    size(1000,1000); 
    smooth(); 
    stroke(0); 
    frameRate(30); 
} 

void go(int order, int x1, int y1, float angle, int adder, int length) 
{ 
    int x2, y2, x3, y3; 
    double newAngle = angle * PI/180; 

    if (order == 1) 
    { 
     return; 
    } 
    else 
    { 
     x2 = (x1 - round(cos(newAngle) * length)); 

     y2 = (y1 - round(sin(newAngle) * length)); 

     line(x1, y1, x2, y2); 

     go(order-1, x2, y2, angle+random(20,40), adder+2, 0.618034 * length); 
     go(order-1, x2, y2, angle-random(20,40), adder+2, 0.618034 * length); 
    } 
} 

void draw() 
{ 
    stroke(255, 0, 0); 
    strokeWeight(1); 

    go(10, 500, 999, 90, 20, 100); 
    exit(); 
} 

Voici un intéressant, un peu l'arbre hors bilan généré par le code ci-dessus:

Off balance tree

+0

Merci homme! Je serai capable de faire des modèles vraiment intéressants en sachant cela maintenant! – Hobbs2000