2010-01-24 4 views
3

Je travaille sur un moteur de physique de corps mou C# 2d et j'ai besoin d'assigner des masses aux sommets d'un objet donné: une liste de sommets (positions x, y), la masse totale de l'objet et le centre de masse.Comment puis-je calculer des masses ponctuelles individuelles?

Le centre de masse est donnée à:

alt text

où,

R = center of mass 
M = total mass 
mj = mass of vertex j 
rj = position of vertex j 

je besoin d'un algorithme qui peut se rapprocher chaque mj donné R, M et rj.

éditer: Je veux juste préciser que je suis conscient qu'il existe un ensemble infini de solutions. Je cherche un algorithme rapide qui trouve un ensemble de mj (tels qu'ils sont chacun suffisamment proches de mj = M/[nombre de sommets] et où "suffisamment" est défini comme un petit seuil flottant).

De plus, chaque objet consistera d'environ 5 à 35 points.

+0

Vous devez représenter des objets tels que des anneaux creux? –

+0

Non, ce sont des objets solides convexes ou concaves. – zfedoran

+0

Comptez le DoF manquant, attribuez à plusieurs objets une masse un peu plus basse que la moyenne, et tentez de résoudre le système restant ... s'il échoue, marchez au hasard la masse assignée par un peu. Mousser, rincer, répéter. Mais je n'appellerais pas un âne sauvage une approximation. – dmckee

Répondre

1

Compter les degrés de liberté: pour les points dans l'espace D dimensions que vous avez D+1 équations [+] et n inconnues pour n particules séparées. Si n>D+1 vous êtes perdu (sauf si vous avez plus d'informations que ce que vous nous avez dit sur: les contraintes de symétrie, les moments d'ordre supérieur, etc ...).

éditer: Ma version antérieure supposait que vous aviez le m_i s et recherchais le r_i s. C'est un peu mieux quand vous avez le r_i s et que vous voulez le m_i s.

[+] Celui que vous liste ci-dessus (qui est réelle équation D séparée) et M = \sum m_j


Arriu dit:

Oh désolé, je mal compris votre question. Je pensais que vous demandiez si je modélisais des objets tels qu'un tore, un anneau ou un anneau (objets avec des découpes ...). Je modélise des corps avec seulement des coquilles externes (comme des ballons ou des bulles). Je n'ai besoin de rien de plus complexe que ça.

Maintenant, nous allons quelque part. Vous faire en savoir plus.

Vous pouvez approximer la surface de l'objet en le divisant en triangles entre des points adjacents. Cette superficie totale vous donne une densité de masse moyenne. Maintenant, trouvez le déficit de DoF, et attribuez-y beaucoup de r_i s (tiré au hasard, je suppose) une masse initiale basée sur la densité moyenne et 1/3 de la surface de chaque triangle auquel elle est partie. Ensuite, résolvez analytiquement le système restant. Si le problème est mal conditionné, vous pouvez soit dessiner un nouvel ensemble de points assignés, soit tenter une marche aléatoire sur les masses que vous avez déjà devinées.

+0

le mot clé est "approximatif" – zfedoran

+1

Si vous "résolvez" votre système en utilisant les méthodes habituelles pour résoudre des équations simultanées, vous vous retrouverez avec des équations décrivant l'ensemble des solutions en termes de quelques variables. Choisissez simplement des valeurs arbitraires pour ces variables si vous voulez une solution particulière. –

+0

Lorsque vous êtes 1 DoF court, le résultat est une ligne complète de solution acceptable. Lequel des points infinis que vous proposez de prendre? Si vous êtes 2 DoF, c'est un avion, etc ... Alors, avez-vous quelque chose d'autre? Une compréhension de ce qu'est la gamme de masse typique? Rien du tout? – dmckee

0

Je retournerais le problème.C'est-à-dire, étant donné une densité et la position de l'objet (naturellement naturellement le centre de masse de l'objet et trois vecteurs correspondant à l'orientation de l'objet, voir les angles d'Euler), à chaque sommet associer un volume à élément (qui changerait avec la résolution et pourrait être fractionnaire pour les positions au bord de l'objet) et multiplierait la densité (d_j) par le volume associé (v_j), m_j = v_j * d_j. Cette approche devrait naturellement reproduire le centre de la masse de l'objet. Peut-être que je n'ai pas compris votre problème, mais considérez que cela donnerait finalement la masse correcte (Mass = sum (m_j) = sum (v_j * d_j)) et au pire cette approche devrait donner une vérification de votre résultat .

1

Le centre de masse R changera constamment au fur et à mesure que les sommets se déplaceront. Donc, si vous avez 10 sommets, stockez les valeurs de 10 "frames" consécutifs - cela vous donnera 10 équations pour vos 10 inconnues (en supposant que les masses ne changent pas au fil du temps).

+0

Il * peut * parler d'éléments finis dans un corps rigide, ce qui tuerait cela. Ou il peut avoir à le faire avec un seul échantillon. Mais c'est une idée mignonne. – dmckee

+0

Je fais référence à la forme de base d'un corps mou. La forme de base ne change jamais. Il définit à quoi ressemblera le corps mou s'il n'est pas déformé. – zfedoran

+0

Avez-vous une densité uniforme ou même proche de l'uniforme? Si oui, vous pouvez tirer parti de cela ... – dmckee

2

Vous pouvez calculer le CM d'un polygone uniformément dense comme suit: numéroter les sommets N de 0..N-1, et les traiter cycliquement, de sorte que le sommet N enveloppements au sommet 0:

total_area = sum[i=0..N-1](X(p[i],p[i+1])/2) 
CM = sum[i=0..N-1]((p[i]+p[i+1])*X(p[i],p[i+1])/6)/total_area 

    where X(p,q)= p.x*q.y - q.x*p.y [basically, a 2D cross product] 

Si le polygone est convexe, le CM sera à l'intérieur du polygone, de sorte que vous pouvez raisonnablement commencer en découpant la zone en triangles comme une tarte, avec le CM au centre. Vous devriez être capable de pondérer chaque sommet d'un triangle avec un tiers de sa masse, sans changer le CM - cependant, cela laisserait toujours un tiers de la masse totale au CM du polygone entier. Néanmoins, la mise à l'échelle du transfert de masse de 3/2 devrait vous permettre de diviser la masse de chaque triangle entre les deux sommets "externes". En conséquence,

area[i] = X((p[i]-CM), (p[i+1]-CM))/2 
    (this is the area of the triangle between the CM and vertices i and i+1) 

mass[i] = (total_mass/total_area) * (area[i-1] + area[i])/2 

Notez que ce type de transfert de masse est profondément « non physique » - si rien d'autre, si elle est traitée littéralement, il bousiller le moment de quelque chose d'inertie féroce. Cependant, si vous avez besoin de distribuer la masse entre les sommets (comme pour une sorte d'explosion), et que vous ne voulez pas perturber le CM, cela devrait faire l'affaire.

Enfin, quelques avertissements:

  • si vous n'utilisez pas le CM réelle pour cela, il ne fonctionnera pas droit
  • il est dangereux de l'utiliser sur des objets concaves; vous risquez de finir avec des masses négatives
Questions connexes