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); }