PDA

Voir la version complète : génération aléatoire de fractales (création d'arbre)



doudou
09/05/2008, 04h27
Bonjour à tous ;) j'ai chopé une formule sur le web pour generer aléatoirement des arbres selon des fractales. Etant à la programation ce qu'est Tyson à dentisterie, je voulais savoir s'il y avait un moyen simple d'importer la formule dans c4d. J'ai essayé via coffee et import ascii sans succés. Voilà la bestiole :

/*** Constants ***/
max_sub_branch = 4 ;
max_sub_angle = 3*Math.PI/4 ;
max_size = 8 ;
branch_length = 50 ;

/*** Function ***/
function makeBranch ( start_x, start_y, length, angle, size ) {
if ( size > 0 ) {
this.lineStyle ( size, 0x333333, 100 ) ;
this.moveTo ( start_x, start_y ) ;
var end_x = start_x + length * Math.cos ( angle ) ;
var end_y = start_y + length * Math.sin ( angle ) ;
this.lineTo ( end_x, end_y ) ;

var sub_branch = random (max_sub_branch - 1) + 2 ;
var branch_length_dimin = .5 + Math.random()/2 ;
for ( var i=0; i < sub_branch; i ++ ) {
var newLength = length * branch_length_dimin ;
var newAngle = angle + Math.random() * max_sub_angle - max_sub_angle / 2 ;
var newSize = size - 1 ;
makeBranch ( end_x, end_y, newLength, newAngle, newSize ) ;
}
}
}

/*** Function call ***/
makeBranch ( 200, 300, branch_length, -Math.PI/2, max_size ) ;

Désolé j'ai paumé le site sur lequel on pouvait obtenir des previews dynamiques des arbres générés (j'en ai fait des centaines toute la journée). J'édite si je retombe dessus ;-)

base80
09/05/2008, 05h13
C'est du chinois pour moi. Desolé

doudou
09/05/2008, 06h01
Arf, si c'est du chinois pour toi ... c'est du hollandais pour moi ..... imagine :arg: :mrgreen: n'empêche que si toi tu n'y comprends rien je commence à être inquiet là :?

oli_d
09/05/2008, 07h12
En tant que paysagiste tu m'intéresses beaucoup là !

Je regarde le problème dès que j'ai le temps. J'avais déjà une fois commencé un générateur d'arbres en COFFEE, mais j'ai assez vite laisé tombé. Je pense que le C++ sera plus adapté

Jean-Laurent
09/05/2008, 09h22
Tu fais dans la végétation doudou en ce moment. :wink:

Le code me semble clair et limpide au premier abord.
Si tu veux je te traduis ça de suite en coffee.
Le temps de prendre une feuille et si je ne me fais pas griller par quelqu'un d'autre. :wip:

L'idée de génération d'arbre est excellente, j'avoue y avoir souvent pensé.

Donc voilà la traduction.
C'est évidemment pour faire un arbre en 2D. En 3D il suffit d'adapter et de ne plus se contenter d'un seul angle.

Il déclare au début les constantes, c'est à dire les variables qui ne vont pas changer durant tout le programme.

En coofee ça existe aussi mais dans ce cas des variables globales suffiront.

Il suffit d'écrire var max_sub_branch=4;

Les variables de départ déclarées sont les suivantes:

max_sub_branch = 4 ; Au maximum de chaque branche en partira 4 autres (en réalité pas tout à fait dans ce qui suit)
max_sub_angle = 3*Math.PI/4 ; Les angles sont en radian. L'angle maximum entre les branches sera de 135°.
Car PI correspond à un angle de 180°.
max_size = 8 ; Le nombre de niveau de l'arbre.
branch_length = 50 ; La longueur de base d'une branche.

