Eu sou um desenvolvedor de jogos em flash que é um pouco atrasado em matemática, embora eu ache a física interessante e legal.
Para referência, este é um jogo semelhante ao que estou fazendo: Jogo em flash desembaraçado
Eu fiz esse jogo desembaraçado quase até a conclusão completa da lógica. Porém, quando duas linhas se cruzam, preciso que as linhas entrelaçadas ou 'emaranhadas' mostrem uma cor diferente; vermelho.
Seria muito gentil da sua parte se você pudesse sugerir um algoritmo para detectar colisões de segmentos de linha . Eu sou basicamente uma pessoa que gosta de pensar 'visualmente' do que 'aritmeticamente' :)
Editar: gostaria de adicionar alguns diagramas para tornar a ideia mais clara
PS Estou tentando fazer uma função como
private function isIntersecting(A:Point, B:Point, C:Point, D:Point):Boolean
Desde já, obrigado.
Respostas:
Eu uso o método a seguir, que é praticamente uma implementação desse algoritmo . Está em C #, mas a tradução para o ActionScript deve ser trivial.
Há um problema sutil com o algoritmo, que é o caso em que duas linhas são coincidentes, mas não se sobrepõem. O algoritmo ainda retorna uma interseção nesse caso. Se você se importa com esse caso, acredito que esta resposta no stackoverflow tenha uma versão mais complexa que a aborda.
Editar
Estranho, eu testei e está funcionando para mim, exceto no único caso que descrevi acima. Usando exatamente a mesma versão que publiquei acima, obtive esses resultados quando o testei:
fonte
Sem divisões! Portanto, não há problema com precisão nem por divisão por zero.
O segmento de linha 1 é de A a B O segmento de linha 2 é de C a D
Uma linha é uma linha sem fim, o segmento de linha é uma parte definida dessa linha.
Verifique se as duas caixas delimitadoras se cruzam: se não houver interseção -> Sem cruz! (cálculo feito, retorno falso)
Verifique se a linha seg 1 ultrapassa a linha seg 2 e se a linha seg 2 ultrapassa a linha seg 1 (ou seja, o segmento 1 da linha está nos dois lados da linha definida pelo segmento 2).
Isso pode ser feito traduzindo todos os pontos por -A (ou seja, você move as 2 linhas para que A fique em origo (0,0))
Então você verifica se os pontos C e D estão em lados diferentes da linha definida por 0,0 a B
Se você ainda não recebeu um "No Cross", continue usando A, B versus C, D, mas C, D versus A, B (os mesmos cálculos, apenas troque A e C, B e D), se não houver "Sem cruz!" então você tem um cruzamento!
Pesquisei os cálculos exatos para o produto cruzado e encontrei Este post do blog que explica o método também.
fonte
Eu só quero dizer que eu precisava dele para o meu jogo Gamemaker Studio e funciona bem:
fonte
A resposta aceita deu uma resposta errada neste caso:
Essas linhas obviamente não se cruzam, mas de acordo com a função na "resposta correta" as linhas se cruzam.
Isto é o que eu uso:
retorna 0 = as linhas não se cruzam
retorna> 0 = as linhas se cruzam
Atualize para responder à pergunta:
Eu não criei esse código pessoalmente. Ele tem mais de 5 anos e não sei qual é a fonte original. Mas..
Eu acho que o valor de retorno é a posição relativa da primeira linha onde eles cruzam (para explicar mal). Para calcular o ponto de interseção, você provavelmente poderia usar o lerp assim:
(NÃO TESTEI ISSO)
fonte