/*--------------------------------------------------------------------
 * FICHERO:  ZonLinea.c
 * OBJETIVO: Definir la funcin Zon_Linea()
 * AUTOR:    Pedro Reina
 * FECHA:    J.13.7.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Ficheros de cabecera
 *------------------------------------------------------------------*/

#include "Zona.h"

/*--------------------------------------------------------------------
 * Definicin de funciones
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Zon_Linea()
 * OBJETIVO: Dibujar una lnea de un color
 * ENTRADAS: Una zona, las coordenadas de los extremos y 
 *           el color
 * SALIDAS:  La zona
 * EJEMPLO:  Zon_Linea ( Imagen, 20.4, 15.8, 59.0, 12.7, ROJO )
 * NOTA:     El algoritmo usado es lento, hay que mejorarlo.
 *           (El "clipping" hay que hacerlo antes de dibujar 
 *           la lnea, no cuando se dibuja cada punto)
 *------------------------------------------------------------------*/
zona Zon_Linea (Zona, X1, Y1, X2, Y2, Color)
zona   Zona;
real   X1, Y1, X2, Y2;
octeto Color;
  {
  contador Xf1, Xf2, Yf1, Yf2;
  contador DistanciaX, DistanciaY, DistXabs, DistYabs, i, 
           PuntoX, PuntoY, SignoDistX, SignoDistY, x, y;
                 
  Xf1 = Zon_Abscisa (Zona, X1);
  Xf2 = Zon_Abscisa (Zona, X2);
  Yf1 = Zon_Ordenada (Zona, Y1);
  Yf2 = Zon_Ordenada (Zona, Y2);
  DistanciaX = Xf2 - Xf1;
  DistanciaY = Yf2 - Yf1;
  SignoDistX = Signo (DistanciaX);
  SignoDistY = Signo (DistanciaY);
  DistXabs = Abs (DistanciaX);
  DistYabs = Abs (DistanciaY);
  x = 0;
  y = 0;
  PuntoX = Xf1;
  PuntoY = Yf1;
  
  if (DistXabs >= DistYabs)
    {
    for ( i=0 ; i<DistXabs ; i++ )
      {
      y += DistYabs;
      if ( y >= DistXabs)
        {
        y -= DistXabs;
        PuntoY += SignoDistY;
        }
      PuntoX += SignoDistX;
      Zon_Pixel (Zona, PuntoX, PuntoY, Color);
      }
    }	
  else
    {
    for ( i=0 ; i<DistYabs ; i++ )
      {
      x += DistXabs;
      if ( x >= DistYabs)
        {
        x -= DistYabs;
        PuntoX += SignoDistX;
        }
      PuntoY += SignoDistY;
      Zon_Pixel (Zona, PuntoX, PuntoY, Color);
      }                 
    }
    
  return ( Zona );
  }