Outer 4-Cie brim plus 2-Cie inner crown along each cardinal edge of the 24-Cie octagon:
| ID | Name | 6 Cies (keep24) |
|---|---|---|
TH-N | North TopHat | ca, cb, cc, cd, db, dc |
TH-S | South TopHat | de, df, dg, dh, ce, cf |
TH-W | West TopHat | da, dj, dk, dl, ch, cj |
TH-E | East TopHat | dd, di,ch_e,ck, cl, dg |
3×3 corner pockets minus the 3 missing outer corner cells (aa,ab,ba, etc.) yielding 6 Cies per corner:
| ID | Name | 6 Cies (keep24) |
|---|---|---|
CR-NW | NW Corner | ca, cb, da, db, ch, bb |
CR-NE | NE Corner | cc, cd, dc, dd, ci, bc |
CR-SW | SW Corner | dk, dl, cj, ck, de, df |
CR-SE | SE Corner | cl, dm, cg, dh, dg, bd |
Four disjoint 6-Cie diagonal ribbons slicing across the tilted 24-Cie board (24 Cies total):
| ID | Name | 6 Cies (keep24) |
|---|---|---|
DG-1 | NW-Long Diagonal | ca, db, bb, bc, cl, dg |
DG-2 | SE-Counter Diagonal | cb, dc, ci, bd, cg, dh |
DG-3 | NE-Long Diagonal | cd, dc_w, ch, cj, cf, de |
DG-4 | SW-Counter Diagonal | da, dj, dk, ce, df, dm |
4 Standard 6-Cie X regions plus the legendary Heavy X comprised of all 4 Diagonals (24 Cies, 4× each numeral 1–6):
| ID | Name | Structure |
|---|---|---|
X-CORE | Center Core X | Inner bb,bc,bd,ce + wing tips (+8 pts) |
X-NORTH | North Crown X | Upper crossing 6-Cie X (+8 pts) |
X-SOUTH | South Anchor X | Lower crossing 6-Cie X (+8 pts) |
X-WING | West-East Wing X | Lateral crossing 6-Cie X (+8 pts) |
X-HEAVY | HEAVY X (4 Diagonals) | Union of DG-1 ∪ DG-2 ∪ DG-3 ∪ DG-4 (+24 pts) |
Cie24Board.swift)
Ported from angle_qx.swift and Cie_qx.swift in Twisted23: each Cie computes its radius r = hypot(dx, dy) and polar angle θ = atan2(dy, dx) + tiltRadians around the stage center while counter-rotating its inner numeral label so digits 1..6 always stand upright.
public static func polarShiftedCenter(
forIndex index: Int,
canvasWidth: CGFloat,
tilt: TiltAngleMode
) -> CGPoint {
let center = canvasWidth * 0.5
let step = canvasWidth / 6.6
let (row, col) = gridRowCol(forIndex: index)
let dx = (CGFloat(col) - 2.5) * step
let dy = (CGFloat(row) - 2.5) * step
let radius = hypot(dx, dy)
let baseAngle = atan2(dy, dx)
let shiftedAngle = baseAngle + tilt.radians
return CGPoint(
x: center + radius * cos(shiftedAngle),
y: center + radius * sin(shiftedAngle)
)
}