real r = 5cm; draw(circle(0,r), black+1); dot(0); path hyperline(pair origin, real r, real deg1, real deg2, bool iscycle=false) { deg1 %= 360; deg2 %= 360; bool isCCW; if (abs(deg1-deg2) == 180) { if (iscycle) return shift(origin) * (arc(0, r*dir(deg1), r*dir(deg2)) -- cycle); else return shift(origin) * (r*dir(deg1) -- r*dir(deg2)); } if (deg1 > deg2) { if (deg1-deg2 > 180) { deg1 -= 360; isCCW = true; } else isCCW = false; } else { if (deg2-deg1 > 180) { deg2 -= 360; isCCW = false; } else isCCW = true; } real delta = isCCW ? deg2-deg1 : deg1-deg2; pair z1 = r * dir(deg1), z2 = r * dir(deg2); real rad = r/Cos(delta/2); pair c = rad * dir((deg1+deg2)/2); if (iscycle) return shift(origin) * (arc(c, z1, z2, !isCCW) & arc(0, z2, z1, !isCCW)) -- cycle; else return shift(origin) * arc(c, z1, z2, !isCCW); } path[] g1, g2; for (real t = 30; t <= 180; t += 30) { for (real angle = 0; angle < 360; angle += 30) { g1.push(hyperline(0, r, angle, angle+t, true)); g2.push(hyperline(0, r, angle, angle+t, false)); } } fill(g1, evenodd); draw(g2, orange+0.6); shipout(bbox(Fill(white)));