// **********************************************************
// File: Triangle.h
// Description: Definition of class Triangle
//
// Author: Carlos Moreno
// **********************************************************
#ifndef __TRIANGLE_H__
#define __TRIANGLE_H__
#include "Point.h"
const int left_turn = +1;
const int right_turn = -1;
const int collinear = 0;
const int counter_clockwise = left_turn;
const int clockwise = right_turn;
class Triangle
{
public:
//Constructor
explicit Triangle (const Point & p1 = origin,
const Point & p2 = origin,
const Point & p3 = origin)
: v1 (p1), v2 (p2), v3 (p3) {}
// Geometric and miscelaneous operations
void draw () const;
bool contains (const Point &) const;
double area () const;
int orientation () const;
// Comparison operators
bool operator== (const Triangle & t) const;
bool operator!= (const Triangle & t) const;
bool operator> (const Triangle &) const;
bool operator< (const Triangle &) const;
private:
Point v1, v2, v3;
double signed_area () const;
};
inline int turn (const Point & p1, const Point & p2,
const Point & p3)
{
return Triangle(p1,p2,p3).orientation();
}
#endif
// **********************************************************
// File: Triangle.cpp
// Description: Implementation of class Triangle
//
// Author: Carlos Moreno
// **********************************************************
#include "Triangle.h"
#include "Segment.h"
#include <math.h>
double Triangle::signed_area () const
{
return (v1.get_x() * (v2.get_y() - v3.get_y()) +
v2.get_x() * (v3.get_y() - v1.get_y()) +
v3.get_x() * (v1.get_y() - v2.get_y()));
}
bool Triangle::contains (const Point & p) const
{
return turn (v1,v2,p) == turn (v2,v3,p) &&
turn (v2,v3,p) == turn (v3,v1,p);
}
void Triangle::draw () const
{
Segment (v1,v2).draw();
Segment (v2,v3).draw();
Segment (v1,v3).draw();
}
double Triangle::area () const
{
return fabs (signed_area());
}
int Triangle::orientation () const
{
double s_a = signed_area();
return s_a > 0 ? 1 : (s_a < 0 ? -1 : 0);
}
bool Triangle::operator== (const Triangle & t) const
{
return v1 == t.v1 && v2 == t.v2 && v3 == t.v3;
}
bool Triangle::operator!= (const Triangle & t) const
{
return !(*this == t);
}
//End of File