Questions
Fragment of a discussion from User talk:Wompi
Jump to navigation
Jump to search
I also thought there might be some issues at certain angles with the single loop approach.
I think you need to take a <math>n^2</math> approach, ie, a loop within a loop. Otherwise you need to use a sorting technique (with nlogn), then a single loop. Here is pseudocode:
initialise min_sum = Inf For each bot, b: me_b = find the angle from me to b initialise min_rel = Inf, max_rel = -Inf. for each bot c, excluding b: me_c = find the angle from me to c rel = the relative angle between me_b and me_c if rel < min_rel, min_rel = rel. if rel > max_rel, max_rel = rel. sum = max_rel - min_rel if sum < min_sum, min_sum = sum, min_ang = me_b + min_rel, max_ang = me_b + max_rel.
The other approach would be to sort all the angles into radial order, then go through looking for the largest space between two angles, and then use the opposite part of the circle. So in pseudocode:
for each bot, b: me_b = angle from me to b angles[i++] = me_b sort_ascending(angles) max_rel = abs(relative_angle(angles[0] - angles[angles.length - 1])) min_angle = angles[0] max_angle = angles[angles.length-1] max_index = 0 for(i = 1; i < angles.length; i++) rel = abs(relative_angles(angles[i-1] - angles[i])); if rel > max_rel max_rel = rel min_angle = angles[i] max_angle = angles[i-1] max_index = i