function makeBranch ( start_x, start_y, length, angle, size ) {

Déclare la fonction qui permet de créer l'arbre. Cette fonction sera appelée à chaque fois que l'on souhaite créer un arbre et il faudra rentrer les paramètres. start_x, start_y, Position de départ de l'arbre. (La base du tronc)
length (longueur du tronc) , angle (angle de départ du tronc) ,size ( nombre de niveau de l'arbre).
Si size =2; On aura un tronc et des branches et c'est tout.

En coffee il me semble que les fonctions se déclare de la même manière mais sans le mot "function", je vérifierai. C'est écris en premier dans le SDK.

Donc juste makeBranch ( start_x, start_y, length, angle, size ) { }

if ( size > 0 ) Pour dessiner les branches il faut que size soit >0. Après chaque branche size diminue. C'est la variable qui permet d'arrêter l'arbre.

this.lineStyle ( size, 0x333333, 100 ) ; C'est la commande pour dessiner une ligne, avec son épaisseur, sa couleur, sans doute son opacité.

Dans C4D on ne va pas dessiner une ligne, on pourra par exemple créer un cylindre ou alors les points d'une spline etc ...
A toi de choisir.

this.moveTo ( start_x, start_y ) ;
Place le curseur au point de départ choisi.
Là encore cette ligne sera inutile dans C4D.

var end_x = start_x + length * Math.cos ( angle ) ;
var end_y = start_y + length * Math.sin ( angle ) ;

Crée une variable locale (qui n'existe que dans la fonction) qui représente le deuxième point.
Cos et Sin c'est la trigonométrie classique. Si l'angle est par rapport à y. x= Longueur*cos(angle) et y=Longueur*sin(angle)

En coffee par besoin de Math. . cos ou sin(angle) suffira.

this.lineTo ( end_x, end_y ) ;
Dessine la ligne du point de départ au point de fin. Là encore sans intérêt dans C4D.

var sub_branch = random (max_sub_branch - 1) + 2 ;

On s'intéresse maintenant aux sous-branches. Les branches, puis les branches des branches etc ...
La fonction random existe aussi en coffee mais ce n'est pas un vrai random hélas. :roll:
Ici random(25) tirerait un nombre au hasard entre 0 et 25. Je mets au conditionnel car le code est assez curieux.
Je raisonne par rapport à ma calculatrice mais il faudrait que je vois un peu mieux comment marche ce random là.

Donc random (max_sub_branch - 1) tire un nombre entre 0 et 3 et ajoute 2. Il y aurait donc de 2 à 5 nouvelles branches.
var branch_length_dimin = .5 + Math.random()/2 ;

Pour que les sous branches n'aient pas toutes la même taille on leur attribut une taille raisonnable au hasard.

branch_length_dimin est le facteur de diminution de la branche.
Math.random() est un nombre aléatoire entre 0 et 1. Donc branch_length_dimin varie entre 0.5 et 1.

Les branches peuvent donc soit être entière soit au minimum faire la moitié de la branche de départ.

for ( var i=0; i < sub_branch; i ++ ) {
Même code qu'en coffee.
C'est une boucle, qui répète l'opération pour toutes les sous-branches.
4 fois s'il y en a 4 etc ...

var newLength = length * branch_length_dimin ; Nouvelle taille des sous-branches.

var newAngle = angle + Math.random() * max_sub_angle - max_sub_angle / 2 ;

Nouvel angle entre les branches (qui changera pour chaque sous-branche).
On prend l'angle de départ et toujours au hasard sans dépasser l'angle maximum on tire un autre angle.

var newSize = size - 1 ;

A chaque branche on diminue la taille de l'arbre.
Donc au passage la taille de l'arbre c'est le nombre totale de branches et sous-branches et pas la hiérarchie comme je le pensais un peu plus haut.
Si on rentre 100. On aura en tout une centaine de traits.

makeBranch ( end_x, end_y, newLength, newAngle, newSize ) ;

On appelle la fonction pour dessiner la sous branche (dans la fonction elle-même ce qui est quand même assez curieux.)
La fonction tourne donc en boucle jusqu'à ce que "size" tombe à 0.


makeBranch ( 200, 300, branch_length, -Math.PI/2, max_size ) ;

On appelle la fonction pour créer l'arbre en rentrant les paramètres de départ.
Il part du point x=200,y=300, avec une longueur de tronc de 50 et un angle vertical. (90°)

Cette fonction est donc à mettre dans le main() si c'est un tag coffee.


Il reste à l'adapter à ta sauce en fonction de ce que tu veux en faire. Utiliser des splines, des cylindres, des cubes.
Je peux également si tu en as besoin te réaliser l'exemple en coffee. :odile:

Floby
09/05/2008, 13h01
Oui makeBranch est une fonction récursive, c'est très souvent utilisé pour les arbres (quels qu'ils soient) mais il faut faire attention d'avoir une condition d'arrêt des appels consécutifs ^^

Par contre en COFFEE, tu peux déclarer des constantes. il me semble que c'est : const var MaConstante
ça ne change rien si ce n'est qu'il te met une erreur si tu essayes de la modifier.
Jolie analyse du code en tout cas :poucehaut:
je ne m'y connais pas assez en COFFEE pour traduire comme ça

Slimmy
09/05/2008, 13h34
Je m'assois discrètement.

doudou
09/05/2008, 19h42
Grand merci à Jean-Laurent d'avoir buché dessus ainsi qu'aux autres pour leurs précisions :poucehaut: comme je le disais, je suis une truffe en prog' et les seuls languages interpretés que j'ai utilisé etaient le basic sous DOS (mon premier cube en 3D ... ma premiére """mod""" :love:) et le language macro d'excel 4.0 .... c'est dire.
J'ai juste voulu jeter la bestiole dans l'aréne des spécialistes de la prog' car je pense, à juste titre, que la génération d'arbres à partir de fractales, interresse pas mal de monde.
Pour répondre à ta question Jean-Laurent, le but est de generer des splines car c4d à tout ce qu'il faut pour generer un arbre à partir du moment où il y a des splines pour le guider.
Ce serait un réel bonheur si ce thread pouvait aboutir à une expression communautairement conceptée :love:

ps : est ce que quelqu'un peut me dire où trouve rune doc claire coffee si possible en français svp ? c'est pas pour programmer vraiment mais pour rajouter les manip non prises en compte du script manager. Me suis plongé le nez dans les derniers sdk et j'ai trouvé çà pas clair du tout ...



Je peux également si tu en as besoin te réaliser l'exemple en coffee. :odile:


Là tu aurais ma reconnaissance éternelle :prie: :prie: :prie:

xs_yann
10/05/2008, 14h41
Ca sent l'ActionScript ça... :roll:
Voilà encore un nouveau truc marrant à faire. :art:
Joli analyse J-L. :poucehaut:

xs_yann
10/05/2008, 16h22
Il faudrait régler la question du Random en coffee qui est un vrai calvaire. :coup:
Mis à part ça on devrait pouvoir arriver à quelque chose :

http://ykoeth.free.fr/fc4d/xsTree/1.jpg

xs_yann
10/05/2008, 17h14
En 3D :

http://ykoeth.free.fr/fc4d/xsTree/2.jpg (http://ykoeth.free.fr/fc4d/xsTree/2.jpg)

Petit problème pour l'axe des Z, je ne savais pas trop quoi mettre :

var endX = startX + length * cos ( angle ) ;
var endY = startY + length * sin ( angle ) ;
var endZ = startZ + length * ?

J'ai mis une formule qui rend quelque chose de potable (2 * cos(2*angle) * sin(2*angle)), mais il y a peux être mieux (et plus logique). :roll:

edit :

ps : est ce que quelqu'un peut me dire où trouver une doc claire coffee si possible en français svp ?
Elle n'existe pas. Le SDK n'est pas si mal, il suffit juste de s'y habituer. :P

Jean-Laurent
10/05/2008, 19h55
Là tu aurais ma reconnaissance éternelle :prie: :prie: :prie:


Je n'avais pas vu que tu avais éditer ton message. N'hésite pas dans ce cas là à envoyer un MP.
Je peux toujours te le faire si tu veux mais ça ne t'apportera pas grand chose.
Le code est sensiblement le même que celui que tu as donné mais il va falloir de toute manière que tu le modifies à ta sauce.
Effectivement le SDK coffee n'est pas des plus clair.
Pour débuter je te conseille de mémoire le site de Tengaal. (Il me semble avec les bases).

Maintenant vu que yann l'a commencé il peut peut-être aussi te passer la source. :wink:



En 3D :

http://ykoeth.free.fr/fc4d/xsTree/2.jpg (http://ykoeth.free.fr/fc4d/xsTree/2.jpg)

Petit problème pour l'axe des Z, je ne savais pas trop quoi mettre :

var endX = startX + length * cos ( angle ) ;
var endY = startY + length * sin ( angle ) ;
var endZ = startZ + length * ?

J'ai mis une formule qui rend quelque chose de potable (2 * cos(2*angle) * sin(2*angle)), mais il y a peux être mieux (et plus logique). :roll:



En 2D, un angle et une longueur suffisent pour déterminer la position d'un point.
Mais pas en 3D.

On peut utiliser par exemple les coordonnées sphériques. (Une longueur r, un angle teta et un angle phi)
Ou les coordonnées cylindriques.

En sphérique la formule devient:

z = r * cos (teta) (ou teta est l'angle avec l'axe z)
y= r * sin (teta) * sin (phi) (ou phi est l'angle avec l'axe des x)
x = r* sin (teta) * cos (phi)

Traditionnellement teta est compris entre -PI/2 et PI/2 et phi varie de 0 à 2 PI.

Il suffit donc de faire varier ces deux angles de manière aléatoire comme on faisait varier l'unique angle précédent. :odile:



Il faudrait régler la question du Random en coffee qui est un vrai calvaire. :coup:


Oui, le random proposé est vraiment dégueulasse. Je vais chercher une fonction mathématique chaotique pour le remplacer.

xs_yann
10/05/2008, 20h01
En sphérique la formule devient:

z = r * cos (teta) (ou teta est l'angle avec l'axe z)
y= r * sin (teta) * sin (phi) (ou phi est l'angle avec l'axe des x)
x = r* sin (teta) * cos (phi)

Traditionnellement teta est compris entre -PI/2 et PI/2 et phi varie de 0 à 2 PI.

Il suffit donc de faire varier ces deux angles de manière aléatoire comme on faisait varier l'unique angle précédent. :odile:



Il faudrait régler la question du Random en coffee qui est un vrai calvaire. :coup:


Oui, le random proposé est vraiment dégueulasse. Je vais chercher une fonction mathématique chaotique pour le remplacer.

Merci Jean-Laurent :prie:

C2
10/05/2008, 20h36
Tout à fait d'accord :mrgreen:
Plus qu'à mettre tout ça dans Xs3Dpaint Tool :bounce:
Non? pas tout de suite, bon :mrgreen:

BRAVO pour tout en tout cas :prie:

doudou
11/05/2008, 02h57
Maintenant vu que yann l'a commencé il peut peut-être aussi te passer la source. :wink: ce serait génial en effet mais maintenant que le travail commence à être abouti, autant que Yann poste son résultat dans les plug du site (1 - rendi caesaro quod est caesari ; 2 - si j'y était parvenu par moi même, je l'aurais fait de toute façon, le sens du partage étant un automatisme chez moi).

Moi, 'me suis simplement contenté de me cogner le pif sur cette formule lors de mes recherches sur le net (je voulais à l'origine trouver un générateur fractal duquel on pouvait extraire des splines), puis ai cherché à conjuguer les talents. Grand bien m'en a prit aux vues des premiers résultats. Félicitation au concepteur de la formule et surtout à vous les prog' pour vous être fadé ce qui à mes yeux est le plus dur : la concretisation.

Une graine et tombée du trou de ma poche lors d'une potagére balade et de ce beau végétal naisssant, vous étes les jardinniers :prie:.

Bienheureux sont ceux qui naquirent avec la bosse des math ... c'est un don inné bien qu'il y ait du boulot derriére of course.
Bravo les gars et grands mercis :poucehaut:

oli_d
11/05/2008, 07h43
:o :shock: :arg: :bave: :bave: :bave:

:efface: x1000
:prie: x1000

:bounce: x100

Vous êtes vraiment incroyables, pas le temps même de réfléchir au problème, que c'est réalisé.

Je ne sais pas comment on dit "total respect" sur la planète d'où vous venez !

doudou
11/05/2008, 11h13
'a y est, j'ai enfin remis là main sur le site où j'avais chopé cette formule et qui comprend un petit outil temps réel web pour générer un arbre fractal aléatoire à chaque clic

http://www.kirupa.com/developer/actionscript/chaos_fractal.htm

Merci à Ilyas Usal pour avoir partagé son code :)

Jean-Laurent
11/05/2008, 11h24
Amis des mathématiques bonjour. :odile:

Je me suis penché sur la question du random tout pourri de C4D.
On trouve facilement sur le Net de bons exemples de fonctions générant des nombres quasi aléatoires.
J'ai choisi la plus classique, le standard minimal de Parck et Miller.

Coffee l'accepte sans problème.



Alea(x)
{if(!initial)
initial=x;
var hasard=Modulo(16807*initial,pow(2,31)-1));
initial=hasard;
return (hasard);
}



