2010-11-02 5 views
1

Voici mon problème:Lignes générées de manière aléatoire avec des extrémités prédéfinies

J'ai deux points aléatoires (x, y) et (x2, y2). Je voudrais faire une ligne «aléatoire» ou fractale entre les deux. J'ai mis en place une situation dans laquelle la distance et la direction de l'étape sont générées de manière aléatoire sur la base d'une matrice de probabilité. Cependant, en le laissant uniquement à la direction de cette matrice, la ligne aura un point final aléatoire qui est impossible à déterminer à l'avance. J'ai donc essayé d'établir des limites pour ma ligne où - si un point tombe - l'emplacement est ajusté en conséquence. Ces limites ne fonctionnent pas.

Idéalement, mes limites seraient un cercle créé avec chaque point aléatoire aux extrémités opposées de la zone. J'ai essayé ce qui suit.

  1. avoir établi une boucle qui itérer à travers chaque x-point de la ligne en utilisant une variable i qui commence avec le moins élevé de x et x2 et se déplace vers la plus grande.

  2. avoir établi un variable j dans laquelle l'étape aléatoire est ajouté et initialisé à la valeur y équivalent pour la moindre valeur x (si x1 est supérieur ensemble à y1 fixé d'autre à x) . J'ai mis en place une variable qui contient la pente de la droite théorique entre x, y et x1, y1.

  3. J'ai mis en place une matrice de probabilité qui prend une variable mod et la définit à une valeur entre 8 et -8.

  4. J'ai mis en place des contrôles pour interdire la formation de la ligne en dehors des limites du plan donné.

  5. J'ai mis en place une vérification pour déterminer si la variable i est inférieure de 1 à la plus grande de x et x2. Si c'est le cas, la variable j est mise à la valeur y de cette valeur de x;

C'est à ce stade que je ne parviens pas à trouver l'algorithme approprié pour mettre en place la vérification finale. Voici ce que je voudrais que l'algorithme fasse:

A. Je voudrais qu'il puisse, étant donné une valeur x aléatoire entre x et x1, déterminer si la variable courante j a été ajoutée à la variable courante mod est en dehors du cercle généré par les deux points susmentionnés (voir le deuxième paragraphe). Si ce n'est pas le cas, ajoutez le mod à la variable j et incrémentez la boucle. B. Si ce point tombe en dehors des limites, je voudrais que la direction de pas soit inversée (par exemple de -6 à 6 et de 2 à -2) et que la même vérification soit faite à nouveau. C. Si l'addition dans l'une ou l'autre direction la mettrait hors des limites (ce qui se produira très probablement près de l'extrémité du cercle où les limites se resserrent le plus), j'aimerais pouvoir parcourir une boucle qui vérifie chaque valeur et son inverse commençant à 0 et se déplaçant vers des valeurs consécutives plus grandes jusqu'à ce qu'une valeur exploitable soit déterminée. J'espère que vous rencontrez des mathématiciens et des programmeurs là-bas voir cela comme un défi surmontable.Cela m'a bloqué pendant trois semaines et je n'ai plus d'idées.

+0

J'ai modifié ma réponse pour couvrir votre commentaire sur la réponse @ McWafflestix. –

Répondre

1

La manière habituelle de créer des arêtes fractales est de commencer par une ligne droite et de subdiviser récursivement selon une règle, qui peut être déterministe ou non déterministe (c'est-à-dire, permettre un certain caractère aléatoire). En fonction de vos besoins, vous devrez peut-être veiller à ce que votre règle ne permette pas aux lignes de se croiser. Il peut être suffisant d'imposer un angle maximum entre une ligne et les lignes qui résultent de sa subdivision (, je pense). Mais ne me citez pas là-dessus. Un algorithme simple pour cela est de déplacer le point médian de la ligne perpendiculairement à la ligne d'une certaine distance aléatoire en proportion de la longueur de la ligne.

+0

Battez-moi de 20 secondes! :-) –

1

Il existe un moyen plus simple. Un moyen beaucoup plus facile.

Vous connaissez déjà vos points de terminaison. Si vous souhaitez générer une ligne fractale entre vos deux extrémités, prenez simplement le segment de ligne défini par vos deux extrémités et divisez-le en deux en ajoutant un nouveau point intermédiaire décalé par rapport à la ligne courante d'une valeur aléatoire (varier cette quantité et la direction que vous avez décalée définira effectivement la "forme" de votre fractale). Vous avez maintenant deux segments de ligne qui relient vos points de terminaison d'origine; pour augmenter le caractère aléatoire, répétez sur chacun des deux segments de ligne.

+0

Cela semble beaucoup plus facile! Cependant, je rencontre un problème similaire. Comment déterminez-vous la coordonnée résultante? Évidemment, la valeur y sera ((1/2) longueur de ligne/j * mod) où j est l'étendue de la randomisation (8 dans ce cas) et mod est entre j et -j. Mais comment déterminez-vous la valeur x? – Jay

+0

@Jay: vous pensez encore trop. Votre point médian (x3, y3) commence entre les deux extrémités (x1, y1) et (x2, y2); x3 = (x1 + x2/2); y3 = (x1 + x2/2). Maintenant que vous avez votre point médian, il suffit de le déformer acheter une quantité aléatoire (en utilisant une certaine méthode, choisissez une quantité de déformation aléatoire (x4, y4) et ajoutez-la à vos coordonnées médianes (x3, y3) que vous venez de déterminer. la "forme" de votre fractale est la façon dont vous déterminez votre quantité de déformation (x4, y4). –

1

Google 'courbe de remplissage de l'espace », et vous obtiendrez les dimensions de flocon de neige Koch et fractale entre un et deux, et toutes sortes d'autres goodies.

Questions connexes