1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class Point { double x, y;
Point(double x, double y) { this.x = x; this.y = y; } }
private final double eps = 1e-8;
public int numPoints(int[][] points, int r) { Point[] pointsArr = new Point[101]; for (int i = 0; i < points.length; i++) { pointsArr[i] = new Point(points[i][0], points[i][1]); } int ans = 1; for (int i = 0; i < points.length; i++) { for (int j = i + 1; j < points.length; j++) { if (dist(pointsArr[i], pointsArr[j]) > 2.0 * r) { continue; } Point center = getCircle(pointsArr[i], pointsArr[j], r); int count = 0; for (int k = 0; k < points.length; k++) { if (dist(center, pointsArr[k]) < 1.0 * r + eps) { count++; } } ans = Math.max(ans, count); } } return ans; }
private double dist(Point p1, Point p2) { return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); }
private Point getCircle(Point p1, Point p2, int r) { Point mid = new Point((p1.x + p2.x) / 2, (p1.y + p2.y) / 2); double angle = Math.atan2(p1.x - p2.x, p2.y - p1.y); double d = Math.sqrt(r * r - Math.pow(dist(p1, mid), 2)); return new Point(mid.x + d * Math.cos(angle), mid.y + d * Math.sin(angle)); }
|