diff --git a/app/helpers/gauge_helper.rb b/app/helpers/gauge_helper.rb new file mode 100644 index 00000000..0a9c2864 --- /dev/null +++ b/app/helpers/gauge_helper.rb @@ -0,0 +1,97 @@ +Point = Struct.new(:x, :y) +Rect = Struct.new(:x, :y, :width, :height) + +module GaugeHelper + def outer_radius + 100 + end + + def inner_radius + 50 + end + + def stroke_width + 1 + end + + def key_benchmark_indicator_gutter + 10 + end + + def viewbox + x = -(outer_radius + stroke_width) + y = -(outer_radius + key_benchmark_indicator_gutter + stroke_width) + width = 2*outer_radius + 2*stroke_width + height = outer_radius + key_benchmark_indicator_gutter + 2*stroke_width + Rect.new(x, y, width, height) + end + + def arc_center + Point.new(0, 0) + end + + def indicator_tip + Point.new(arc_center.x, arc_center.y - outer_radius - 2) + end + + def indicator_right_corner + Point.new(key_benchmark_indicator_gutter/Math.sqrt(3), arc_center.y - outer_radius - key_benchmark_indicator_gutter) + end + + def indicator_left_corner + Point.new(-key_benchmark_indicator_gutter/Math.sqrt(3), arc_center.y - outer_radius - key_benchmark_indicator_gutter) + end + + def arc_radius(radius) + "#{radius} #{radius}" + end + + def angle_for(percentage:) + -Math::PI * (1 - percentage) + end + + def arc_end_point_for(radius:, percentage:) + angle = angle_for(percentage: percentage) + + x = arc_center.x + radius * Math.cos(angle) + y = arc_center.y + radius * Math.sin(angle) + Point.new(x, y) + end + + def arc_end_line_destination(radius:, percentage:) + x = arc_center.x + radius * Math.cos(angle_for(percentage: percentage)) + y = arc_center.y + radius * Math.sin(angle_for(percentage: percentage)) + Point.new(x, y) + end + + def arc_start_point + Point.new(arc_center.x - outer_radius, arc_center.y) + end + + def move_to(point:) + "M #{coordinates_for(point)}" + end + + def draw_arc(radius:, percentage:, clockwise:) + sweep_flag = clockwise ? 1 : 0 + "A #{arc_radius(radius)} 0 0 #{sweep_flag} #{coordinates_for(arc_end_point_for(radius: radius, percentage: percentage))}" + end + + def draw_line_to(point:) + "L #{coordinates_for(point)}" + end + + def benchmark_line_point(radius, angle) + x = "#{radius * Math.cos(angle)}" + y = "#{radius * Math.sin(angle) + arc_center.y}" + Point.new(x, y) + end + + def rotation_angle_for(percentage:) + 180.0 * percentage - 90 + end + + def coordinates_for(point) + "#{point.x} #{point.y}" + end +end diff --git a/app/views/browse/_gauge_graph.html.erb b/app/views/browse/_gauge_graph.html.erb index 06f54c6c..47b2812c 100644 --- a/app/views/browse/_gauge_graph.html.erb +++ b/app/views/browse/_gauge_graph.html.erb @@ -1,29 +1,23 @@ -<% outer_radius = 100 %> -<% inner_radius = 50 %> -<% stroke_width = 1 %> -<% key_benchmark_indicator_height = 10 %> -<% scale = -Math::PI %> - @@ -32,29 +26,31 @@