bool smaller_angle(const point<2>& first_point, const point<2>& p1, const point<2>& p2) { if (collinear(first_point, p1, p2)) return (first_point.square_distance(p1) > first_point.square_distance(p2)); return (!ccw(first_point, p1, p2)); }
void polygon::remove_points_with_same_angle(const point<2>& first_point) { // asumes points are in leftlower order. int oldn = _n; // num of points before deletion int hole = 1; // index marked for potential deletion for (int i = 2; i < oldn; i++) { if ( collinear(first_point, vec_points[hole], vec_points[i]) ) { // leave the farthest point if (first_point.square_distance(vec_points[hole]) < first_point.square_distance(vec_points[i])) vec_points[hole] = vec_points[i]; _n--; } else { hole++; if (hole != i) vec_points[hole] = vec_points[i]; } } }
bool operator()(const point<2>& p1, const point<2>& p2) { if (collinear(_reference, p1, p2)) return (_reference.square_distance(p1) > _reference.square_distance(p2)); return (ccw(_reference, p1, p2)); }