Last active
August 29, 2015 14:07
-
-
Save runys/601ba1e8ab9f854cdba4 to your computer and use it in GitHub Desktop.
Estudo da reta
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <cmath> | |
#include <cstdio> | |
#define DIREITA -1 | |
#define ESQUERDA 1 | |
#define SOBRE 0 | |
using namespace std; | |
const double ERRO = 0.00000001; | |
typedef struct { | |
double a; | |
double b; | |
double c; | |
} Reta; | |
typedef struct{ | |
double x; | |
double y; | |
} Ponto; | |
//Cria uma RETA a partir de DOIS PONTOS | |
Reta reta(Ponto p1, Ponto p2){ | |
Reta r; | |
if(p1.x == p2.x){ | |
r.a = 1; | |
r.b = 0; | |
r.c = -p1.x; | |
} else{ | |
r.b = 1; | |
r.a = -(p1.y - p2.y) / (p1.x - p2.x); | |
r.c = -(r.a * p1.x) - (r.b * p1.y); | |
} | |
return r; | |
} | |
//Cria uma reta a partir de um PONTO e uma INCLINACAO | |
Reta reta_com_m(Ponto p, double m){ | |
Reta r; | |
r.a = -m; | |
r.b = 1; | |
r.c = -((r.a * p.x) + (r.b * p.y)); | |
return r; | |
} | |
//Saber se duas RETAS sao PARALELAS | |
bool isParalelas(Reta r1, Reta r2){ | |
return ( (fabs(r1.a - r2.a) <= ERRO) && (fabs(r1.b - r2.b) <= ERRO)); | |
} | |
//Saber se as duas RETAS sao a mesma RETA | |
bool isMesmaReta(Reta r1, Reta r2){ | |
return (isParalelas(r1, r2) && fabs(r1.c - r2.c) <= ERRO); | |
} | |
//Retorna o PONTO onde duas RETAS se cruzam | |
Ponto interseccao(Reta r1, Reta r2){ | |
Ponto p; | |
if(isMesmaReta(r1,r2)){ | |
printf("Mesma reta. Todos os pontos intersectam.\n"); | |
p.x = p.y = 0.0; | |
return p; | |
} | |
if(isParalelas(r1,r2)){ | |
printf("Retas paralelas. Nenhum ponto de interseccao.\n"); | |
p.x = p.y = 0.0; | |
return p; | |
} | |
p.x = (r2.b * r1.c - r1.b * r2.c) / (r2.a * r1.b - r1.a * r2.b); | |
if (fabs(r1.b) > ERRO) // Testa se a linha eh vertical | |
p.y = - (r1.a * (p.x) + r1.c) / r1.b; | |
else | |
p.y = - (r2.a * (p.x) + r2.c) / r2.b; | |
return p; | |
} | |
//Angulo de interseccao entre duas RETAS em radianos | |
double angulo_interseccao(Reta r1, Reta r2){ | |
return atan((r1.a*r2.b - r2.a*r1.b) / (r1.a*r2.a + r1.b*r2.b)); | |
} | |
//Ponto mais proximo de uma de um PONTO dado em uma RETA | |
Ponto ponto_mais_proximo(Ponto p, Reta r){ | |
Ponto ponto_mais_proximo; | |
if(fabs(r.b) <= ERRO){ //se a reta for vertical | |
ponto_mais_proximo.x = -(r.c); | |
ponto_mais_proximo.y = p.y; | |
return ponto_mais_proximo; | |
} | |
if(fabs(r.a) <= ERRO){ //se a reta for horizontal | |
ponto_mais_proximo.x = p.x; | |
ponto_mais_proximo.y = -(r.c); | |
return ponto_mais_proximo; | |
} | |
//caso base | |
Reta perpendicular = reta_com_m(p,1/r.a); //cria uma reta perpendicular | |
ponto_mais_proximo = interseccao(r, perpendicular); //ponto de interseccao dessa reta com R | |
return ponto_mais_proximo; | |
} | |
//Menor distancia entre um PONTO e uma RETA | |
double distancia_ponto_reta(Ponto p, Reta r){ | |
return fabs(r.a*p.x + r.b*p.y + r.c)/sqrt(r.a*r.a + r.b*r.b); | |
} | |
//Determina a posicao do ponto C em relacao a reta formada por A e B | |
int posicao_ponto_reta(Ponto a, Ponto b, Ponto c){ | |
double det = ((a.x-c.x)*(b.y-c.y)) - ((a.y-c.y)*(b.x-c.x)); | |
if(fabs(det) <= ERRO) //colineares | |
return SOBRE; | |
if(det > 0) | |
return ESQUERDA; | |
else if(det < 0) | |
return DIREITA; | |
return 0; | |
} | |
//TESTES | |
int main(){ | |
Ponto p1 = {1,1}; // {x,y} | |
Ponto p2 = {2,2}; | |
Ponto p3 = {3,4}; | |
Reta r = reta(p1, p2); | |
Reta r2 = reta_com_m(p3, 2); | |
printf("Equacao da reta R1: %.1f x + %.1f y + %.1f = 0\n", r.a, r.b, r.c); | |
printf("Equacao da reta R2: %.1f x + %.1f y + %.1f = 0\n", r2.a, r2.b, r2.c); | |
printf("R1 paralela com R2? %d\n", isParalelas(r, r2)); | |
printf("R1 paralela com R1? %d\n", isParalelas(r, r)); | |
printf("R1 eh a mesma reta que R1? %d\n", isMesmaReta(r, r)); | |
printf("R1 eh a mesma reta que R2? %d\n", isMesmaReta(r, r2)); | |
Ponto i = interseccao(r,r2); | |
printf("Ponto de interseccao: {%.1f,%.1f}\n", i.x, i.y); | |
printf("Angulo de interseccao: %.1f rad\n", angulo_interseccao(r, r2)); | |
Ponto p4 = {7,8}; | |
printf("Distancia entre P4 e R1: %.1f\n", distancia_ponto_reta(p4,r)); | |
Ponto p5 = ponto_mais_proximo(p4, r); | |
printf("Ponto na reta R1 mais proximo de P4{%.1f,%.1f} = {%.1f,%.1f}\n", p4.x, p4.y, p5.x, p5.y); | |
Ponto p6 = {0,0}; | |
Ponto p7 = {1,1}; | |
Ponto p8 = {0,1}; | |
Ponto p9 = {1,0}; | |
Ponto p10 = {2,2}; | |
printf("Ponto {%.1f,%.1f} esta %d da reta ({%.1f,%.1f},{%.1f,%.1f})\n",p8.x,p8.y,posicao_ponto_reta(p6,p7,p8),p6.x,p6.y,p7.x,p7.y); | |
printf("Ponto {%.1f,%.1f} esta %d da reta ({%.1f,%.1f},{%.1f,%.1f})\n",p9.x,p9.y,posicao_ponto_reta(p6,p7,p9),p6.x,p6.y,p7.x,p7.y); | |
printf("Ponto {%.1f,%.1f} esta %d da reta ({%.1f,%.1f},{%.1f,%.1f})\n",p10.x,p10.y,posicao_ponto_reta(p6,p7,p10),p6.x,p6.y,p7.x,p7.y); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment