Resolução exercício 3

O enunciado pede que seja criada uma classe chamada Ponto para representar um ponto em um plano cartesiano. Como sugerido no enunciado, usaremos o tipo double para as coordenadas.

Declaração da classe e dos atributos:

```
public class Ponto {
   protected double x, y;  // coordenadas do ponto

```

Note que os atributos ficam protegidos, isso impede que sejam diretamente acessados de fora da classe. A seguir o enunciado pede que sejam feitos 3 construtores: padrão, parametrizado e de cópia:

```
   // Construtor padrão (não tem parâmetros).
   // Inicializa o ponto na origem do plano.
   //
   public Ponto(){
      x = 0;
      y = 0;
   }

   // Construtor parametrizado.
   // Inicializa o ponto com as coordenadas fornecidas nos parâmetros.
   //
   public Ponto(double vX, double vY){
      x = vX;
      y = vY;
   }

   // Copy constructor (Construtor clone ou de cópia).
   // Inicializa o ponto com as coordenadas de outro ponto já existente.
   //
   public Ponto(Ponto pt){
      x = pt.x;
      y = pt.y;
   }

```

Agora é a vez dos getters e setters. Além dos regulamentares, o enunciado pede que seja implementado um setter extra (setXY) que permite modificar as duas coordenadas de uma vez. Também é pedido um tipo especial de setter, o método assign, que copia para o objeto o valor de todos os atributos do outro objeto informado no parâmetro.

```
   /////////////////////////////////////////////////////////////////
   /// Getters e Setters
   ///

   // Retorna o valor de x
   public double getX(){
      return x;
   }

   // Retorna o valor de y
   public double getY(){
      return y;
   }

   // Modifica o valor de x
   public void setX(double newX){
      x = newX;
   }

   // Modifica o valor de y
   public void setY(double newY){
      y = newY;
   }

   // Modifica o valor de x e y
   public void setXY(double newX, double newY){
      x = newX;
      y = newY;
   }

   // Copia os atributos de pt
   public void assign(Ponto pt){
      x = pt.x;
      y = pt.y;
   }

```

**Dica útil:** Voce pode gerar os getters e setters de qualquer atributo automaticamente com o Netbeans. Para isso, clique com o botão direito em qualquer linha dentro da classe, mas fora de qualquer método (por exemplo entre dois métodos), escolha a opção Inserir código e depois Getter e setter. O netbeans irá mostrar uma janela com todos os atributos da classe e então basta selecionar os atributos que o netbeans se encarrega de escrever o código básico dos getters e setters para eles.

A seguir são pedidos alguns métodos que fazem cálculos com os atributos, mas não os modificam:

```
   ///////////////////////////////////////////////////////////
   /// Cálculos

   // Retorna o delta x em relação a vX
   public double deltaX(double vX){
      return vX - x;
   }

   // Retorna o delta y em relação a vY
   public double deltaY(double vY){
      return vY - y;
   }

   // Retorna a distancia do ponto até as coordenadas informadas
   public double distance(double posX, double posY){
      double dx = deltaX(posX);
      double dy = deltaY(posY);
      return Math.sqrt(dx*dx + dy*dy);
   }

```

Por fim, são pedidos dois métodos que aplicam transformações ao ponto: deslocamento e escalonamento:

```
   ///////////////////////////////////////////////////////////
   /// Transformações

   // Multiplica X e Y por um fator de escalonamento.
   public void escale(double factor){
      x *= factor;
      y *= factor;
   }

   // Desloca o ponto.
   public void desloc(double dX, double dY){
      x += dX;
      y += dY;
   }

```

E com isso podemos fechar a classe:

```
} // classe Ponto

```

**Abaixo o código completo para a classe Ponto:**

```
public class Ponto {
   protected double x, y;  // coordenadas do ponto

   // Construtor padrão (não tem parâmetros).
   // Inicializa o ponto na origem do plano.
   //
   public Ponto(){
      x = 0;
      y = 0;
   }

   // Construtor parametrizado.
   // Inicializa o ponto com as coordenadas fornecidas nos parâmetros.
   //
   public Ponto(double vX, double vY){
      x = vX;
      y = vY;
   }

   // Copy constructor (Construtor clone ou de cópia).
   // Inicializa o ponto com as coordenadas de outro ponto já existente.
   //
   public Ponto(Ponto pt){
      x = pt.x;
      y = pt.y;
   }

   /////////////////////////////////////////////////////////////////
   /// Getters e Setters

   // Retorna o valor de x
   public double getX(){
      return x;
   }

   // Retorna o valor de y
   public double getY(){
      return y;
   }

   // Modifica o valor de x
   public void setX(double newX){
      x = newX;
   }

   // Modifica o valor de y
   public void setY(double newY){
      y = newY;
   }

   // Modifica o valor de x e y
   public void setXY(double newX, double newY){
      x = newX;
      y = newY;
   }

   // Copia os atributos de pt
   public void assign(Ponto pt){
      x = pt.x;
      y = pt.y;
   }

   ///////////////////////////////////////////////////////////
   /// Cálculos

   // Retorna o delta x em relação a vX
   public double deltaX(double vX){
      return vX - x;
   }

   // Retorna o delta y em relação a vY
   public double deltaY(double vY){
      return vY - y;
   }

   // Retorna a distancia do ponto até as coordenadas informadas
   public double distance(double posX, double posY){
      double dx = deltaX(posX);
      double dy = deltaY(posY);
      return Math.sqrt(dx*dx + dy*dy);
   }

   ///////////////////////////////////////////////////////////
   /// Transformações

   // Multiplica X e Y por um fator de escalonamento.
   public void escale(double factor){
      x *= factor;
      y *= factor;
   }

   // Desloca o ponto.
   public void desloc(double dX, double dY){
      x += dX;
      y += dY;
   }

} // classe Ponto

```