static public List <HexCell> HexLinedraw(HexCell a, HexCell b) { int N = HexCell.Distance(a, b); FractionalHex a_nudge = new FractionalHex(a.q + 0.000001, a.r + 0.000001, a.s - 0.000002); FractionalHex b_nudge = new FractionalHex(b.q + 0.000001, b.r + 0.000001, b.s - 0.000002); List <HexCell> results = new List <HexCell> { }; double step = 1.0 / Math.Max(N, 1); for (int i = 0; i <= N; i++) { results.Add(FractionalHex.HexRound(FractionalHex.HexLerp(a_nudge, b_nudge, step * i))); } return(results); }
static public HexCell HexRound(FractionalHex h) { int q = (int)(Math.Round(h.q)); int r = (int)(Math.Round(h.r)); int s = (int)(Math.Round(h.s)); double q_diff = Math.Abs(q - h.q); double r_diff = Math.Abs(r - h.r); double s_diff = Math.Abs(s - h.s); if (q_diff > r_diff && q_diff > s_diff) { q = -r - s; } else if (r_diff > s_diff) { r = -q - s; } else { s = -q - r; } return(new HexCell(q, r, s)); }
static public FractionalHex HexLerp(FractionalHex a, FractionalHex b, double t) { return(new FractionalHex(a.q * (1 - t) + b.q * t, a.r * (1 - t) + b.r * t, a.s * (1 - t) + b.s * t)); }