public void ResultaColisao(Bola a, Bola b) { double xDist = a.X - b.X; double yDist = a.Y - b.Y; double distSquared = Math.Pow(xDist, 2) + Math.Pow(yDist, 2); //Verifica a distâncias evitando a raiz. if (distSquared <= (a.Raio + b.Raio) * (a.Raio + b.Raio)) { double xVelocity = b.XVelocidade - a.XVelocidade; double yVelocity = b.YVelocidade - a.YVelocidade; double dotProduct = xDist * xVelocity + yDist * yVelocity; //Verificação de um objeto colidindo no outro if (dotProduct > 0) { double collisionScale = dotProduct / distSquared; double xCollision = xDist * collisionScale; double yCollision = yDist * collisionScale; //O que eu falei pra Vitória de explicar os vetores e resultados das direções. double combinedMass = a.Massa + b.Massa; double collisionWeightA = 2 * b.Massa / combinedMass; double collisionWeightB = 2 * a.Massa / combinedMass; a.XVelocidade += collisionWeightA * xCollision; a.YVelocidade += collisionWeightA * yCollision; b.XVelocidade -= collisionWeightB * xCollision; b.YVelocidade -= collisionWeightB * yCollision; } } }
public void AddObjeto(Bola obj) { if (this._resultadoColisao.PosicaoOcupada(obj)) { throw new ArgumentException("Posição já ocupada!"); } this._bola.Add(obj); }
private void HandleCollisions() { for (int i = 0; i < this._bola.Count; i++) { Bola a = this._bola[i]; this._resultadoColisao.ResolveColisaoBorda(a); for (int j = i + 1; j < this._bola.Count; j++) { Bola b = this._bola[j]; this._resultadoColisao.ResultaColisao(a, b); } } }
public void ResolveColisaoBorda(Bola b) { if (b.X - b.Raio <= 0 || b.X + b.Raio - this._desenhaAreaWidth > 0) { b.XVelocidade *= -1; } if (b.Y - b.Raio <= 0 || b.Y + b.Raio - this._desenhaAreaHeight > 0) { b.YVelocidade *= -1; } }
private void Move(Bola o) { o.X += o.XVelocidade; o.Y += o.YVelocidade; this._desenhaArea.UpdatePosicao(o); }
public bool PosicaoOcupada(Bola b) { return(false); }
public abstract void UpdatePosicao(Bola ball);