diff options
Diffstat (limited to 'lib/scheduling')
-rw-r--r-- | lib/scheduling/elimination.rb | 55 | ||||
-rw-r--r-- | lib/scheduling/elimination.svg.erb | 72 |
2 files changed, 127 insertions, 0 deletions
diff --git a/lib/scheduling/elimination.rb b/lib/scheduling/elimination.rb new file mode 100644 index 0000000..519d08a --- /dev/null +++ b/lib/scheduling/elimination.rb @@ -0,0 +1,55 @@ +module Scheduling + class Elimination + + def initialize(tournament_stage) + @tournament_stage = tournament_stage + end + + def tournament_stage + @tournament_stage + end + def tournament + self.tournament_stage.tournament + end + + def create_matches + num_teams = (self.tournament.players.count/self.tournament.min_players_per_team).floor + num_matches = num_teams - 1 + for i in 1..num_matches + self.tournament_stage.matches.create(status: 0, submitted_peer_evaluations: 0) + end + match_num = num_matches-1 + team_num = 0 + # for each grouping of min_players_per_team + self.tournament.players.each_slice(min_players_per_team) do |team_members| + # if the match is full, move to the next match, otherwise move to the next team + if (team_num == min_teams_per_match) + match_num -= 1 + team_num = 0 + else + team_num += 1 + end + # create a new team in the current match + self.tournament_stage.matches[match_num].teams.push(Team.create(users: team_members)) + end + end + + def match_finished(match) + matches = match.tournament_stage.matches_ordered + cur_match_num = matches.invert[match] + unless cur_match_num == 1 + match.winner.matches.push(matches[cur_match_num/2]) + end + end + + def graph + require 'erb' + erb_filename = File.join(File.dirname(__FILE__), 'elimination.svg.erb') + + erb = ERB.new(File.read(erb_filename)) + erb.filename = erb_filename + return erb.result + end + + end +end diff --git a/lib/scheduling/elimination.svg.erb b/lib/scheduling/elimination.svg.erb new file mode 100644 index 0000000..91b8f6a --- /dev/null +++ b/lib/scheduling/elimination.svg.erb @@ -0,0 +1,72 @@ +<% + +matches = @tournament_stage.matches_ordered +# depth of SVG tree +depth = Math.log2(matches.count).floor+1; +# height of SVG +height = 200 * 2**Math.log2(matches.count).floor + 100; +lastrx = 0 +lastry = 0 +lastrh = 0 +lastrw = 0 + +%><svg version="1.1" baseProfile="full" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + width="100%" height="<%= height = [height, 500].max %>"> + <% %> + <defs> + <radialGradient id="gradMatch" cx="50%" cy="50%" r="80%" fx="80%" fy="80%"> + <stop offset="0%" style="stop-color:#ffd281; stop-opacity:0" /> + <stop offset="100%" style="stop-color:#ccc;stop-opacity:1" /> + </radialGradient> + </defs> + <% (1..matches.count).each do |i| %> + <a id="svg-match-<%= i %>" xlink:href="<%= match_path(matches[i-1]) %>"> + <rect height="<%= rh = 100/(2**(depth-1)+1) - 5 %>%" + width="<%= rw = 100/(depth+1) - 5 %>%" + x="<%= rx = 50/(depth+1) + 100/(depth+1)*(depth-(Math.log2(i).floor+1)) %>%" + y="<%= ry = ( 100/(2**(Math.log2(i).floor)+1) + rh * 1.1 * (2**Math.log2(i).ceil-i)) %>%" + fill="url(#gradMatch)" + rx="5px" + stroke-width="2" + <% case matches[i-1].status %> + <% when 0 %> + <% if matches[i-1].teams.count < @tournament_stage.tournament.min_teams_per_match %> + stroke="red" + fill-opacity="0.6" + <% else %> + stroke="green" + <% end %> + <% when 1 %> + stroke="orange" + <% when 2 %> + stroke="yellow" + <% when 3 %> + stroke="grey" + <% end %> /> + <rect width="<%= rw-5 %>%" height="<%= rh/4 %>%" x="<%= rx + 2.5 %>%" y="<%= ry + rh/6 %>%" fill="<%= matches[i-1].teams.first and matches[i-1].teams.first.users.include?(current_user) ? "#BCED91" : "white" %>" /> + <text x="<%= rx + rw/4 %>%" y="<%= ry + rh/3 %>%" font-size="<%= rh %>"> + <% if matches[i-1].teams.first %> + Team <%= matches[i-1].teams.first.id %> + <% end %> + </text> + <text x="<%= rx + 1.3*rw/3 %>%" y="<%= ry + 5.2*rh/9 %>%" font-size="<%= rh %>"> VS </text> + <rect width="<%= rw-5 %>%" height="<%= rh/4 %>%" x="<%= rx + 2.5 %>%" y="<%= ry + 3*rh/5 %>%" fill="<%= matches[i-1].teams[1] and matches[i-1].teams[1].users.include?(current_user) ? "#BCED91" : "white" %>" /> + <text x="<%= rx + rw/4 %>%" y="<%= ry + 4*rh/5 %>%" font-size="<%= rh %>"> + <% if matches[i-1].teams[1] %> + Team <%= matches[i-1].teams[1].id %> + <% end %> + </text> + <% if i > 1 %> + <line x1="<%= rx+rw %>%" y1="<%= ry+rh/2 %>%" x2="<%= lastrx %>%" y2="<%= lastry+lastrh/2 %>%" stroke="black" stroke-width="2" > + <% end %> + <% if Math.log2(i+1) == Math.log2(i+1).ceil %> + <% lastrx = rx + lastry = ry + lastrh = rh + lastrw = rw %> + <% end %> + </a> + <% end %> +</svg> |