Ir ao conteúdo
  • Cadastre-se

Algoritmo - ajuda


Posts recomendados


using System;

public class Program

{

public static void Main()

{

Console.WriteLine("Verifica se existe colisão!");

Quadrado checaQ1 = new Quadrado();

Console.Write("Insira x de Q1:");

checaQ1.x = float.Parse(Console.ReadLine());

Console.Write("Insira y de Q1:");

checaQ1.y = float.Parse(Console.ReadLine());

Console.Write("Insira altura de Q1:");

checaQ1.altura = float.Parse(Console.ReadLine());

Console.Write("Insira largura de Q1:");

checaQ1.largura = float.Parse(Console.ReadLine());

Quadrado checaQ2 = new Quadrado();

Console.Write("Insira x de Q2:");

checaQ2.x = float.Parse(Console.ReadLine());

Console.Write("Insira y de Q2:");

checaQ2.y = float.Parse(Console.ReadLine());

Console.Write("Insira altura de Q2:");

checaQ2.altura = float.Parse(Console.ReadLine());

Console.Write("Insira largura de Q2:");

checaQ2.largura = float.Parse(Console.ReadLine());

Colisao col = new Colisao(checaQ1, checaQ2);

if (col.ExisteColisao()) {

Console.WriteLine("Colisão: BUMMMM");

}

else {

Console.WriteLine("Não houve colisão");

}

}

public class Colisao {

public Colisao(Quadrado q1, Quadrado q2){

quad1 = q1;

quad2 = q2;

}

Quadrado quad1;

Quadrado quad2;

public bool ExisteColisao() {

if (quad1.x + quad1.largura > quad2.x) {

return true;

}

if (quad2.x + quad2.largura > quad1.x) {

return true;

}

if (quad1.y + quad1.altura > quad2.y) {

return true;

}

if (quad2.y + quad2.altura > quad1.y) {

return true;

}

return false;

}

}

public class Quadrado {

public float x {get;set;}

public float y {get;set;}

public float altura {get;set;}

public float largura {get;set;}

public Quadrado() {

}

public Quadrado(float px, float py, float alt, float larg){

x=px;

y=py;

altura = alt;

largura = larg;

}

}

}

Link para o comentário
Compartilhar em outros sites

A área de um retângulo com coordenadas (A, B ), e comprimento L e altura H, contém todos os pontos (x, y) tal que:

(x >= A) && (x <= A+L) && (y >=  && (y <= B+H)Onde && representa a operação lógica E ou AND.

A condição para que haja uma colisão entre 2 retângulos é que 1 dos 2 retângulos tenha pelo menos 1 ponto (x, y) que esteja dentro do outro retângulo.

 

E como estamos lidando com retângulos é suficiente checar se pelo menos 1 dos 4 vértices do retângulo satisfazem a condição de estar dentro do outro retângulo. (Note que você deve checar os vértices de ambos os retângulos em relação a área do outro, pois pode haver uma situação em que 1 está totalmente contido no outro, ou que 2 vértices do mesmo lado estejam contidos no outro retângulo.)

Link para o comentário
Compartilhar em outros sites

@CypherNet seu programa parece estar acusando colisão mesmo quando não há colisão, ou pelo menos quando testei estes valores ele afirmou que há colisão quando não há:

Verifica se existe colisão!Insira x de Q1:2Insira y de Q1:2Insira altura de Q1:5Insira largura de Q1:5Insira x de Q2:10Insira y de Q2:10Insira altura de Q2:2Insira largura de Q2:2Colisão: BUMMMM
Link para o comentário
Compartilhar em outros sites

Ainda há problemas, agora está dizendo que não há colisão quando há:

Verifica se existe colisão!Insira x de Q1:4Insira y de Q1:2Insira altura de Q1:4Insira largura de Q1:4Insira x de Q2:2Insira y de Q2:4Insira altura de Q2:4Insira largura de Q2:4Não houve colisão

É necessário checar todos os 4 vértices do primeiro retângulo em relação a área do segundo retângulo, e também fazer o oposto, checar os vértices do segundo retângulo em relação a área do primeiro.

Link para o comentário
Compartilhar em outros sites

Pessoal,

 

 

Não seria apenas isto?

#include <stdio.h>struct _box{    float x, y, l, a;} box1 = {4, 2, 4, 4}, box2 = {2, 4, 4, 4};// box1 = A// box2 = Bint main(){    if (box1.x + box1.l >= box2.x && // aresta direita de A >= aresta esquerda de B,        box1.x <= box2.x + box2.l && // aresta esquerda de A <= aresta direita de B,        box1.y + box1.a >= box2.y && // aresta inferior de A >= aresta superior de B, E        box1.y <= box2.y + box2.a)   // aresta superior de A <= aresta inferior de B    {        printf("Collision");    }    else    {        printf("No Collision");    }    return 0;}

[ ]'s

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!