summaryrefslogtreecommitdiff
path: root/spec/visible_points_spec.rb
diff options
context:
space:
mode:
authormo <mokha@cisco.com>2017-05-23 18:23:49 -0600
committermo <mokha@cisco.com>2017-05-23 18:23:49 -0600
commit52dcbc8060a1ed14c9cb94de988443f00356d42f (patch)
tree4ea9a6538278e34f0876250f3f549255ed274626 /spec/visible_points_spec.rb
parent617731b09aa95b8bbb1254c6ae75f93829bfe903 (diff)
remove other solutions.
Diffstat (limited to 'spec/visible_points_spec.rb')
-rw-r--r--spec/visible_points_spec.rb65
1 files changed, 6 insertions, 59 deletions
diff --git a/spec/visible_points_spec.rb b/spec/visible_points_spec.rb
index b2b4917..6c38807 100644
--- a/spec/visible_points_spec.rb
+++ b/spec/visible_points_spec.rb
@@ -68,13 +68,6 @@ Math.atan(35.0/65.0) * (180 / Math::PI)
DOC
describe "visible points" do
- def visible?(points, top:, bottom:)
- points.find_all do |(x, y)|
- angle = angle_for(x, y)
- angle <= top && angle >= bottom
- end.count
- end
-
def radians_to_degrees(radians)
radians * (180 / Math::PI)
end
@@ -108,68 +101,22 @@ describe "visible points" do
raise [x, y].inspect
end
- def viewing_angle_for(x, y)
- lower_angle = angle_for(x, y)
- [ lower_angle, lower_angle + 45 ]
- end
-
- def viewing_angles_for(points)
- angles = [ ]
- points.each do |(x, y)|
- next if x == 0 && y == 0
- angle = viewing_angle_for(x, y)
- next if angles.include?(angle)
- angles.push(angle)
- end
- angles
- end
-
- def visible_points(points)
- max = 0
- angles = viewing_angles_for(points).sort
- angles.each do |viewing_angle|
- count = visible?(points, top: viewing_angle[1], bottom: viewing_angle[0])
- max = count if count > max
- end
- max
- end
-
- def visible_points(points)
- angles = points.map { |(x,y)| angle_for(x, y).floor }.sort
- size = angles.count
- max = 0
- angles.each_with_index do |min_angle, index|
- count = 1
- max_angle = min_angle + 45
- max_angle = max_angle - 360 if max_angle > 360
-
- (index+1).upto(size-1) do |i|
- current = angles[i]
- break if current > max_angle
-
- count += 1 if current >= min_angle && current <= max_angle
- end
- max = count if count > max
- end
- max
- end
-
def visible_points(points, viewing_angle: 45)
# n + nlogn
angles = points.map { |(x, y)| angle_for(x, y) }.sort
- counter = max = i = j = 0
+ counter = max = head = tail = 0
- until i >= angles.size
- current = angles[i]
+ until head >= angles.size
+ current = angles[head]
max_angle = current + viewing_angle
max_angle = max_angle - 360 if max_angle > 360
- until j >= angles.size || angles[j] > max_angle
- j += 1
+ until tail >= angles.size || angles[tail] > max_angle
+ tail += 1
counter += 1
end
max = counter if counter > max
- i += 1
+ head += 1
counter -= 1 if counter > 0
end
max