2
public int visiblePoints(List<List<Integer>> points, int angle, List<Integer> location) {4
List<Double> list = new ArrayList<>(points.size());5
for (List<Integer> p : points) {6
if (p.get(0) == location.get(0) && p.get(1) == location.get(1)) {9
list.add(angle(p.get(1) - location.get(1), p.get(0) - location.get(0)));12
Collections.sort(list);16
// list.get(i1) is first angle leg17
// list.get(i2) is second angle leg18
for (int i1 = 0; i1 < n; i1++) {19
// let's grow i1-i2 angle as much as possible20
// edge case example: angle = 30, i1 = 350 degrees, i2 = 10 degrees21
// edge case handling: allow i2 to circle around and calculate second leg as (360 +23
// then i1 = 350, i2 = 370, delta = 20 degrees < 30 degrees24
while ((i2 < n && list.get(i2) - list.get(i1) <= angle)25
|| (i2 >= n && 360 + list.get(i2 % n) - list.get(i1) <= angle)) {28
// after i2 went as far as possible away from i1 under allowed limit - check if a new maximum30
max = Math.max(max, i2 - i1);35
private double angle(int dy, int dx) {36
double a = Math.toDegrees(Math.atan2(dy, dx));37
return (a < 0 ? a + 360 : a);