แหวนหกเหลี่ยมที่มีรัศมีของ N ประกอบด้วยเส้นตรง 6 เส้นแต่ละเส้นมีความยาว N - ดูตัวอย่างที่หยาบมากของฉันด้านล่าง :) สำหรับ N = 2:
ลูกศรครอบคลุม 2 hexes แต่ละอัน
ฉันคิดว่าคุณมีฟังก์ชั่นบางอย่างที่ให้ไทล์เพื่อนบ้านในทิศทางที่เฉพาะเจาะจงเช่นทิศเหนือ (), ตะวันออกเฉียงใต้ () ฯลฯ ดังนั้นอัลกอริธึมของคุณใน pseudocode ควรเป็นดังนี้:
var point = startingPoint.north(N)
for i = 0..N-1:
result.add(point)
point = point.southeast(1);
for i = 0..N-1:
result.add(point)
point = point.south(1);
for i = 0..N-1:
result.add(point)
point = point.southwest(1);
for i = 0..N-1:
result.add(point)
point = point.northwest(1);
for i = 0..N-1:
result.add(point)
point = point.north(1);
for i = 0..N-1:
result.add(point)
point = point.northeast(1);
โปรดทราบว่าการดำเนินการนี้ควรใช้กับกรณีขอบด้วย N = 1, ส่งคืนไพ่ 6 ใบและ N = 0 ส่งคืนชุดว่าง
ฉันรู้ว่ารหัสนั้นไม่สมบูรณ์ :) มีความซ้ำซ้อนอยู่ที่นี่ ในโครงการของฉันที่ใช้แผนที่เรียงต่อเนื่องเป็นประจำ (หกเหลี่ยมหรืออื่น ๆ ) ฉันมักจะมี "ทิศทาง" Enum ซึ่งช่วยให้ฉันทำสิ่งนี้ได้อย่างราบรื่นมากขึ้น:
var point = startingPoint.inDir(N, Direction.North)
var dir = Direction.SouthEast.
for d = 0..Direction.count():
for i = 0..N-1:
result.add(point)
point = point.inDir(1, dir);
dir = nextDirection(dir);