You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sqm-dashboards/app/helpers/gauge_helper.rb

98 lines
2.3 KiB

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 = arc_center.x - (outer_radius + stroke_width)
y = arc_center.y - (outer_radius + stroke_width) - key_benchmark_indicator_gutter
width = 2*(outer_radius + stroke_width)
height = outer_radius + 2*stroke_width + key_benchmark_indicator_gutter
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