Distância entre dois pontos na recta – Abordagem segundo o paradigma ADT em C++

O programa seguinte permite calcular a distância entre dois pontos da recta criando para o efeito uma classe muito simples.

rectareal

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

  1. O nome da classe é PontoRecta;
  2. A classe contém um membro-dado ( x ) que é privado;
  3. A classe contém dois membros-função ( setValue e getValue ) que são públicos;
  4. É utilizado um construtor por defeito, que posiciona os pontos criados na origem o eixo, ou seja, na coordenada 0;
  5. Os membros-função são implicitamente definidos inline;
  6. A função é definida no ficheiro PontoRecta.h, pelo que poderá ser utilizada por qualquer programa que necessite de manipular objectos desta natureza;
  7. 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);
  8. 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

  1. Acrescentei o método destruidor para sabermos quando cada objecto é destruído (libertada a memória associada);
  2. 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;
  3. Porquê const? Experimentem adicionar a linha p.x=33 na função distancia!
  4. E a passagem de parâmetros por referência! É mesmo necessária? Retirem o & e contem as mensagens do método ~PontoRecta();

3 Respostas para “Distância entre dois pontos na recta – Abordagem segundo o paradigma ADT em C++”

  1. luis Miguel Says:

    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

  2. Graciano Torrão Says:

    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 ;)

    • Graciano Torrão Says:

      ahhh … já me esquecia … podes criar uma classe “Recta” a partir de dois membros privados “m” e “b” …


Deixe uma Resposta