#include #include #include #define EPS 1e-10 #define eq(a, b) ( ((a) - EPS <= (b)) && ((b) <= (a) + EPS) ) #define MAXN 2020 #define PI 2*acos(0.0) using namespace std; typedef struct event { double angle; bool in; }; bool angleCmp(const event& a, const event& b) { if (eq(a.angle, b.angle)) { return a.in; } return (a.angle < b.angle); } int n, r; int x[MAXN]; int y[MAXN]; event events[MAXN * 4]; int sqDist(int a, int b) { return (x[a] - x[b])*(x[a] - x[b]) + (y[a] - y[b])*(y[a] - y[b]); } double dist(int a, int b) { return sqrt(sqDist(a, b)); } double tt(int a, int b) { double dy = y[b] - y[a]; double dx = x[b] - x[a]; return atan2(dy, dx); } double cc(int a, int b) { return acos(dist(a, b) / (double)(2*r)); } double angleIn(int a, int b) { return tt(a, b) - cc(a, b); } double angleOut(int a, int b) { return tt(a, b) + cc(a, b); } int main() { while (scanf("%d%d", &n, &r)) { if (n == 0 && r == 0) break; for (int i = 0; i < n; i++) { scanf("%d%d", &x[i], &y[i]); } double aIn; double aOut; int maxi = 0; for (int center = 0; center < n; center++) { int num = 0; for (int other = 0; other < n; other++) { if (other == center) continue; if (sqDist(center, other) > 4*r*r) continue; aIn = angleIn(center, other); aOut = angleOut(center, other); /* printf("miedzy %d a %d katy : tt = %lf cc = %lf\n", center, other, tt(center, other), cc(center, other)); printf("miedzy %d a %d katy : in = %lf out = %lf\n", center, other, aIn, aOut); */ events[num++] = (event) {aIn, true}; events[num++] = (event) {aOut, false}; events[num++] = (event) {aIn + 2*PI, true}; events[num++] = (event) {aOut + 2*PI, false}; } sort(events, events + num, angleCmp); int cnt = 0; for (int j = 0; j < num; j++) { if (events[j].in) { cnt++; } else { cnt--; } maxi = max(maxi, cnt); } } printf("It is possible to cover %d points.\n", maxi + 1); } return 0; }