Cette fonction aléatoire tire des nombres au hasard entre 1 et 2147483648.

Elle se répète pour une même valeur de x toutes les 2^31 fois. Autant dire que c'est pas trop mal
Si on l'utilise toutes les secondes elle ne sera plus aléatoire dans 68 ans.

Si on veut que ce soit une surprise à chaque fois il suffit d'utiliser l'horloge de l'ordi. Autrement on peut initialiser avec un premier chiffre au hasard (en dehors de 0).

Alea(4556) par exemple.

La grosse différence avec le random de C4D c'est que cette valeur d'initialisation peut n'être utilisée qu'au départ.

Si je fais 10000 fois de suite "Alea(4556)" dans un programme j'obtiendrais 10000 nombres "au hasard" sans avoir à changer le 4556. :roll:


J'ai évidemment voulu tester et c'est là que ça devient intéressant. 8)

J'ai simulé 10000 lancés de dés à 10 faces.
Pour voir si en moyenne j'obtenais bien environ 1000 fois le 1, 1000 fois le 2 etc ...

Et là: :o
Le 1 est obtenu 3040 fois, le 2 est obtenu 1764 fois puis 1275, 980, 784, 687, 588, 490 et 392.

J'ai pensé quelques secondes à l'erreur de programmation. :coup:

