Skip to content

Instantly share code, notes, and snippets.

@runys
Last active August 29, 2015 14:07
Show Gist options
  • Save runys/601ba1e8ab9f854cdba4 to your computer and use it in GitHub Desktop.
Save runys/601ba1e8ab9f854cdba4 to your computer and use it in GitHub Desktop.
Estudo da reta
#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