Partage
  • Partager sur Facebook
  • Partager sur Twitter

Distribuer des points uniformement sur un triangle

Sujet résolu
    28 mai 2019 à 12:12:15

    Hello tout le monde!
    Alors voilà, je voulais transformer un triangle (défini par 3 points A(Xa, Ya, Za) B(Xb, Yb, Zb) C(Xc, Yc, Zc)) en nuage de points. Donc en gros remplir le triangle avec des points.
    Pour avoir un nuage de point a peu près cohérent j'ai utilisé cet algo :

    faire 100 * Aire(ABC):


    je génère i, nombre aléatoire entre 0 et 1

     je génère j, nombre aléatoire entre 0 et 1 - i 

     je génère k, égale a 1 - i - j


    Puis je crée un point N = i * A + j * B + k * C


    je rajoute N a mon nuage de points

     (désolé, il y avait un mauvais formatage)

     Le résultat est presque correct, sauf que j'ai un problème. Mais j'ai l'impression qu'avec cette méthode, on distribue le même nombre de points mais sur des surfaces de plus en plus petite, alors au niveau du points C, il y a une densité plus grande qu'entre A et B.
    Est ce qu'il existe une solution pour résoudre ce probleme de densité pour avoir toujours la même densité?


    Merci beaucoup!



    -
    Edité par KirbXCoucou 28 mai 2019 à 13:00:53

    • Partager sur Facebook
    • Partager sur Twitter

    « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
    D. Mendeleïev

      28 mai 2019 à 14:25:14

      Dans ton procédé, tu génères i entre 0 et 1. Donc en moyenne i vaut 0.5

      Puis tu génères j entre 0 et 1-i, donc j vaut en moyenne 0.25, et idem k vaut en moyenne 0.25.

      Ce n'est donc pas équilibré, et ça peut donner ce que tu décris. Je pense qu'en fait, c'est surtout le point A qui est traité à part. Mais si tu as un triangle 'pas équilatéral du tout', ça peut donner l'impression que c'est C qui est traité différement.

      Ici, je ferais :

      Prendre i,j,k, 3 nombres au hasard entre 0 et 1

      Calculer s = i+j+k

      Normaliser : i1 = i/s ; j1=j/s et k1 = k/s

      Puis créer le point N= i1*A + j1*B + k1*C

      Mais même comme ça, je ne suis pas 100% convaincu que les points seront équitablement répartis. Je pense qu'il y a un déséquilibre entre les 3 angles, et le cnetre du triangle

      • Partager sur Facebook
      • Partager sur Twitter
        28 mai 2019 à 14:49:34

        Merci ! Je vais réfléchir à ta méthode et l'essayé pour voir.

        (EDIT : Je viens de tester ta méthode. Même si j'ai fais un échantillon de 2 modèles, on s'aperçoit effectivement que la repartition n'est pas équitable. il y a moins de points dans les coins)


        Mais entre temps j'ai pensé a une autre solution :

        Prendre i, j  2 nombres au hasard entre 0 et 1.
        calculer AB et AC et prendre le point A + (AB * i) + (AC * j). => ça me donne des points réparti dans le parrallélogramme ABA'C.
        Ensuite (la je bloque), il faut savoir si le point appartient au triangle ABC ou A'BC, et, le cas échéant soit l'enlever soit trouvé son point correspondant dans le triangle ABC. Je pense que ça c'est équitablement réparti. Mais pour trouver une technique pour savoir si le point est a "gauche" ou a "droite" du segment B,C me pose encore des problèmes ^^'

        -
        Edité par KirbXCoucou 28 mai 2019 à 14:53:43

        • Partager sur Facebook
        • Partager sur Twitter

        « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
        D. Mendeleïev

          28 mai 2019 à 15:10:33

          Si i+j est supérieur à 1, le point est dans le 2ème triangle. Et là,effectivement, tu as une distribution uniforme.
          • Partager sur Facebook
          • Partager sur Twitter
            28 mai 2019 à 15:22:55

            Ahahahaha! J'étais en train de chercher un truc avec les angles, voir si on avait des angles obtu en calculant l'arccos des vecteurs , mais la solution c'était juste i + j < 1... Ahah
            Merci beaucoup :):)

            EDIT : Donc pour une réponse si quelqu'un à le même problème un jour :
            Pour X points :  dans le triangle ABC
            prendre 0 <= i, j <= 1 aléatoire
             si (i+j <= 1)
               P = A + (AB * i) + (AC * j)
             sinon
               P = A + (AB * (1-i)) + (AC * (1 - j))
            
            


            -
            Edité par KirbXCoucou 28 mai 2019 à 15:28:52

            • Partager sur Facebook
            • Partager sur Twitter

            « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
            D. Mendeleïev

            Distribuer des points uniformement sur un triangle

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown