O programa seguinte permite calcular a distância entre dois pontos da recta criando para o efeito uma classe muito simples.
main.cpp
#include <iostream>
#include <cmath>
#include "PontoRecta.h"
using namespace std;
int main(){
// Declarar os objectos
PontoRecta a,b;
// Inicializar os valores
b.setValue(-5.2);
// Calcular a distância
cout << "A distância na recta entre os pontos de coordenadas " <<
a.getValue() << " e " << b.getValue() << " é " <<
fabs(b.getValue() - a.getValue()) << endl;
}
PontoRecta.h
#ifndef PONTO_RECTA_H
#define PONTO_RECTA_H
class PontoRecta{
public:
// Construtor default
PontoRecta(){
x = 0;
}
// Definir a coordenada do ponto na recta
void setValue(float a){
x = a;
}
// Obter a coordenada do ponto na recta
float getValue(){
return x;
}
private:
float x;
};
#endif
Observações
- O nome da classe é PontoRecta;
- A classe contém um membro-dado ( x ) que é privado;
- A classe contém dois membros-função ( setValue e getValue ) que são públicos;
- É utilizado um construtor por defeito, que posiciona os pontos criados na origem o eixo, ou seja, na coordenada 0;
- Os membros-função são implicitamente definidos inline;
- A função é definida no ficheiro PontoRecta.h, pelo que poderá ser utilizada por qualquer programa que necessite de manipular objectos desta natureza;
- No programa principal são criados dois objectos (duas instâncias) do tipo PontoRecta, ficando automaticamente cada uma deles a possuir todas as características definidas pela classe a que pertencem, quer em termos de dados, quer em termos de métodos (funções-membro);
- Não é atribuído nenhum valor a a, pelo que este fica com o valor 0 (zero), uma vez que temos o nosso construtor por defeito;
E agora …
Naturalmente que esta classe está ainda a nascer … e muito fica ainda por dizer.
Apenas a título de exemplo vamos incluir na classe um método que permita calcular a distância entre um ponto e outro cuja coordenada é passada por parâmetro.
main.cpp
#include <iostream>
#include "PontoRecta.h"
using namespace std;
int main(){
// Declarar os objectos
PontoRecta a,b;
// Inicializar os valores
b.setValue(-5.2);
// Calcular a distância
cout << "A distância na recta entre os pontos de coordenadas " <<
a.getValue() << " e " << b.getValue() << " é " <<
a.distancia(b.getValue()) << endl;
}
PontoRecta.h
#include <cmath>
#ifndef PONTO_RECTA_H
#define PONTO_RECTA_H
class PontoRecta{
public:
// Construtor default
PontoRecta(){
x = 0;
}
// Definir a coordenada do ponto na recta
void setValue(float a){
x = a;
}
// Obter a coordenada do ponto na recta
float getValue(){
return x;
}
float distancia(float p){
return fabs(x-p);
}
private:
float x;
};
#endif
Mas eis que surge uma dúvida!
Porque razão é que eu utilizei na linha 14 de main.cpp o seguinte?
a.distancia(b.getValue());
Se b é um objecto a própria classe devia tratá-lo como tal, e depois saber como obter o valor de x!
Que alterações é necessário fazer?
Novo versão a seguir.
main.cpp
#include <iostream>
#include "PontoRecta.h"
using namespace std;
int main(){
// Declarar os objectos
PontoRecta a,b;
// Inicializar os valores
b.setValue(-5.2);
// Calcular a distância
cout << "A distância na recta entre os pontos de coordenadas " <<
a.getValue() << " e " << b.getValue() << " é " <<
a.distancia(b) << endl;
}
PontoRecta.h
#include <cmath>
#ifndef PONTO_RECTA_H
#define PONTO_RECTA_H
class PontoRecta{
public:
// Construtor default
PontoRecta(){
x = 0;
}
// Destrutor
~PontoRecta(){
std::cout << "Objecto destruído!" << std::endl;
}
// Definir a coordenada do ponto na recta
void setValue(float a){
x = a;
}
// Obter a coordenada do ponto na recta
float getValue(){
return x;
}
float distancia(const PontoRecta &p){
return fabs(x-p.x);
}
private:
float x;
};
#endif
Observações
- Acrescentei o método destruidor para sabermos quando cada objecto é destruído (libertada a memória associada);
- A função-membro distancia passa a receber o endereço do objecto a ser utilizado no cálculo da distância. No te-se que o x e o p.x representam o mesmo atributo mas em objectos diferentes;
- Porquê const? Experimentem adicionar a linha p.x=33 na função distancia!
- E a passagem de parâmetros por referência! É mesmo necessária? Retirem o & e contem as mensagens do método ~PontoRecta();
Abril 29, 2009 ás 9:29 am
sabes me explicar como é k se declara uma recta em c++ para depois declarar uma outra para saber se se ela intersecta a primeira?
obrigado
Abril 29, 2009 ás 11:23 am
Bem … esta questão é mais matemática do que sobre programação!
Supondo que utilizas a equação reduzida da recta ( y = mx + b ) a solução para o teu problema passa pela resolução de um sistema de duas equações do primeiro grau com duas incógnitas …
É um assunto interessante mas vai dar trabalho … pode ser que alguém passe por aqui e nos mostre a coisa já feita :)
Boa sorte ;)
Abril 29, 2009 ás 11:27 am
ahhh … já me esquecia … podes criar uma classe “Recta” a partir de dois membros privados “m” e “b” …