2013-08-06 3 views
0

У меня проблема с столкновением с кругом, а не с обнаружением столкновения, а с обработчиком, который решает конфликт.Столкновение статического круга с разным размером (радиус)

Чтобы все было в порядке, я буду использовать два круга. Одна из них имеет радиус 50, а другой 30. Когда круги пересекаются это то, что обработчик делает

//Calculates distance between circles 
var nDistX:Number = CircleB.x - CircleA.x; 
var nDistY:Number = CircleB.y - CircleA.y; 
var nDistance:Number = Math.sqrt (nDistX * nDistX + nDistY * nDistY); 

//Gets the radius 
var radiusA:Number = CircleA.width/2; 
var radiusB:Number = CircleB.width/2; 

//Calculates midpoint   
var midpointX:Number = (CircleA.x + CircleB.x)/2; 
var midpointY:Number = (CircleB.y + CircleB.y)/2; 

//Calculates the new position 
CircleA.x = midpointX + radiusA * (CircleA.x - CircleB.x)/nDistance; 
CircleA.y = midpointY + radiusA * (CircleA.y - CircleB.y)/nDistance; 
MCBallB.x = midpointX + radiusB * (CircleB.x - CircleA.x)/nDistance; 
MCBallB.y = midpointY + radiusB * (CircleB.y - CircleA.y)/nDistance; 

Код выше работает безупречно, когда в отношении двух кругов с тем же радиусом. Когда круги пересекаются (например, нерестится в координатах, близких к каждому из них) круги кружатся друг от друга.

Проблема начинается, когда круги имеют два разных размера. То, что происходит, когда они пересекаются, - это то, на что похоже, что большой круг убегает от меньшего круга, все еще прикрепленного.

У любого из вас есть идея, почему это происходит?

ответ

0

Мое лицо получило пощечину. Я забыл, что, когда у вас есть два объекта с разными радиусами, вам нужно получить среднее значение из двух. Поэтому, если есть другие люди, имеющие ту же проблему. Добавьте это:

var averageRadius:Number = (radiusA + radiusB)/2; 

И заменить позиции локатора с этим:

CircleA.x = midpointX + averageRadius * (CircleA.x - CircleB.x)/nDistance; 
CircleA.y = midpointY + averageRadius * (CircleA.y - CircleB.y)/nDistance; 
CircleB.x = midpointX + averageRadius * (CircleB.x - CircleA.x)/nDistance; 
CircleB.y = midpointY + averageRadius * (CircleB.y - CircleA.y)/nDistance; 
Смежные вопросы