public IEnumerable <HexCoords> CompoundArc(uint minRadius, uint maxRadius, HexFacing begin, HexFacing end) { for (uint radius = minRadius; radius <= maxRadius; radius++) { foreach (HexCoords loc in Arc(radius, begin, end)) { yield return(loc); } } }
public static HexFacing Apply(this HexFacing facing, HexRotation rot) { if (facing == HexFacing.bad) { return(HexFacing.bad); } else { return((HexFacing)NumUtil.WrapPos((int)facing - rot.CWcount, 6)); } }
public static IEnumerable <HexFacing> CompassTurnCCW(this HexFacing facing, HexFacing final) { HexFacing current = facing; while (current != final) { yield return(current); current = current.Apply(HexRotation.CCW); } yield return(final); }
public static HexCoords ToOffset(this HexFacing facing) { switch (facing) { case HexFacing.xy: return(HexCoords.XY); case HexFacing.xz: return(HexCoords.XZ); case HexFacing.yz: return(HexCoords.YZ); case HexFacing.yx: return(HexCoords.YX); case HexFacing.zx: return(HexCoords.ZX); case HexFacing.zy: return(HexCoords.ZY); default: return(HexCoords.O); } }
public IEnumerable <HexCoords> Arc(uint radius, HexFacing begin, HexFacing end) { HexCoords cursor = this + (begin.ToOffset() * (int)radius); // Yielding the initial cursor position is unique to arcs, // and is why this code works at radius 0 while rings do not. yield return(cursor); // We need to track our travel facing. // When following a circle, we start at the southwest corner heading north. // Southwest to north is rotating CW twice. // Any corner you start at, your travel on that side will be CW twice. HexRotation turnIntoSide = new HexRotation(2); foreach (HexFacing facing in begin.Rotate(2).CompassTurnCW(end.Rotate(1))) { for (int idx = 0; idx < radius; idx++) { cursor += facing; yield return(cursor); } } }
public static IEnumerable <HexFacing> CompassTurnCW(this HexFacing facing) { return(facing.CompassTurnCW(HexRotation.CCW)); }
public static IEnumerable <HexFacing> CompassTurnCW(this HexFacing facing, HexRotation rot) { return(facing.CompassTurnCW(facing.Apply(rot))); }
public static HexFacing Rotate(this HexFacing facing, int CWcount) { return(facing.Apply(new HexRotation(CWcount))); }