PokerChipRace physics explanations

  • There is no friction on the table.

  • The mass of an entity is equal to it’s surface area.

  • When 1 chip eats another entity, the chip gains the mass of the entity and its new position is the center of gravity between the 2 entities, the resulting velocity is the weighted average by the mass of the 2 velocities.

V = (v1m1 + v2m2) / (m1+m2)

  • When you propel a chip, it launches an entity of 1/15 of its mass, and shrinks accordingly. The launched entity always has a relative speed of 200 units/round. The force applied to the propelling chip is the same as the one applied to the propelled entity but in the opposite direction. So to the speed of the chip will be added 200/14 units/round, because it is 14 times bigger that what it expelled. You cannot fire when your radius is below 5 units.

  • When you collide with a border or another entity with exactly the same size, you bounce off without any friction. The applied impulse is calculated with this formula :

impulse = normalVector2(normalVector · relativeVelocity)/(1/entity1mass + 1/entity2mass)

13 Likes

Thanks ! This will be extremely useful.

Alex

1 Like

Dans le cas d’une absortion. Est-ce que le centre de l’objet absorbant est recalculé ( en prenant le centre de gravité des deux objets ) ?
Dans le cas d’une absortion une entité peut se trouver dans une position incohérente ( distance au bord inférieure au rayon ). Que se passe-t-il dans ce cas ?
Cdlt,
Yves Mocquard.

@mocquard_yves

Donc oui sa position est recalculée et le cas que tu décris ne peut pas arriver car le rayon de l’entité finale est inférieur à la somme des rayons des entités et surtout la différence de position entre le centre d’une entité et le centre de gravité est supérieure au gain de rayon (pas le temps de faire la démonstration maintenant par contre, désolé ^^)

1 Like

Désolé, mais imaginons 2 entitées E1 et E2 plaqués sur le bord haut. pour chacune avec vx = 0. Soit R1 et R2 leurs rayons, C1 et C2 leurs centre.
si R1 > R2 au contact le nouveau centre de E1 est sur le segment [C1,C2], il se raproche donc du bord, et le rayon augmente on est donc le cas ou le rayon est supérieur à la distance au bord.
Cdlt,
Yves Mocquard

1 Like

Je voulais dire vy=0 c’est a dire elles se deplacent le long du bord haut.
YM.

Dans ce cas, l’entité est automatiquement et immédiatement ramené dans la position cohérente la plus proche.

1 Like

En l’éloignant perpendiculairement au bord concerné je suppose ?

@mocquard_yves J’ai hâte que vous soumettiez une IA !

A.

impulse = normalVector2(normalVector · relativeVelocity)/(1/entity1mass + 1/entity2mass)

Comment utiliser cette formule dans le cas d’une collision avec un mur ?

impulse = normalVector2(normalVector · relativeVelocity)/(1/entity1mass + 1/entity2mass)

Comment utiliser cette formule dans le cas d’une collision avec un mur ?

En théorie, elle reste valable, en considérant la masse du mur comme étant infinie.
Ça se simplifie cependant très très bien :slight_smile:

Concernant l’absorption, je n’avais effectivement pas pensé à cette situation, la prochaine fois j’éviterai de répondre à l’arrache :slight_smile:

J’ai peur de ne pas être aussi à l’aise que toi avec ce calcul :frowning:

Il suffit simplement d’inverser le vecteur selon l’axe en question.
Si la vitesse initiale est de (vx, vy),
-après un rebond sur un bord vertical, la nouvelle vitesse est (-vx, vy)
-après un rebond sur un bord horizontal, la nouvelle vitesse est (vx, -vy)

2 Likes

Pour ca, ca va. Mais ca ne m’a pas l’air trop coller avec la formule précédente…

Sinon, en quel point se fait le rebond ? J’aurais dit la première intersection du jeton avec le mur… mais ca semble pas trop mal se goupiller en ne considérant que le centre…

Vous en pensez quoi ?

l suffit simplement d’inverser le vecteur selon l’axe en question.
Si la vitesse initiale est de (vx, vy),
-après un rebond sur un bord vertical, la nouvelle vitesse est (-vx, vy)
-après un rebond sur un bord horizontal, la nouvelle vitesse est (vx, -vy)

Exactement, pas besoin de la formule dans un algo pour les collisions avec les murs.

Sinon, en quel point se fait le rebond ? J’aurais dit la première
intersection du jeton avec le mur… mais ca semble pas trop mal se
goupiller en ne considérant que le centre…

@Pirquessa
Plus ton jeton est gros, plus la différence entre les deux cas va être importante.
Le contact se fait avec le bord du jeton et non le centre, considère donc quand tu en as besoin une arène de dimensions (800-2R, 515-2R).

Ok, c’est bien ce que je pensais mais ca ne marche pas très bien je trouve… Je dois avoir un petit problème…

Sinon, est-ce qu’il y a des arrondis de faits ? On voir les coordonnées arriver en float pourtant de temps en temps j’ai des “centre.x + rayon > 799” (genre 799.16 la dernière fois…), ce qui me semble étonnant…

1 Like

Vu que l’arène fait 800x515, je suppose qu’il faut considérer les intervalles [0,800[ et [0,515[. Les maxima seraient 799 et 514 si les coordonnées étaient entières.

1 Like

Would be great to use english in comments. Don’t be so selfish.

12 Likes

ces histoires de masse rendent les chhangement de direction ultra complexe pour effectuer un virage precis a x degrés ! une piste pour la formules adequate pour un novice en vecteur ? :stuck_out_tongue:

Hi Guys!

I’m trying to modelise the physics of the game, so I am checking my results trying to confirm with what the game is giving. So I write unit tests to be sure I got the correct results using the numbers I am reading from std::in

But if for now movement without collision, merging two chips, or accelerate them is fine (I got the exact same numbers with a 6 decimals precision…) I have issues with bouncing. I get really close results, but they are not exactly equals. I first thought there was a rounding issue in my code (that’s so easy to multiply by an int when you wanted doubles :smiley: ), but even doing the computation manually confirm what my code outputs…

Let’s take an example:

Here is an oil droplet: (id, player, radius, x, y, vx, vy):(71,-1,11.254541,674.958088,243.466867,204.594188,5.062425)

The next turn the system tells me it became:
(71,-1,11.254541,698.314828,248.529292,-204.594188,5.062425)

You’ll note that its radius is the same, there was no collision with another object.
It should bounce when its x is reaching 800-11.254541 = 788.745459
Its position if there was no wall would have been 674.958088+204.594188=879.552276 so it bounced on the wall :wink:
the difference between the bouncing x and its position without no wall is 879.552276-788.745459=90.806817
So our oil droplet should be at x=788.745459-90.806817=697.938642!
That’s different from 698.314828!

I tried multiple time the computation, but I am always getting the same different result…

Any idea anyone?

1 Like