Et puis je me suis juste souvenu que j'étais un âne.
Pour faire mon lancer de dés j'avais pris le premier chiffre du nombre tiré au hasard.

Une anecdote pourtant bien connue des physiciens et des employés du FISC.

http://archi7.ouvaton.org/phys/dossiers/maths/benford.html

Quand on tire des nombres au hasard le premier chiffre est un 1 le plus souvent. :o
Le chiffre le moins fréquent étant le 9.

Il me suffit juste de régler ça pour faire une fonction qui tire aléatoirement sur l'intervalle 0-1. Ou 0 autre chose.
Une fonction coffee (box quelque chose) le fait très bien et on aura du vrai hasard facile à utiliser.

Pour ceux que ça intéresse je ferais dans la foulée un noeud coffee pour Xpresso. :odile:
Je sais que certains utilisent la fonction "Noise" mais elle se répète tout les 1024.


EDIT: La fonction finale:


var initial;


Alea (domaine,initialisation)
{
var hasard;

if(!initial)
initial=initialisation;
if(!initial) // On initialise avec l'horloge de l'ordinateur.
{var temps1=GeGetSysTime()->hour;
var temps2=GeGetSysTime()->minute;
var temps3=GeGetSysTime()->second;
initial=temps1*3600+temps2*60+temps3;
}

var depart= Modulo(16807*initial,(pow(2,31)-1)); // Tirage d'un nombre au hasard

if (domaine==0)
hasard=depart/(pow(2,31)-1); // On ramène le nombre entre 0 et 1.
if (domaine!=0)
hasard=int((domaine+1)*depart/(pow(2,31)-1)); // On tire un nombre entier entre 0 et domaine.

initial=depart;

return(hasard);
}



