Skip to content

Instantly share code, notes, and snippets.

@rogerioagjr
Created June 15, 2015 07:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rogerioagjr/44fcfaadd16d864c05f8 to your computer and use it in GitHub Desktop.
Save rogerioagjr/44fcfaadd16d864c05f8 to your computer and use it in GitHub Desktop.
Viagem Espacial
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int n, resp;
double xc, yc, r, delta=0.00000000001;
int main(){
// leio os valores de n, xc, yc e r
scanf("%d %lf %lf %lf", &n, &xc, &yc, &r);
// para cada tiro
for(int i=1; i<=n; i++){
// leio os dos pontos que o determinam
double x1, y1, x2, y2;
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
// se a reta é paralela ao eixo das abscissas
if(x1==x2){
// a distância é a diferença etre as coordenadas x
// da reta e do centro do asteroide
if(abs(xc-x1)<=r) resp++;
continue;
}
// se a reta é paralela ao eixo das ordenadas
if(y1==y2){
// a distância é a diferença etre as coordenadas y
// da reta e do centro do asteroide
if(abs(yc-y1)<=r) resp++;
continue;
}
// se não, calculo o termos da equação comum da distância
double a=(y2-y1)/(x2-x1), b=-a*x1+y1;
double p=yc-a*xc-b, q=xc-(yc-b)/a;
//se o ponto da reta usado como referência for o centro do asteroide
if(p==q && p==0){
// então o tiro acertou o alvo
resp++;
continue;
}
// se não, calculo a distância normalmente
double d=abs(p*q)/sqrt(p*p+q*q);
// e se ela for menor que o raio, a reta cprta o círculo
if(d<=r+delta) resp++;
}
// após a leitura da entrada, imprimo o valor de resp
printf("%d\n", resp);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment