Bonjour,
Je cherche à créer un nuage de points représentant la Voie Lactée. Pour ce faire je souhaiterais placer aléatoirement des milliers de points afin que ceux-ci en prennent la forme.
Je ne sais pas comment m'y prendre... Merci d'avance !
Bonjour,
Je cherche à créer un nuage de points représentant la Voie Lactée. Pour ce faire je souhaiterais placer aléatoirement des milliers de points afin que ceux-ci en prennent la forme.
Je ne sais pas comment m'y prendre... Merci d'avance !
Aurais-tu une image de ce que tu cherches à obtenir ?
Ingénieur indépendant en mécatronique - Conseil, conception et formation
- Conception mécanique (Autodesk Fusion 360)
- Impression 3D (Ultimaker)
- Développement informatique (Python, MATLAB, C)
- Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)
« J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)
Bonjour,
Pour générer un nuage dans un disque, génère le rayon et l'angle en coordonnées polaires.
Ca me semble plus compliqué qu'un simple cercle. J'imagine qu'on pourrait implémenter des modèles de création de l'univers / création d'astres par gravité, puis dessiner ce qu'un observateur voit en un point... Peut être trop ambitieux.représentant la Voie Lactée
La vraie difficulté, c'est de traduire en terme de distribution (loi marginale du rayon, support borné ou pas, isotropie- ie indépendance rayon/angle...) les propriétés supposées de l'objet que tu cherches à représenter.
Si on ne connait pas les propriétés finales, on peut aussi simuler la dynamique: par exemple pars d'une uniforme sur un disque, fais agir la gravité +un moment de rotation et regarde ce que ça donne après un temps long.
Bref il faut surement se documenter sur le sujet
Non, pas vraiment, mais simplement un cercle avec une épaisseur.
Ici, mon code forme un nuage en forme de sphère autour de l'origine.
Je voudrais que l'origine soit le centre du disque avec les points s'étalant autour selon cette forme de disque.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Origine = [0,0,0]; Exo = 1+(15000-1)*rand(10000,1); Vectors = randn(length(Exo),3); norms = sqrt(sum(Vectors.^2,2)); Vectors = bsxfun(@rdivide,Vectors,norms); Vectors = bsxfun(@times,Vectors,Exo); Vectors(end,:) = 0; P = bsxfun(@plus, Vectors, Origine); plot3(P(:,1),P(:,2),P(:,3),'.')
Oulala merci VV3D mais je ne pense pas avoir les compétences pour créer une vraie galaxie !
Un simple disque rappelant sa forme suffira !
Par contre pourrais-tu détailler ?
Génère le rayon et l'angle en coordonnées polaires
Pour générer uniformément dans un disque, génère:
- r uniforme sur [0,R]
- a uniforme sur [0 2pi]
- z uniforme sur [z1,z2]
Par exemple
passe r,a en cartésien via
Code : Sélectionner tout - Visualiser dans une fenêtre à part z= z1 + (z2-z1)*rand(Npoint,1)
x= r cos(a)
y= r sin(a)
et voila (x,y,z) uniforme sur le disque.
Merci mais concrètement, même après recherches, je n'y arrive pas. Je comprends tes équations mais comment les appliquer réellement ?
Ou bloques-tu ? Montre nous le code qui pose problème.
En réalité je ne sais même pas par où commencer
Salut, alors pour la génération de nombre aléatoires, je te conseille de faire un petit
rand(1,N) génère un vecteur de N nombres aléatoires entre 0 et 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part doc rand
Ensuite, petit point de géométrie que t'avait donné VV33D : Un point dans un disque de rayon R est donné par
x = r*cos(theta)
y = r*sin(theta)
avec 0<r<R et 0<theta<2*Pi
tu veux placer N points aléatoires dans ce disque de rayon R.
il te faut donc tirer un vecteur de N valeurs aléatoires équireparties entre 0 et R, qui représente tes valeurs r
tu tires aussi un vecteur de N valeurs aléatoires theta equireparties entre 0 et 2*Pi, en suivant l'exemple juste au dessus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 r = R*rand(1,N)
tu retrouves ensuite les coordonnées (x,y) de tes N points avec les fameux
et le tour est joué.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 x = r.*cos(theta) y = r.*sin(theta)
VV33D te proposait également de tirer une coordonnée z si tu travaille en 3D et souhaite faire l'approximation disque = cylindre mince.
Voila, dis nous si tu y arrives
Merci beaucoup, je pense avoir réussi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 N = 10000; r = 15000*rand(1,N); theta = (2*pi)*rand(1,N); x = r.*cos(theta); y = r.*sin(theta); z = 150*rand(1,N); plot3(x, y, z, '.');
J'ai des doutes sur l'uniformité qui en résulterait sur le disque
Dehttp://fr.wikipedia.org/wiki/Loi_uniforme_continue
Or le jacobien du passage en coord. polaire vaut r et n'est pas constant.Condition suffisante — La loi de la variable aléatoire Y=T(X), image, par une transformation T, d'une variable X uniforme sur une partie A de \scriptstyle\ \R^{d},\ est encore la loi uniforme sur T(A) si T est, à un ensemble négligeable près, injectif et différentiable, et si, presque partout sur A, la valeur absolue du jacobien de T est constante.
Ca ne me semble pas très grave vu que tu ne savais pas quelle loi utiliser. La loi qui en résulte ne semble pas trop stupide non plus.
Non effectivement, j'ai remarqué que ce n'était pas parfaitement uniforme mais ce n'est pas grave du tout. Pour ce que j'ai à faire ce n'est qu'un infime détail.
Ben c'est pas si grave vu que dans la majorité des galaxies, le centre est plus densément peuplé que la périphérie
Oui justement, cette "erreur" semble plutôt être bénéfique !
Pour générer l'uniforme, la densité du rayon doit être proportionnelle à r, ie
f_rayon(r) = 2*r /Rmax^2. la fonction de répartition est facilement inversible, donc c'est faisable efficacement via F^-1(Uniforme)
Une autre solution, générer uniformément dans le carré puis restreindre au cercle (un nombre aléatoire de données donc). Attention, ici la proba de rejet -> 1 avec la dimension ambiante, donc peu efficace en grande dimension (mais convenable en dimension 2).
PS: pourquoi ne puis-je pas éditer mon post contenant l'erreur ?
Merci pour ton aide, je vais tout de même tester avec une uniformité.
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