Elle fonctionne de la manière suivante en rentrant 2 paramètres.

Alea(20,256) par exemple.

20 signifie que l'on tire au hasard un entier entre 0 et 20. Une correction de copies par exemple. :mrgreen:
256 est la variable de départ.
Si on relance toujours avec 256. Les premières valeurs tirées au hasard seront toujours les mêmes. :wink:
Bref du hasard contrôlé.

Si on veut un hasard total on met le dernier paramètre à 0.
Alea(20,0)
Tirera une valeur imprevisible.

Enfin Alea(0,256) tire un float entre 0 et 1.

Bref Alea(0,0) correspond à la fonction random() classique d'une calculatrice.

Et le noeud en Xpresso: http://cinema4d.chez-alice.fr/aleatoire.c4d

xs_yann
12/05/2008, 14h58
J'ai bien fait de venir voir, tu as edité ton message. :roll:

Pour le temps tu peux utiliser la fonction "time()" en coffee.
Merci pour ce code, je vais étudier ça. :prie:

Jean-Laurent
12/05/2008, 15h18
J'ai bien fait de venir voir, tu as edité ton message. :roll:


Comme c'était dans la continuité du même thème et seulement deux heures après j'ai édité mais effectivement j'aurais pu éviter vu qu'il n'y avait pas d'autres sujets remontés. :oops:



Pour le temps tu peux utiliser la fonction "time()" en coffee.


Merci. :poucehaut:

doudou
05/06/2008, 11h06
Bonjour les prog' :) j'ai essayé de mettre vos formules en application pour créer un arbre mais sans succés :oops: auriez vous la gentillesse de pondre une petite scéne d'exemple C4D (sur une base de spline & extrusions) s'il vous plait ? :)

xs_yann
05/06/2008, 12h17
Salut doudou,

Si tu veux regarder voici la première ébauche en coffee : http://ykoeth.free.fr/fc4d/xstreecof.zip
Le code ne doit pas être très propre. :roll:
Sinon j'ai essayer de travailler un peu le code de J-L pour avoir une classe random utilisable :
En coffee :



class CustomRandom
{

public:
Init(seeds);
GetValue(max);
private:
var init;

};
var init;
CustomRandom::Init(seeds)
{
init = seeds;
}

