Jump to content
anfil89

Intersecção linha com circunferência

Recommended Posts

anfil89

Boas, alguém me sabe dizer se existe alguma função nas bibliotecas de Java que verifique se uma recta intersecta uma circunferência?

Eu sei que existe uma que verifica se duas rectas se intersectam, que é a Line2d.linesIntersect(...), mas uma recta com uma circunferência não sei se existe...

Share this post


Link to post
Share on other sites
S7sRuss

Provavelmente há alguma biblioteca com uma solução adequada.

Mas em vez de procurares, podes implementar o teu próprio método.  :smoke:

Se pensares um pouco em matemática, uma linha tem uma equação y=m*x+b, onde m indica o declive da recta e b é o valor de y com x=0.

Exemplo:http://www.wolframalpha.com/input/?i=y%3D4*x-3

E uma circunferência tem uma equação (x-i)²+(y-j)²=r², onde i e j são as coordenadas do centro da circunferência e r o raio.

Exemplo:http://www.wolframalpha.com/input/?i=%28x-1%29%C2%B2%2B%28y%2B1%29%C2%B2%3D2%C2%B2

Sendo assim, a intersecção das duas funções só pode gerar 3 resultados possíveis: Não intersecta, intersecta num ponto ou em 2 pontos.

Para verificar isso podemos substituir o y da circunferência por m*x+b.

A equação final fica: (x-i)²+(m*x+b-j)²=r²

O teu Line2D começa em xi e acaba em xf. Para cada x no intervalo [xi,xf] que torne a equação final verdadeira, a intersecção é em [x,m*x+b].  Pronto... já parece assustador  :) Do ponto de vista de um programador, fazer um for a essa equação é, no mínimo, decepcionante.  :wallbash: A intersecção pode ter valores reais... E ninguém com uma mente sã vai fazer um for com números reais... (Ex: for( d=xi; d<=xf ; d+=0.00000000001) )

Mas felizmente, dá para reduzir a equação.

Vê aqui: http://www.wolframalpha.com/input/?i=%28x-i%29%C2%B2%2B%28m*x%2Bb-j%29%C2%B2%3Dr%C2%B2

Usa as duas primeiras soluções. x=- ...  e x= ....

Atenção à restrição: m²+1 != 0

Essas expressões podem parecer grandes  :D mas assim, só com poucas linhas, obtens as respostas que queres.


"Lamento... Detectou mais de dez mil ficheiros infectados..."

Share this post


Link to post
Share on other sites
anfil89

Provavelmente há alguma biblioteca com uma solução adequada.

Mas em vez de procurares, podes implementar o teu próprio método.  :smoke:

Se pensares um pouco em matemática, uma linha tem uma equação y=m*x+b, onde m indica o declive da recta e b é o valor de y com x=0.

Exemplo:http://www.wolframalpha.com/input/?i=y%3D4*x-3

E uma circunferência tem uma equação (x-i)²+(y-j)²=r², onde i e j são as coordenadas do centro da circunferência e r o raio.

Exemplo:http://www.wolframalpha.com/input/?i=%28x-1%29%C2%B2%2B%28y%2B1%29%C2%B2%3D2%C2%B2

Sendo assim, a intersecção das duas funções só pode gerar 3 resultados possíveis: Não intersecta, intersecta num ponto ou em 2 pontos.

Para verificar isso podemos substituir o y da circunferência por m*x+b.

A equação final fica: (x-i)²+(m*x+b-j)²=r²

O teu Line2D começa em xi e acaba em xf. Para cada x no intervalo [xi,xf] que torne a equação final verdadeira, a intersecção é em [x,m*x+b].  Pronto... já parece assustador  :) Do ponto de vista de um programador, fazer um for a essa equação é, no mínimo, decepcionante.  :wallbash: A intersecção pode ter valores reais... E ninguém com uma mente sã vai fazer um for com números reais... (Ex: for( d=xi; d<=xf ; d+=0.00000000001) )

Mas felizmente, dá para reduzir a equação.

Vê aqui: http://www.wolframalpha.com/input/?i=%28x-i%29%C2%B2%2B%28m*x%2Bb-j%29%C2%B2%3Dr%C2%B2

Usa as duas primeiras soluções. x=- ...  e x= ....

Atenção à restrição: m²+1 != 0

Essas expressões podem parecer grandes  :D mas assim, só com poucas linhas, obtens as respostas que queres.

Obrigado, mas ja encontrei uma solução e é bem mais simples :)

Share this post


Link to post
Share on other sites
pedrotuga

awd.graphics2d suporta detecção de colisões. Não se se um segmento de recta é um objecto válido, provavelmente é. Se não for podes usar por exemplo um rectângulo com um pixel de largura.

A tua pergunta devia ser mais específica, um segmento de recta e uma circunferência são conceitos matemáticos, não referes a abstracção que estás a usar para esses conceitos. Eu assumi que é a biblioteca de gráficos do awt. Mas pode não ser o caso.

Share this post


Link to post
Share on other sites
Baderous

Não sei se já repararam mas o tópico já estava marcado como resolvido quando ainda só tinha o 1º post.

Share this post


Link to post
Share on other sites
anfil89

Não sei se já repararam mas o tópico já estava marcado como resolvido quando ainda só tinha o 1º post.

Isso foi porque eu consegui resolver logo o problema a seguir a criar o post. Eu pedi a um moderador para o eliminar porque tornou-se desnecessário (e foi a si por sinal)...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.