// $Source: /local/data/cvs/yellowbank/tile/qedge.h,v $
// $Revision: 1.3 $
// $State: Exp $
// $Date: 2004/07/19 03:54:07 $
// $Author: yrp001 $
// $Locker:  $

// Edge: segment, ray, line

#if !defined(_QEDGE_H_)
#define _QEDGE_H_

#include <iostream>
#include <math.h>
#include "qpoint.h"
#include "qangle.h"

class qedge {
 public:
  // constructor(s) and destructor
  qedge();
  qedge( const qpoint& a, const qpoint& b );
  
  // create edge one unit in length
  qedge( const qpoint& point, double angle );

  //  enum side_t { left = -1, on = 0, right = 1 };

  // i = 0: colinear.  i = 1 parallel.  i = 2 intersect.
  // r > 1: p is on extension of p1p2
  // r < 0: p is on extension of p2p1
  // s > 1: p is on extension of other.p1p2
  // s < 0: p is on extension of other.p2p1
  // 0 <= r <= 1 & 0 <= s <= 1: intersection on both segments
  //
  qpoint intersect( const qedge& other, int* i, double* r, double* s ) const;

  // -1: left of p1p2, 0: on p1p2, 1: right of p1p2
  int side( const qpoint& pt ) const;
  qpoint apoint() const { return _p1; };
  qangle angle() const;
  float anglef() const;

  // return r
  // r=0: p = a
  // r=1: p = b
  // r<0: p is on backward extension of ab
  // r>0: p is on forward extension of ab
  // 0<r<1: p is interior to ab
  //
  float projection( const qpoint& point, qpoint* ppoint ) const;
  
  // return negative value if left of p1p2
  // return positive value if right of p1p2
  float distance( const qpoint& point ) const;

  friend std::ostream& operator<<( std::ostream& os, qedge& e );
  friend std::istream& operator>>( std::istream& is, qedge& e );

 private:
  qpoint _p1, _p2;
  qangle _angle;
};

#endif

