ケーキをなるべく均等に9等分したい

MikuHatsune2017-12-27

大掃除をしたあとクリスマスっぽい感じでケーキを食べようということになったのだが、9人いたのでケーキをどう切るか問題になった。
360度を40度ずつ切ればいいが、実際に40度でケーキを切るのは困難である。
単純に平行に切るのが楽でよい。
というわけで、水平x2 と平行x2 で、なるべく面積が均等になるように切る。
こんな感じ。

半径に対して原点からこれくらいの比率の位置で切ればいい感じに面積が均等になるが

s1[which.min(v)]
0.2611836

実際の面積は最大で4% (中心の正方形部分が小さい)の差がある。

area[c(1,2,6),which.min(v)]/(pi*r^2)
0.08685641 0.12051120 0.10777470
r <- 1
x <- seq(0, r, length=1000)
y <- sqrt(r^2-x^2)

s1 <- seq(0, r/sqrt(2), length=1000)
area <- mapply(function(s){
  a1 <- (2*s)^2
  a2 <- rep(2*sum((y-s)[x<s][-1]*diff(x[x<s])), 4)
  a3 <- rep((pi*r^2 - sum(a1, a2))/4, 4)
  return(c(a1, a2, a3))
}, s1)

# 面積の分散の最小
v <- apply(area[c(1,2,6)], 2, var)
ans <- s <- s1[which.min(v)]

pallet <- c("red", "blue", "green")

par(mar=c(5, 4, 2, 2), mfrow=c(3, 1), cex.axis=1.5)
plot(x, y, type="n")
polygon(c(0, s, s, 0), c(0, 0, s, s), col=pallet[1], border=NA)
polygon(c(0, s, rev(x[x<s])), c(s, s, rev(y[x<s])), col=pallet[2], border=NA)
polygon(c(s, rev(x[x>s&y<s]), s), c(0, rev(y[x>s&y<s]), s), col=pallet[2], border=NA)
polygon(c(x[x>s&y>s], s), c(y[x>s&y>s], s), col=pallet[3], border=NA)
lines(x, y, lwd=3)
abline(h=s, v=s, lty=3, lwd=3)

cols <- unlist(mapply(rep, pallet, c(1, 4, 4)))
matplot(s1/r, t(area)/(pi*r^2), type="l", col=cols, lty=1, xlab="半径比", ylab="面積", lwd=3, xlim=c(0, r))
abline(v=ans, lty=3, lwd=3)
plot(s1/r, v, type="l", xlab="半径比", ylab="分散", lwd=3, xlim=c(0, r))
abline(v=ans, lty=3, lwd=3)