Ir ao conteúdo

Interseção entre reta e círculo


Kaz

Posts recomendados

Postado

Olá,

Estou com problemas para calcular se uma reta intersecta uma circunferência, seja em Java/C++.

Disponho das coordenadas de dois pontos da reta, e das coordenadas de centro e raio do círculo.

Pesquisando, descobri que devo obter a equação da reta através de Y = AX + b, onde A é o coeficiente angular (y1 - y0 / x1 - x0).

Daí, vi que deveria substituir os valores de y na equação reduzida da circunferência (x-a)² + (y - B)² = r², onde a e b sao o centro da circunferência e r seu raio.

A partir daí, obtém-se uma equação de segundo grau, onde calculando delta verifico se:

delta > 0 : reta intersecta em dois pontos

delta = 0 : reta intersecta em um ponto

delta < 0 : reta não intersecta

Após isso, usando Baskara é possível descobri quais as raízes de interseção.

Minha dúvida está em como descobrir o valor de b na equação da reta, e em como substituir tais valores na equação reduzida da circunferência.

E, como achar os valores de a b e c na equação de segundo grau? Computacionalmente estou com dificuldades de solucionar esse problema.

O cálculo será usado em colisão de sprites.

Grato desde já

Postado

Para achar B na equação da reta, basta substituir X e Y pelos valores de 1 dos pontos da reta que você tem, e A pelo valor que você encontrou, assim, ficará:

B = Y - AX

Para substituir na equação do circulo, é fazer o que você mesmo disse, substituir o valor de Y encontrado da equação da reta aqui no lugar do Y do circulo.

Postado
Para achar B na equação da reta, basta substituir X e Y pelos valores de 1 dos pontos da reta que você tem, e A pelo valor que você encontrou, assim, ficará:

B = Y - AX

Para substituir na equação do circulo, é fazer o que você mesmo disse, substituir o valor de Y encontrado da equação da reta aqui no lugar do Y do circulo.

Obrigado pela ajuda com o valor de B! Estava na cara esse tempo todo! rsrs

Mas quanto ao Y da equação da circunferência, não estou entendendo o sentido de substituir apenas o Y da reta no Y da circunferência, e manter o X. Porém, se isolar o X da reta obterei o X em função do Y, e se substituir ambos, continuo com X e Y na equação de 2º grau!

Aí que me confundi todo!

Postado

a equação da reta "y= Ax + B" representa todos os valores de "y" que pertencem a reta.

lembrando que ao procurar pontos onde um grafico intercepta outro, na verdade estamos procurando pontos em comum entre esses graficos, ou seja, pontos que pertencem a ambos os graficos então para achar que pontos são esses assumimos que ambos os "y" (da reta e da circunferencia) são iguais e substituimos com a intenção de testar se há algum "x" real valido que atenda ambas as equações.

substituindo diretamente a equação da reta na equação da circunferencia,

(x-a)^2 + ((Ax+B)-b)^2 = r^2

como você já sabe essa substituição levara a uma função de segundo grau, a partir dai você pode usar a sua ideia inicial.

delta > 0 : reta intersecta em dois pontos

delta = 0 : reta intersecta em um ponto

delta < 0 : reta não intersecta

em caso de delta negativo não a nenhum "x" real valido que atenda ambas as equações logo a reta e a circunferencia não têm nenhum ponto em comum.

em caso de delta igual a zero só há um unico "x" que satisfaça ambas as equações, ou seja, a reta passa tangenciando a circuferencia.

em caso de delta positivo há 2 valores de "x" que satisfazem ambas as equações logo a reta toca a circunferencia em dois pontos diferentes.

ao final, se for necessario saber o ponto "y" onde ocorre a interceptação basta substituir os valores validos que você encontrou para "x", na equação da reta assim você determinar o ponto (x,y) onde houve a interceptação.

espero ter sido claro, embora eu ache que enrolei muito XD.

Boa sorte com o projeto, Falou o/

Postado

Problema com o B pessoal:

Como achar o valor de B, se:

Y = ax + b

b = Y - ax

Substituindo Y...

b = ax + b - ax

b = b

O valor do B é um escalar que pode ser ignorado??

Postado

exemplo,

vamos determinar a eq. de uma reta que passe pelos pontos

A e B, sendo A=(3,4) e B=(2,2).

Inicialmente determinamos o vetor diretor, ou seja, um vetor que vai de A até B(note que tambem poderiamos calcular de B até A, o vetor teria a mesma direção porém sentido contrario).

(3,4)->(2,2)

calculo do vetor diretor é apenas o ponto final menos o pontos inicial

(2,2)-(3,4) = (2-3,2-4) = (-1,-2)

(-1,-2) é o vetor diretor

OBS.: vetor diretor é o vetor que vai da origem até o ponto que o define, neste caso o (-1,-2), ele indica a direção da reta,ou seja, a reta tem a mesma inclinação que seu vetor diretor.

a equação parametrica dessa reta ficaria:

{

x= 3 + (-1)t (-O 3 é a cordenada x do ponto inicial, o -1 é a coordenada x do vetor diretor, o t é um parametro qualquer.)

y= 4 + (-2)t (-O 4 é a coordenada y do ponto inicial, o -2 é a coordenada y do vetor diretor, o t é um parametro qualquer.)

}

OBS.: O parametro é um numero qualquer que você pode escolher, se você definir que t=N(numero a sua escolha) então quando substituir esse N em ambas as equações achará os valores de x,y que formam um ponto pertencente a reta. Note que o ponto inicial é sempre o ponto onde o parâmetro é zero.

t=t, então se isolarmos t em cada equação e substituir seu valor obtemos

(x-3)/(-1) = (y-4)/(-2),

a partir deste ponto você pode isolar x ou y como desejar.

geralmente y é a variavel escolhida, então vamos isolar y.

(-2)((x-3)/(-1)) = (y-4)

2x-6 = y-4

2x-6+4 = y

2x-2 = y

y = 2x-2, essa é a equação cartesiana da reta que passa por A e B.

Essa é um explicação rapida e feita como exemplo, um livro de calculo vetorial talvez seja mais fácil de entender, geralmente eles explicam mais de um metodo para se obter a equação de um reta.

Caso eu tenha cometido algum erro por favor me corrija,

espero ter sido claro.

escrevi esse programinha em c++, você entra com as coordenadas e ele imprime na tela a equação da reta, testei ele apenas com duas retas então se tiver erros desculpa ai.

Falou boa sorte o/

Falou o/


#include "stdafx.h"
#include <string.h>
#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

double B(double x, double y, double x0, double y0){ //encontra e retorna o coeficiente linear (o valor de
return ((y-y0)*((-x0/(x-x0))))+y0;
}

double A(double x, double y, double x0, double y0){ //encontra e retorna o coeficiente angular (o valor de A)
return (y-y0)/(x-x0);
}

int _tmain(int argc, _TCHAR* argv[])
{
double x,y,x0,y0;

cout << "insira as coordenadas do primeiro ponto: (separadas por espaço)"<<endl;
cin >> x >> y;
cout << endl << "insira as coordenadas do segundo pontos : (separadas por espaço)" << endl;
cin >> x0 >> y0;

cout << setprecision(2);
cout << "y = " << A(x,y,x0,y0) <<"x +(" << B(x,y,x0,y0) <<")" << endl<<endl;

system("pause");
return 0;
}

Arquivado

Este tópico foi arquivado e está fechado para 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!