CustomRandom::GetValue(max)
{
var rand;

if(!init) init = time();
var start = (16807*init) % (pow(2,31)-1);

if(!max) rand = start/(pow(2,31)-1);
else rand = int((max+1)*start/(pow(2,31)-1));

init = start;

return rand;

}

main(doc,op)
{
var rand = new(CustomRandom);
rand->Init(NULL);
var i;
for(i=0;i<20;i++)println(rand->GetValue(25));
println(" ");
}


Ca n'a pas l'air encore parfait. :?

doudou
05/06/2008, 12h42
Merci pour ta réponse Yann :wink: mais arf ... je dois merdouiller dans l'application du tag.

Ma manip : je crée une extrusion spline -> j'applique le tag coffee issu de ton zip sur l'extru' et n'obtient rien alors qu'un "no error" m'est notifié (j'ai essayé de l'appliquer direct sur le spline : tout pareil ... çà séléctionne le 2eme point du spline et c'est tout).

Pour ce qui est du code que tu as retouché de JL, çà me retourne un "too many parameters".

Quelle buse je fais ralala :oops:

xs_yann
05/06/2008, 12h46
Attention le code que je t'ai donné est un plug en entier, je vais voir si je peux l'adapter à une expression. :wink:
Par contre pour le random, je ne vois pas. :?
Tu es en quelle release de c4d?

xs_yann
05/06/2008, 12h51
Bon voici le code adapté pour une expression :



var branchLenght = 200;
var maxSize = 8;

MakeBranch(startX, startY, startZ, lenght, angle, size, container)
{
var rand = new(Random);
rand->Init(time());
var maxSubBranch = 4;
var maxSubAngle = 3*pi/4;


if(size>0)
{
var branch = AllocObject(Ospline);
var endX = startX + lenght * sin(angle) * cos(angle);
var endY = startY + lenght * sin(angle) * sin(angle);
var endZ = startZ + lenght * cos(angle);

var spline = AllocObject(Ospline);
var vc = new(VariableChanged);
vc->Init(0,2);
spline->Message(MSG_POINTS_CHANGED,vc);

var s = new(array,2);
s[0] = vector(startX,startY,startZ);
s[1] = vector(endX,endY,endZ);

spline->SetPoints(s);

var sweep = AllocObject(Osweep);
sweep->InsertUnder(container);

var circle = AllocObject(Osplinecircle);
circle#PRIM_CIRCLE_RADIUS = size;
circle#SPLINEOBJECT_ANGLE = Radians(30);
spline->InsertUnder(sweep);
circle->InsertUnder(sweep);

var subBranch = ceil(rand->Get01()*(maxSubBranch));
var branchLenghtDimin = 0.5+rand->Get01()/2;
var i;
for(i=0;i<subBranch;i++)
{
var newLenght = lenght * branchLenghtDimin;
var newAngle = angle + rand->Get01() * maxSubAngle - maxSubAngle / 2;
var newSize = size-1.4;
MakeBranch(endX, endY, endZ, newLenght, newAngle, newSize, container);
}
}
}



main(doc,op) {

var nullObj = AllocObject(Onull);
if(!op->GetDown())
{
doc->InsertObject(nullObj,op,NULL);
MakeBranch(0,0,0,branchLenght,pi/2,maxSize,nullObj);
}
EventAdd(MSG_UPDATE);

}


Tu as juste à créer un null et à mettre ce code dans une expression COFFEE en tag. :wink:

doudou
05/06/2008, 13h05
Release 10
j'avais essayé sur un null avec les autres formules mais comme tu l'as dit, le code n'était pas adapté pour une expression.
Là çà marche nickel :poucehaut: un grand merci à toi de t'être mis à la portée du profane que je suis :love:
On commence à avoir une bonne architecture d'arbre là ... sincére bravo :poucehaut:

luistappa
17/06/2008, 03h44
Bien joué Messieurs :poucehaut:
Je dois vous avouer qu'à chaque fois que je vois des trucs comme cela je suis très tenté de replongé dans la prog, mais je sais aussi que mon temps libre étant limité, il me faudrait choisir entre ça et modéliser... Déjà que j'ai du mal à terminer mes wips ;-)
Donc je vous admire et merci encore pour ce job.

Histoire de vous faire marrer, j'avais fais en Visual basic avec Excell un trucs similaire qui générait des fichiers Povray... Tenez rien que de prononcer le nom de Povray ça me laisse rêveur...