Пример #1
0
int main()
{
  if (nge(INT_MIN, INT_MAX) !=  0) abort();
  if (nge(INT_MAX, INT_MIN) != -1) abort();
  if (ngt(INT_MIN, INT_MAX) !=  0) abort();
  if (ngt(INT_MAX, INT_MIN) != -1) abort();
  if (nle(INT_MIN, INT_MAX) != -1) abort();
  if (nle(INT_MAX, INT_MIN) !=  0) abort();
  if (nlt(INT_MIN, INT_MAX) != -1) abort();
  if (nlt(INT_MAX, INT_MIN) !=  0) abort();

  if (neq(INT_MIN, INT_MAX) !=  0) abort();
  if (neq(INT_MAX, INT_MIN) !=  0) abort();
  if (nne(INT_MIN, INT_MAX) != -1) abort();
  if (nne(INT_MAX, INT_MIN) != -1) abort();

  if (ngeu(0, ~0U) !=  0) abort();
  if (ngeu(~0U, 0) != -1) abort();
  if (ngtu(0, ~0U) !=  0) abort();
  if (ngtu(~0U, 0) != -1) abort();
  if (nleu(0, ~0U) != -1) abort();
  if (nleu(~0U, 0) !=  0) abort();
  if (nltu(0, ~0U) != -1) abort();
  if (nltu(~0U, 0) !=  0) abort();
  
  exit(0);
}
 // check if point p is within the polygon.
 // 0 when p is on the outside
 // 1 when p is on the inside
 // 2 when p is on the edge
 int is_in(const point& p){
     int num = 0;
     _vertices[_num_vertices] = _vertices[0];
     for(int i=0; i<_num_vertices; ++i){
         if(is_point_on_segment(p, _vertices[i], _vertices[i+1]))
             return 2;
         double k = cross_product(p, _vertices[i+1], _vertices[i]);
         if(gt(k, 0)
            && ngt(_vertices[i].y - p.y, 0)
            && gt(_vertices[i+1].y - p.y, 0)) ++num;
         if(lt(k, 0)
            && gt(_vertices[i].y - p.y, 0)
            && ngt(_vertices[i+1].y - p.y, 0)) --num;
     }
     return num != 0;
 }
// check if point p is on line segment (u, v)
bool is_point_on_segment(const point& p, const point& u, const point& v){
    return eq(0, cross_product(u, v, p)) && ngt(dot_product(u, v, p), 0);
}