summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLuke Shumaker <shumakl@purdue.edu>2014-04-22 15:50:21 -0400
committerLuke Shumaker <shumakl@purdue.edu>2014-04-22 15:50:21 -0400
commit9d226fcd27b6c2470edf718ad36a262348891470 (patch)
treebb17fce921d0017b6e9111bd81edc194c07f61d3 /lib
parent136b86453000aa6ad3a099efb96d85232eb2eeb5 (diff)
re-factor for tournament_stage's and separate scheduling modules
Diffstat (limited to 'lib')
-rw-r--r--lib/scheduling/elimination.rb55
-rw-r--r--lib/scheduling/elimination.svg.erb72
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>