โครงสร้างหกเหลี่ยมปกติ - วิธีการวาดรูปหกเหลี่ยม วิธีการสร้างรูปหกเหลี่ยมปกติ วิธีการวาดรูปหกเหลี่ยมด้วยดินสอ

มีดินสออยู่ใกล้คุณไหม? ดูหน้าตัดของมัน - เป็นรูปหกเหลี่ยมปกติหรือที่เรียกกันว่ารูปหกเหลี่ยม ภาพตัดขวางของถั่ว สนามหมากรุกหกเหลี่ยม โมเลกุลคาร์บอนที่ซับซ้อนบางชนิด (เช่น กราไฟท์) เกล็ดหิมะ รวงผึ้ง และวัตถุอื่นๆ ก็มีรูปร่างเช่นนี้เช่นกัน เมื่อเร็วๆ นี้ มีการค้นพบรูปหกเหลี่ยมปกติขนาดยักษ์ใน ดูเหมือนแปลกไหมที่ธรรมชาติมักใช้โครงสร้างที่มีรูปร่างเฉพาะนี้ในการสร้างสรรค์ มาดูกันดีกว่า

รูปหกเหลี่ยมปกติคือรูปหลายเหลี่ยมที่มีด้านเท่ากันหกด้านและมีมุมเท่ากัน จาก หลักสูตรของโรงเรียนเรารู้ว่ามันมีคุณสมบัติดังต่อไปนี้:

  • ความยาวของด้านสอดคล้องกับรัศมีของวงกลมที่ล้อมรอบ มีเพียงรูปหกเหลี่ยมปกติเท่านั้นที่มีคุณสมบัตินี้
  • มุมทั้งสองเท่ากัน และขนาดของแต่ละมุมคือ 120°
  • เส้นรอบรูปของรูปหกเหลี่ยมสามารถหาได้โดยใช้สูตร P=6*R ถ้าทราบรัศมีของวงกลมที่อธิบายรอบๆ รูปหกเหลี่ยม หรือ P=4*√(3)*r ถ้าวงกลมถูกจารึกไว้ข้างใน R และ r คือรัศมีของวงกลมที่มีเส้นรอบวงและวงกลมที่มีเส้นรอบวง
  • พื้นที่ที่ถูกครอบครองโดยรูปหกเหลี่ยมปกติถูกกำหนดดังนี้: S=(3*√(3)*R 2)/2 หากไม่ทราบรัศมี ให้แทนที่ความยาวของด้านใดด้านหนึ่ง ดังที่ทราบ ค่าดังกล่าวจะสอดคล้องกับความยาวของรัศมีของวงกลมที่มีเส้นรอบวง

รูปหกเหลี่ยมปกติจะมีอันหนึ่ง คุณสมบัติที่น่าสนใจต้องขอบคุณที่มันแพร่หลายในธรรมชาติจึงสามารถเติมเต็มพื้นผิวของเครื่องบินได้โดยไม่ทับซ้อนกันหรือช่องว่าง มีสิ่งที่เรียกว่า Pal lemma ด้วยซ้ำ โดยที่รูปหกเหลี่ยมปกติซึ่งมีด้านเท่ากับ 1/√(3) นั้นเป็นหน้าปกสากล กล่าวคือ มันสามารถคลุมเซตใดๆ ที่มีเส้นผ่านศูนย์กลางหนึ่งหน่วยได้ .

ตอนนี้เรามาดูการสร้างรูปหกเหลี่ยมปกติกัน มีหลายวิธี วิธีที่ง่ายที่สุดคือการใช้เข็มทิศ ดินสอ และไม้บรรทัด ขั้นแรก เราวาดวงกลมตามอำเภอใจด้วยเข็มทิศ จากนั้นเราระบุตำแหน่งที่ต้องการบนวงกลมนี้ โดยไม่เปลี่ยนมุมของเข็มทิศ เราวางส่วนปลายไว้ที่จุดนี้ ทำเครื่องหมายรอยบากถัดไปบนวงกลม และทำต่อไปจนกว่าจะได้ทั้งหมด 6 คะแนน ตอนนี้สิ่งที่เหลืออยู่คือเชื่อมต่อพวกมันเข้าด้วยกันด้วยส่วนตรงแล้วคุณจะได้รูปร่างที่ต้องการ

ในทางปฏิบัติ มีหลายกรณีที่คุณจำเป็นต้องวาดรูปหกเหลี่ยมขนาดใหญ่ ตัวอย่างเช่น บนเพดานยิปซั่มสองระดับ รอบตำแหน่งการติดตั้งของโคมระย้ากลาง คุณต้องติดตั้งโคมไฟขนาดเล็กหกดวงที่ระดับล่าง เข็มทิศขนาดนี้จะหายากมาก จะทำอย่างไรในกรณีนี้? คุณจะวาดวงกลมขนาดใหญ่ได้อย่างไร? ง่ายมาก. คุณต้องใช้ด้ายที่แข็งแรงตามความยาวที่ต้องการแล้วผูกปลายด้านหนึ่งไว้ตรงข้ามกับดินสอ ตอนนี้สิ่งที่เหลืออยู่คือการหาผู้ช่วยที่จะกดปลายด้ายที่สองขึ้นไปบนเพดาน ณ จุดที่ต้องการ แน่นอนว่าในกรณีนี้ อาจเกิดข้อผิดพลาดเล็กน้อยได้ แต่บุคคลภายนอกไม่น่าจะสังเกตเห็นได้เลย

เนื้อหา:

รูปหกเหลี่ยมปกติหรือที่เรียกว่ารูปหกเหลี่ยมสมบูรณ์ มีด้านเท่ากันหกด้านและมีด้านหกด้าน มุมเท่ากัน- คุณสามารถวาดรูปหกเหลี่ยมด้วยเทปวัดและไม้โปรแทรกเตอร์ รูปหกเหลี่ยมหยาบที่มีวัตถุทรงกลมและไม้บรรทัด หรือรูปหกเหลี่ยมที่หยาบกว่านั้นโดยใช้เพียงดินสอและสัญชาตญาณเล็กน้อย หากคุณต้องการทราบวิธีการวาดรูปหกเหลี่ยมในรูปแบบต่างๆ โปรดอ่านต่อ

ขั้นตอน

1 วาดรูปหกเหลี่ยมที่สมบูรณ์แบบโดยใช้เข็มทิศ

  1. 1 ใช้เข็มทิศวาดวงกลมใส่ดินสอเข้าไปในเข็มทิศ ขยายเข็มทิศให้กว้างตามรัศมีที่ต้องการของวงกลม รัศมีอาจมีความกว้างตั้งแต่สองสามถึงสิบเซนติเมตร จากนั้นวางเข็มทิศและดินสอลงบนกระดาษแล้ววาดวงกลม
    • บางครั้งการวาดครึ่งวงกลมก่อนแล้วจึงวาดครึ่งวงกลมจะง่ายกว่า
  2. 2 เลื่อนเข็มเข็มทิศไปที่ขอบของวงกลมวางไว้บนวงกลม อย่าเปลี่ยนมุมหรือตำแหน่งของเข็มทิศ
  3. 3 ทำเครื่องหมายดินสอเล็กๆ ที่ขอบวงกลมทำให้มันแตกต่างแต่อย่ามืดจนเกินไปเพราะคุณจะลบมันทิ้งในภายหลัง อย่าลืมรักษามุมที่คุณตั้งไว้สำหรับเข็มทิศ
  4. 4 เลื่อนเข็มเข็มทิศไปยังเครื่องหมายที่คุณเพิ่งทำวางเข็มลงบนเครื่องหมายโดยตรง
  5. 5 ทำเครื่องหมายด้วยดินสออีกอันที่ขอบวงกลมด้วยวิธีนี้ คุณจะสร้างเครื่องหมายที่สองที่ระยะห่างจากเครื่องหมายแรก ให้เคลื่อนที่ไปในทิศทางเดียว
  6. 6 ใช้วิธีการเดียวกันเพื่อทำเครื่องหมายเพิ่มอีกสี่แต้มคุณต้องกลับสู่เครื่องหมายเดิม ถ้าไม่เช่นนั้น มุมที่คุณถือเข็มทิศและทำเครื่องหมายของคุณน่าจะเปลี่ยนไป สิ่งนี้อาจเกิดขึ้นเพราะคุณบีบมันแน่นเกินไปหรือคลายออกเล็กน้อย
  7. 7 เชื่อมต่อเครื่องหมายโดยใช้ไม้บรรทัดตำแหน่งหกตำแหน่งที่เครื่องหมายของคุณตัดกับขอบของวงกลมคือจุดยอดทั้งหกของรูปหกเหลี่ยม ใช้ไม้บรรทัดและดินสอวาดเส้นตรงที่เชื่อมเครื่องหมายที่อยู่ติดกัน
  8. 8 ลบวงกลม รอยบนขอบวงกลม และรอยอื่นๆ ที่คุณทำไว้ เมื่อคุณลบแนวการก่อสร้างทั้งหมดแล้ว รูปหกเหลี่ยมที่สมบูรณ์แบบของคุณควรพร้อม

2 วาดรูปหกเหลี่ยมหยาบโดยใช้วัตถุทรงกลมและไม้บรรทัด

  1. 1 วาดขอบกระจกด้วยดินสอด้วยวิธีนี้คุณจะวาดวงกลม การวาดด้วยดินสอเป็นสิ่งสำคัญมากเนื่องจากในภายหลังคุณจะต้องลบบรรทัดเสริมทั้งหมด คุณยังสามารถลากแก้วแบบกลับหัว โหล หรืออะไรก็ได้ที่มีฐานกลมได้
  2. 2 ลากเส้นแนวนอนผ่านจุดศูนย์กลางวงกลมคุณสามารถใช้ไม้บรรทัด หนังสือ หรืออะไรก็ได้ที่มีขอบตรง ถ้าคุณมีไม้บรรทัด คุณสามารถทำเครื่องหมายตรงกลางได้โดยคำนวณความยาวแนวตั้งของวงกลมแล้วหารครึ่ง
  3. 3 วาด "X" เหนือวงกลมครึ่งวงกลม โดยแบ่งเป็น 6 ส่วนเท่าๆ กันเนื่องจากคุณได้ลากเส้นผ่านกึ่งกลางวงกลมแล้ว X จึงต้องกว้างกว่าความสูงเพื่อให้แต่ละส่วนเท่ากัน ลองนึกภาพการแบ่งพิซซ่าออกเป็นหกชิ้น
  4. 4 สร้างสามเหลี่ยมออกจากแต่ละส่วนเมื่อต้องการทำเช่นนี้ ให้ใช้ไม้บรรทัดวาดเส้นตรงใต้ส่วนโค้งของแต่ละส่วน แล้วเชื่อมต่อกับอีกสองเส้นเพื่อสร้างรูปสามเหลี่ยม ทำสิ่งนี้กับห้าส่วนที่เหลือ คิดว่ามันเหมือนกับการทำเปลือกรอบชิ้นพิซซ่าของคุณ
  5. 5 ลบบรรทัดเสริมทั้งหมดเส้นบอกแนวประกอบด้วยวงกลมของคุณ เส้นสามเส้นที่แบ่งวงกลมออกเป็นส่วนๆ และเครื่องหมายอื่นๆ ที่คุณทำไว้ระหว่างทาง

3 วาดรูปหกเหลี่ยมหยาบโดยใช้ดินสออันเดียว

  1. 1 วาดเส้นแนวนอนหากต้องการวาดเส้นตรงโดยไม่ต้องใช้ไม้บรรทัด เพียงวาดจุดเริ่มต้นและจุดสิ้นสุดของเส้นแนวนอน จากนั้นวางดินสอไว้ที่จุดเริ่มต้นแล้วลากเส้นไปจนสุด ความยาวของเส้นนี้สามารถมีได้เพียงไม่กี่เซนติเมตรเท่านั้น
  2. 2 ลากเส้นทแยงมุมสองเส้นจากปลายแนวนอนเส้นทแยงมุมทางด้านซ้ายควรชี้ออกไปในลักษณะเดียวกับเส้นทแยงมุมทางด้านขวา คุณคงจินตนาการได้ว่าเส้นเหล่านี้มีมุม 120 องศาเทียบกับเส้นแนวนอน
  3. 3 วาดเส้นแนวนอนอีกสองเส้นจากเส้นแนวนอนเส้นแรกที่ลากเข้าด้านในซึ่งจะสร้างภาพสะท้อนของเส้นทแยงมุมสองเส้นแรก เส้นล่างซ้ายควรเป็นการสะท้อนของเส้นซ้ายบน และเส้นขวาล่างควรเป็นการสะท้อนของเส้นขวาบน แม้ว่าเส้นแนวนอนด้านบนควรมองออกไปด้านนอก แต่เส้นแนวนอนด้านล่างควรมองเข้าด้านในถึงฐาน
  4. 4 ลากเส้นแนวนอนอีกเส้นเชื่อมระหว่างเส้นทแยงมุมสองเส้นด้านล่างด้วยวิธีนี้ คุณจะวาดฐานของรูปหกเหลี่ยมได้ ตามหลักการแล้ว เส้นนี้ควรขนานกับเส้นแนวนอนด้านบน ตอนนี้คุณทำรูปหกเหลี่ยมเสร็จแล้ว
  • ดินสอและเข็มทิศควรมีความคมเพื่อลดข้อผิดพลาดจากเครื่องหมายที่กว้างเกินไป
  • เมื่อใช้วิธีการเข็มทิศ หากคุณเชื่อมต่อแต่ละเครื่องหมายแทนทั้งหก คุณจะได้รูปสามเหลี่ยมด้านเท่า

คำเตือน

  • เข็มทิศเป็นวัตถุที่ค่อนข้างแหลมคม ควรระวังให้มาก

หลักการทำงาน

  • แต่ละวิธีจะช่วยคุณวาดรูปหกเหลี่ยมที่เกิดจากสามเหลี่ยมด้านเท่า 6 รูปซึ่งมีรัศมีเท่ากับความยาวของด้านทั้งหมด รัศมีทั้งหกที่วาดไว้มีความยาวเท่ากัน และเส้นทั้งหมดที่สร้างเป็นรูปหกเหลี่ยมก็มีความยาวเท่ากัน เนื่องจากความกว้างของเข็มทิศไม่เปลี่ยนแปลง เนื่องจากสามเหลี่ยมทั้งหกนั้นมีด้านเท่ากันหมด มุมระหว่างจุดยอดจึงอยู่ที่ 60 องศา

สิ่งที่คุณต้องการ

  • กระดาษ
  • ดินสอ
  • ไม้บรรทัด
  • เข็มทิศคู่หนึ่ง
  • สิ่งที่สามารถวางไว้ใต้กระดาษเพื่อป้องกันไม่ให้เข็มเข็มทิศลื่นไถล
  • ยางลบ

สามเหลี่ยมล้อมรอบปกติจะถูกสร้างขึ้นดังนี้(ภาพที่ 38) จากศูนย์กลางของรัศมีวงกลมที่กำหนด ร 1 วาดวงกลมที่มีรัศมี R2 = 2R1 และแบ่งออกเป็นสามส่วนเท่าๆ กัน คะแนนกอง ก, บี, ซี คือจุดยอดของสามเหลี่ยมปกติที่ล้อมรอบวงกลมรัศมี ร 1 .

รูปที่ 38

รูปสี่เหลี่ยมขนมเปียกปูนที่มีเส้นรอบวงปกติ (สี่เหลี่ยมจัตุรัส)สามารถสร้างได้โดยใช้เข็มทิศและไม้บรรทัด (รูปที่ 39) ในวงกลมที่กำหนด จะมีการวาดเส้นผ่านศูนย์กลางตั้งฉากกันสองเส้น ใช้จุดตัดของเส้นผ่านศูนย์กลางโดยมีวงกลมเป็นศูนย์กลาง คือ รัศมีของวงกลม อธิบายส่วนโค้งจนกระทั่งพวกมันตัดกันที่จุดต่างๆ เอบีซีดี - คะแนน , บี , , ดี และเป็นจุดยอดของสี่เหลี่ยมจัตุรัสที่ล้อมรอบวงกลมที่กำหนด

รูปที่ 39

เพื่อสร้างรูปหกเหลี่ยมที่มีขอบเขตปกติจำเป็นต้องสร้างจุดยอดของสี่เหลี่ยมจัตุรัสที่อธิบายไว้ก่อนในลักษณะที่ระบุไว้ข้างต้น (รูปที่ 40, a) พร้อมกับกำหนดจุดยอดของสี่เหลี่ยมจัตุรัส ซึ่งเป็นวงกลมที่มีรัศมีที่กำหนด แบ่งออกเป็นหกส่วนเท่า ๆ กันตามจุด 1, 2, 3, 4, 5, 6 และวาดด้านแนวตั้งของสี่เหลี่ยมจัตุรัส วาดวงกลมผ่านจุดแบ่ง 2–5 และ 3–6 เส้นตรงจนกระทั่งตัดกับด้านแนวตั้งของสี่เหลี่ยมจัตุรัส (รูปที่ 40, b) เราจะได้จุดยอด ก, บี, ดี, อี อธิบายรูปหกเหลี่ยมปกติ

รูปที่ 40

ยอดเขาอื่นๆ และ เอฟกำหนดโดยใช้ส่วนโค้งของรัศมีวงกลม โอเอซึ่งดำเนินการจนกว่าจะตัดกับความต่อเนื่องของเส้นผ่านศูนย์กลางแนวตั้งของวงกลมที่กำหนด
3 การจับคู่

มาเรียนรู้วิธีวาดปริซึมหกเหลี่ยมในตำแหน่งต่างๆ กัน

ศึกษาวิธีการต่างๆ ในการสร้างรูปหกเหลี่ยมปกติ วาดรูปหกเหลี่ยม ตรวจสอบความถูกต้องของการก่อสร้าง สร้างปริซึมหกเหลี่ยมตามรูปหกเหลี่ยม

พิจารณาปริซึมหกเหลี่ยมในรูป 3.52 และเส้นโครงตั้งฉากในรูปที่ 3 3.53. ที่ฐานของปริซึมหกเหลี่ยม (หกเหลี่ยม) เป็นรูปหกเหลี่ยมปกติ ใบหน้าด้านข้างเป็นรูปสี่เหลี่ยมผืนผ้าเหมือนกัน เพื่อที่จะพรรณนารูปหกเหลี่ยมในเปอร์สเปคทีฟได้อย่างถูกต้อง คุณต้องเรียนรู้วิธีแสดงฐานของมันในเปอร์สเปคทีฟอย่างถูกต้อง (รูปที่ 3.54) ในรูปหกเหลี่ยมในรูป จุดยอด 3.55 ถูกกำหนดด้วยตัวเลขตั้งแต่ 1 ถึง 6 หากคุณเชื่อมต่อจุดที่ 1 และ 3, 4 และ 6 ด้วยเส้นตรงแนวตั้ง คุณจะสังเกตเห็นว่าเส้นตรงเหล่านี้พร้อมกับจุดศูนย์กลางของวงกลม แบ่งเส้นผ่านศูนย์กลาง 5 - 2 ออกเป็นสี่ส่วนเท่า ๆ กัน (ส่วนเหล่านี้ระบุด้วยส่วนโค้ง ). ด้านตรงข้ามของรูปหกเหลี่ยมขนานกันและเป็นเส้นที่ลากผ่านจุดศูนย์กลางและเชื่อมต่อจุดยอดสองจุด (เช่น ด้าน 6 - 1 และ 4 - 3 ขนานกับเส้น 5 - 2) การสังเกตเหล่านี้จะช่วยให้คุณสร้างรูปหกเหลี่ยมในเปอร์สเปคทีฟ รวมถึงตรวจสอบความถูกต้องของโครงสร้างนี้ มีสองวิธีในการสร้างรูปหกเหลี่ยมปกติจากการเป็นตัวแทน: ขึ้นอยู่กับเส้นรอบวงและขึ้นอยู่กับสี่เหลี่ยมจัตุรัส

ขึ้นอยู่กับวงกลมที่ล้อมรอบ ดูที่รูป 3.56. จุดยอดทั้งหมดของรูปหกเหลี่ยมปกติจะอยู่ในเส้นรอบวงวงกลมซึ่งมีรัศมีเท่ากับด้านของรูปหกเหลี่ยม


หกเหลี่ยมแนวนอน วาดวงรีแนวนอนของช่องเปิดที่ต้องการ เช่น วงกลมที่มีขอบเขตในเปอร์สเป็คทีฟ ตอนนี้คุณต้องหาจุดหกจุดบนนั้น ซึ่งเป็นจุดยอดของรูปหกเหลี่ยม วาดเส้นผ่านศูนย์กลางของวงกลมที่กำหนดผ่านจุดศูนย์กลาง (รูปที่ 3.57) จุดสูงสุดของเส้นผ่านศูนย์กลาง - 5 และ 2 ซึ่งอยู่บนวงรีคือจุดยอดของรูปหกเหลี่ยม ในการค้นหาจุดยอดที่เหลือจำเป็นต้องแบ่งเส้นผ่านศูนย์กลางนี้ออกเป็นสี่ส่วนเท่า ๆ กัน เส้นผ่านศูนย์กลางถูกหารด้วยจุดศูนย์กลางของวงกลมออกเป็นสองรัศมีแล้ว ที่เหลือก็แค่แบ่งแต่ละรัศมีออกครึ่งหนึ่ง ในการวาดภาพเปอร์สเปคทีฟ ทั้งสี่ส่วนจะหดตัวเท่ากันเมื่อเคลื่อนออกจากตัวแสดง (รูปที่ 3.58) ตอนนี้ลากผ่านจุดกึ่งกลางของรัศมี - จุด A และ B - เส้นตรงตั้งฉากกับเส้นตรง 5 - 2 คุณสามารถค้นหาทิศทางได้โดยใช้แทนเจนต์กับวงรีที่จุดที่ 5 และ 2 (รูปที่ 3.59) แทนเจนต์เหล่านี้จะตั้งฉากกับเส้นผ่านศูนย์กลาง 5 - 2 และเส้นที่ลากผ่านจุด A และ B ขนานกับแทนเจนต์เหล่านี้จะตั้งฉากกับเส้น 5 - 2 เช่นกัน กำหนดจุดที่ได้รับที่จุดตัดของเส้นเหล่านี้ด้วยวงรีเป็น 1, 3, 4, 6 ( รูปที่ 3.60). เชื่อมต่อจุดยอดทั้งหกด้วยเส้นตรง (รูปที่ 3.61)

ตรวจสอบการก่อสร้างของคุณถูกต้อง วิธีทางที่แตกต่าง- หากการก่อสร้างถูกต้อง เส้นที่เชื่อมต่อจุดยอดตรงข้ามของรูปหกเหลี่ยมจะตัดกันที่กึ่งกลางวงกลม (รูปที่ 3.62) และด้านตรงข้ามของรูปหกเหลี่ยมจะขนานกับเส้นผ่านศูนย์กลางที่สอดคล้องกัน (รูปที่ 3.63) วิธีการตรวจสอบแบบอื่นแสดงไว้ในรูปที่ 1 3.64.

หกเหลี่ยมแนวตั้ง ในรูปหกเหลี่ยมดังกล่าว เส้นตรงที่เชื่อมจุด 7 และ 3, b และ 4 รวมถึงแทนเจนต์ของวงกลมที่ขอบที่ 5 และ 2 มีทิศทางแนวตั้งและคงไว้ในการวาดเปอร์สเปคทีฟ ดังนั้น เมื่อวาดแทนเจนต์แนวตั้งสองตัวลงในวงรี เราจะพบจุดที่ 5 และ 2 (จุดสัมผัส) เชื่อมต่อด้วยเส้นตรงแล้วแบ่งเส้นผ่านศูนย์กลางผลลัพธ์ 5 - 2 ออกเป็น 4 ส่วนเท่า ๆ กันโดยคำนึงถึงการลดเปอร์สเปคทีฟ (รูปที่ 3.65) ลากเส้นแนวตั้งผ่านจุด A และ B และที่จุดตัดกับวงรีให้หาจุดที่ 1,3,6l4 จากนั้นเชื่อมต่อจุดที่ 1 - 6 ตามลำดับด้วยเส้นตรง (รูปที่ 3.66) ตรวจสอบความถูกต้องของโครงสร้างหกเหลี่ยมในลักษณะเดียวกับตัวอย่างก่อนหน้า

วิธีการสร้างรูปหกเหลี่ยมที่อธิบายไว้ช่วยให้เราได้รูปนี้โดยอิงจากวงกลม ซึ่งง่ายต่อการพรรณนาในเปอร์สเป็คทีฟมากกว่ากำลังสองตามสัดส่วนที่กำหนด ดังนั้นวิธีสร้างรูปหกเหลี่ยมนี้จึงดูแม่นยำและเป็นสากลที่สุด วิธีการก่อสร้างแบบสี่เหลี่ยมจัตุรัสทำให้ง่ายต่อการพรรณนารูปหกเหลี่ยมในกรณีที่มีลูกบาศก์อยู่แล้วในภาพวาด หรืออีกนัยหนึ่งคือเมื่อมีการกำหนดสัดส่วนของสี่เหลี่ยมจัตุรัสและทิศทางของด้านข้าง

ขึ้นอยู่กับสี่เหลี่ยมจัตุรัส ดูที่รูป 3.67. รูปหกเหลี่ยมที่จารึกไว้ในสี่เหลี่ยมจัตุรัสจะเท่ากับด้านข้างของสี่เหลี่ยมจัตุรัสในทิศทางแนวนอน 5 - 2 และน้อยกว่าความยาวในทิศทางแนวตั้ง

หกเหลี่ยมแนวตั้ง วาดรูปสี่เหลี่ยมแนวตั้งในเปอร์สเปคทีฟ ลากเส้นตรงผ่านจุดตัดของเส้นทแยงมุมขนานกับด้านแนวนอน แบ่งส่วนที่เป็นผลลัพธ์ 5 - 2 ออกเป็นสี่ส่วนเท่า ๆ กันแล้วลากเส้นแนวตั้งผ่านจุด A และ B (รูปที่ 3.68) เส้นแบ่งรูปหกเหลี่ยมที่ด้านบนและด้านล่างไม่ตรงกับด้านข้างของสี่เหลี่ยมจัตุรัส วาดพวกมันที่ระยะหนึ่ง (1114 a) จากด้านแนวนอนของสี่เหลี่ยมจัตุรัสและขนานกับพวกมัน โดยการเชื่อมต่อจุดที่ 1 และ 3 ที่พบในลักษณะนี้กับจุดที่ 2 และจุดที่ 6 และ 4 กับจุดที่ 5 เราจะได้รูปหกเหลี่ยม (รูปที่ 3.69)

รูปหกเหลี่ยมแนวนอนถูกสร้างขึ้นในลำดับเดียวกัน (รูปที่ 3.70 และ 3.71)

วิธีการก่อสร้างนี้เหมาะสำหรับรูปหกเหลี่ยมที่มีช่องเปิดเพียงพอเท่านั้น หากช่องเปิดของรูปหกเหลี่ยมไม่มีนัยสำคัญ ควรใช้วิธีตามวงกลมที่มีเส้นรอบวงจะดีกว่า หากต้องการตรวจสอบรูปหกเหลี่ยมที่สร้างผ่านสี่เหลี่ยมจัตุรัส คุณสามารถใช้วิธีการที่คุณรู้จักอยู่แล้วได้

นอกจากนี้ยังมีวิธีอื่น - เพื่ออธิบายวงกลมรอบรูปหกเหลี่ยมที่เกิดขึ้น (ในรูปวาดของคุณ - วงรี) จุดยอดทั้งหมดของรูปหกเหลี่ยมจะต้องอยู่ในวงรีนี้

เมื่อคุณเชี่ยวชาญทักษะการวาดรูปหกเหลี่ยมแล้ว คุณจะมีอิสระในการวาดปริซึมหกเหลี่ยมต่อไป ดูแผนภาพในรูปอย่างระมัดระวัง 3.72 เช่นเดียวกับไดอะแกรมสำหรับสร้างปริซึมหกเหลี่ยมโดยอิงจากวงกลมที่มีขอบเขต (รูปที่ 3.73; 3.74 และ 3.75) และอิงจากสี่เหลี่ยมจัตุรัส (รูปที่ 3.76; 3.77 และ 3.78) วาดรูปหกเหลี่ยมแนวตั้งและแนวนอนด้วยวิธีต่างๆ ในการวาดภาพหกเหลี่ยมแนวตั้ง ด้านยาวของหน้าปัดด้านข้างจะเป็นเส้นตรงแนวตั้งขนานกัน และฐานหกเหลี่ยมจะเปิดออกมากขึ้นเมื่ออยู่ห่างจากเส้นขอบฟ้า ในการวาดภาพหกเหลี่ยมแนวนอน ด้านยาวของใบหน้าด้านข้างจะมาบรรจบกันที่จุดที่หายไปบนขอบฟ้า และการเปิดฐานหกเหลี่ยมจะยิ่งมากขึ้นเมื่ออยู่ห่างจากผู้ดู เมื่อวาดภาพหกเหลี่ยม ตรวจสอบให้แน่ใจว่าขอบขนานของฐานทั้งสองมาบรรจบกันในเปอร์สเปคทีฟ (รูปที่ 3.79; 3.80)

ตารางหกเหลี่ยม (ตารางหกเหลี่ยม) ถูกนำมาใช้ในบางเกม แต่ไม่ง่ายหรือธรรมดาเหมือนตารางสี่เหลี่ยม ฉันรวบรวมทรัพยากรบน hex mesh มาเกือบ 20 ปีแล้ว และฉันเขียนคู่มือนี้เกี่ยวกับแนวทางที่หรูหราที่สุด ซึ่งนำไปใช้ในโค้ดที่ง่ายที่สุด บทความนี้ใช้คำแนะนำของ Charles Fu และ Clark Verbrugge บ่อยครั้ง ฉันจะอธิบายวิธีต่างๆ ในการสร้าง mesh หกเหลี่ยม ความสัมพันธ์ของพวกมัน และอัลกอริธึมที่ใช้บ่อยที่สุด หลายส่วนของบทความนี้เป็นแบบโต้ตอบ: การเลือกประเภทตารางจะเปลี่ยนไดอะแกรม โค้ด และข้อความที่เกี่ยวข้อง (หมายเหตุต่อ: สิ่งนี้ใช้กับต้นฉบับเท่านั้น ฉันแนะนำให้คุณศึกษา ในการแปล ข้อมูลทั้งหมดของต้นฉบับจะถูกเก็บรักษาไว้ แต่ไม่มีการโต้ตอบ).

ตัวอย่างโค้ดในบทความเขียนด้วยรหัสเทียม ดังนั้นจึงง่ายต่อการอ่านและทำความเข้าใจเพื่อเขียนการใช้งานของคุณเอง

เรขาคณิต

รูปหกเหลี่ยมเป็นรูปหลายเหลี่ยมหกด้าน รูปหกเหลี่ยมปกติจะมีด้าน (ขอบ) ทุกด้านที่มีความยาวเท่ากัน เราจะทำงานกับรูปหกเหลี่ยมปกติเท่านั้น โดยทั่วไปแล้ว ตาข่ายหกเหลี่ยมจะใช้การวางแนวในแนวนอน (ด้านบนแหลม) และแนวตั้ง (ด้านบนแบน)


รูปหกเหลี่ยมที่มียอดแบน (ซ้าย) และยอดแหลม (ขวา)

หกเหลี่ยมมี 6 หน้า แต่ละหน้ามีรูปหกเหลี่ยมสองอันเหมือนกัน รูปหกเหลี่ยมมีจุดมุม 6 จุด แต่ละจุดมุมจะมีร่วมกันกับรูปหกเหลี่ยมสามอัน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับจุดกึ่งกลาง ขอบ และมุมได้ในบทความของฉันเกี่ยวกับชิ้นส่วนตาข่าย (สี่เหลี่ยมจัตุรัส หกเหลี่ยม และสามเหลี่ยม)

มุม

ในรูปหกเหลี่ยมปกติ มุมภายในคือ 120° มี "ลิ่ม" หกอัน แต่ละอันเป็นรูปสามเหลี่ยมด้านเท่าที่มีมุมภายใน 60° จุดมุม ฉันตั้งอยู่ที่ระยะห่าง (60° * i) + 30° หน่วยขนาดจากศูนย์กลาง ในรหัส:

ฟังก์ชัน hex_corner(ศูนย์กลาง, ขนาด, i): var angle_deg = 60 * i + 30 var angle_rad = PI / 180 * angle_deg return Point(center.x + size * cos(angle_rad), center.y + size * sin(angle_rad) )
ในการเติมรูปหกเหลี่ยม คุณจะต้องได้จุดยอดของรูปหลายเหลี่ยมจาก hex_corner(…, 0) ถึง hex_corner(…, 5) หากต้องการวาดโครงร่างของรูปหกเหลี่ยม คุณต้องใช้จุดยอดเหล่านี้แล้วลากเส้นอีกครั้งใน hex_corner(..., 0)

ความแตกต่างระหว่างการวางแนวทั้งสองคือการสลับ x และ y ส่งผลให้เกิดการเปลี่ยนแปลงมุม: รูปหกเหลี่ยมยอดเรียบมีมุม 0°, 60°, 120°, 180°, 240°, 300° และยอดแหลม รูปหกเหลี่ยมมีมุม 30 °, 90°, 150°, 210°, 270°, 330°


มุมหกเหลี่ยมที่มียอดแบนและแหลมคม

ขนาดและที่ตั้ง

ตอนนี้เราต้องการวางรูปหกเหลี่ยมหลายอันไว้ด้วยกัน ในแนวนอน ความสูงของรูปหกเหลี่ยมคือความสูง = ขนาด * 2 ระยะห่างแนวตั้งระหว่างรูปหกเหลี่ยมที่อยู่ติดกันคือ vert = height * 3/4 ​​​​

ความกว้างของหกเหลี่ยม ความกว้าง = sqrt(3)/2 * ความสูง ระยะห่างแนวนอนระหว่างรูปหกเหลี่ยมที่อยู่ติดกันคือ horiz = width

เกมบางเกมใช้ภาพพิกเซลสำหรับรูปหกเหลี่ยม ซึ่งไม่ตรงกับรูปหกเหลี่ยมปกติทุกประการ สูตรมุมและตำแหน่งที่อธิบายไว้ในส่วนนี้จะไม่ตรงกับขนาดของรูปหกเหลี่ยมดังกล่าว บทความที่เหลือที่อธิบายอัลกอริธึม hex mesh จะใช้แม้ว่ารูปหกเหลี่ยมจะยืดหรือแบนเล็กน้อยก็ตาม



ระบบพิกัด

มาเริ่มประกอบรูปหกเหลี่ยมเป็นตารางกันดีกว่า ในกรณีของตารางสี่เหลี่ยม มีเพียงวิธีเดียวเท่านั้นที่จะประกอบได้ชัดเจน สำหรับรูปหกเหลี่ยมนั้นมีหลายวิธี ฉันแนะนำให้ใช้พิกัดลูกบาศก์เป็นตัวแทนหลักของคุณ พิกัดแนวแกนหรือพิกัดออฟเซ็ตควรใช้ในการจัดเก็บแผนที่และแสดงพิกัดให้ผู้ใช้เห็น

พิกัดออฟเซ็ต

วิธีการที่พบบ่อยที่สุดคือการชดเชยแต่ละคอลัมน์หรือแถวที่ตามมา คอลัมน์ถูกกำหนดให้เป็น col หรือ q แถวจะแสดงด้วยแถวหรือ r คุณสามารถชดเชยคอลัมน์/แถวคี่หรือคู่ได้ ดังนั้นรูปหกเหลี่ยมแนวนอนและแนวตั้งแต่ละอันจึงมีสองตัวเลือก


การจัดเรียงแนวนอน "คี่-r"


การจัดเรียงแนวนอน “even-r”


การจัดเรียง "คี่-q" ในแนวตั้ง


การจัดเรียงแนวตั้ง “even-q”

พิกัดลูกบาศก์

วิธีดูกริดหกเหลี่ยมอีกวิธีหนึ่งคือการมองว่ากริดเป็น สามแกนหลักไม่ใช่ สองเช่นเดียวกับในตารางสี่เหลี่ยม แสดงความสมมาตรอันสง่างาม

ลองใช้ตารางลูกบาศก์และ มาตัดมันออกกันเถอะระนาบแนวทแยงที่ x + y + z = 0 นี่เป็นแนวคิดที่แปลก แต่จะช่วยให้เราลดความซับซ้อนของอัลกอริธึมตาข่ายหกเหลี่ยมได้ โดยเฉพาะอย่างยิ่ง เราจะสามารถใช้การดำเนินการมาตรฐานจากพิกัดคาร์ทีเซียนได้ เช่น การรวมและการลบพิกัด การคูณและหารด้วยปริมาณสเกลาร์ และระยะทาง

สังเกตแกนหลักสามแกนบนตารางของลูกบาศก์และความสัมพันธ์กับแกนทั้งหก เส้นทแยงมุมทิศทางของตารางหกเหลี่ยม แกนทแยงของตารางจะสอดคล้องกับทิศทางหลักของตารางหกเหลี่ยม


รูปหกเหลี่ยม


ลูกบาศก์

เนื่องจากเรามีอัลกอริทึมสำหรับตาข่ายสี่เหลี่ยมและลูกบาศก์อยู่แล้ว การใช้พิกัดลูกบาศก์จึงช่วยให้เราสามารถปรับอัลกอริทึมเหล่านี้ให้เป็นตาข่ายหกเหลี่ยมได้ ฉันจะใช้ระบบนี้กับอัลกอริทึมส่วนใหญ่ของบทความ หากต้องการใช้อัลกอริธึมกับระบบพิกัดอื่น ฉันจะแปลงพิกัดลูกบาศก์ รันอัลกอริทึม แล้วแปลงกลับ

เรียนรู้ว่าพิกัดลูกบาศก์ทำงานอย่างไรสำหรับตาข่ายหกเหลี่ยม เมื่อคุณเลือกรูปหกเหลี่ยม พิกัดลูกบาศก์ที่สอดคล้องกับแกนทั้งสามจะถูกไฮไลต์

  1. แต่ละทิศทางของตารางลูกบาศก์สอดคล้องกัน เส้นบนตารางรูปหกเหลี่ยม ลองเลือกรูปหกเหลี่ยมที่มี z เท่ากับ 0, 1, 2, 3 เพื่อดูการเชื่อมต่อ เส้นถูกทำเครื่องหมายด้วยสีน้ำเงิน ลองแบบเดียวกันกับ x (สีเขียว) และ y (สีม่วง)
  2. แต่ละทิศทางของตารางหกเหลี่ยมคือการรวมกันของสองทิศทางของตารางลูกบาศก์ ตัวอย่างเช่น "ทิศเหนือ" ของตารางหกเหลี่ยมอยู่ระหว่าง +y และ -z ดังนั้นแต่ละขั้นของ "ทิศเหนือ" จะเพิ่ม y ขึ้น 1 และลด z ลง 1
พิกัดลูกบาศก์เป็นตัวเลือกที่เหมาะสมสำหรับระบบพิกัดตารางหกเหลี่ยม เงื่อนไขคือ x + y + z = 0 ดังนั้นจึงต้องคงไว้ในอัลกอริทึม เงื่อนไขยังช่วยให้แน่ใจว่าจะมีพิกัดมาตรฐานสำหรับรูปหกเหลี่ยมแต่ละอันเสมอ

มีระบบพิกัดที่แตกต่างกันมากมายสำหรับลูกบาศก์และหกเหลี่ยม บางส่วนมีเงื่อนไขแตกต่างจาก x + y + z = 0 ฉันแสดงเพียงระบบเดียวในหลาย ๆ ระบบ คุณยังสามารถสร้างพิกัดลูกบาศก์ด้วย x-y , y-z , z-x ซึ่งมีคุณสมบัติที่น่าสนใจเป็นของตัวเอง แต่ฉันจะไม่เข้าไปดูพวกมันที่นี่

แต่คุณอาจแย้งว่าคุณไม่ต้องการเก็บตัวเลข 3 ตัวสำหรับพิกัดเพราะคุณไม่รู้วิธีจัดเก็บแผนที่ในลักษณะนั้น

พิกัดแนวแกน

ระบบพิกัดแนวแกน บางครั้งเรียกว่าระบบพิกัด "สี่เหลี่ยมคางหมู" สร้างขึ้นจากพิกัดสองหรือสามพิกัดจากระบบพิกัดลูกบาศก์ เนื่องจากเรามีเงื่อนไข x + y + z = 0 จึงไม่จำเป็นต้องมีพิกัดที่สาม พิกัดแนวแกนมีประโยชน์สำหรับการจัดเก็บแผนที่และการแสดงพิกัดแก่ผู้ใช้ เช่นเดียวกับพิกัดลูกบาศก์ คุณสามารถใช้การดำเนินการมาตรฐานในการบวก ลบ คูณ และหารพิกัดคาร์ทีเซียนได้

มีระบบพิกัดลูกบาศก์หลายระบบและหลายระบบตามแนวแกน ฉันจะไม่ครอบคลุมทุกชุดค่าผสมในคู่มือนี้ ฉันจะเลือกตัวแปรสองตัว q (คอลัมน์) และ r (แถว) ในไดอะแกรมในบทความนี้ q สอดคล้องกับ x และ r สอดคล้องกับ z แต่การติดต่อนี้เป็นไปตามอำเภอใจ เนื่องจากคุณสามารถหมุนและหมุนไดอะแกรมเพื่อให้ได้การติดต่อที่แตกต่างกัน

ข้อดีของระบบนี้เหนือกริดการกระจัดคืออัลกอริธึมสามารถเข้าใจได้มากขึ้น ข้อเสียของระบบคือการจัดเก็บการ์ดสี่เหลี่ยมนั้นค่อนข้างแปลก ดูส่วนการบันทึกแผนที่ อัลกอริธึมบางตัวมีความชัดเจนยิ่งขึ้นในพิกัดลูกบาศก์ แต่เนื่องจากเรามีเงื่อนไข x + y + z = 0 เราจึงสามารถคำนวณพิกัดโดยนัยตัวที่สามและใช้ในอัลกอริธึมเหล่านี้ได้ ในโครงการของฉัน ฉันเรียกแกน q, r, s ดังนั้นเงื่อนไขจะดูเหมือน q + r + s = 0 และฉันสามารถคำนวณ s = -q - r ได้เมื่อจำเป็น

เพลา

พิกัดออฟเซ็ตเป็นสิ่งแรกที่คนส่วนใหญ่นึกถึง เนื่องจากเหมือนกันกับพิกัดคาร์ทีเซียนมาตรฐานที่ใช้สำหรับตารางสี่เหลี่ยมจัตุรัส น่าเสียดายที่แกนหนึ่งในสองแกนนั้นต้องวิ่งชนกับลายไม้ และสิ่งนี้กลับกลายเป็นเรื่องยุ่งยาก ระบบคิวบ์และแกนไปไกลและมีอัลกอริธึมที่ง่ายกว่า แต่ที่เก็บข้อมูลการ์ดนั้นซับซ้อนกว่าเล็กน้อย มีระบบอื่นที่เรียกว่า "สลับ" หรือ "คู่" แต่เราจะไม่พิจารณาในที่นี้ บางคนพบว่าใช้งานได้ง่ายกว่าลูกบาศก์หรือแนวแกน


พิกัดออฟเซ็ต ลูกบาศก์ และแนวแกน

แกนคือทิศทางที่พิกัดที่สอดคล้องกันเพิ่มขึ้น ตั้งฉากกับแกนคือเส้นที่พิกัดคงที่ แผนภาพตารางด้านบนแสดงเส้นตั้งฉาก

การแปลงพิกัด

มีแนวโน้มว่าคุณจะใช้พิกัดแนวแกนหรือออฟเซ็ตในการออกแบบของคุณ แต่อัลกอริทึมจำนวนมากจะแสดงเป็นพิกัดลูกบาศก์ได้ง่ายกว่า ดังนั้นเราจึงต้องสามารถแปลงพิกัดระหว่างระบบได้

พิกัดแกนมีความสัมพันธ์อย่างใกล้ชิดกับพิกัดลูกบาศก์ ดังนั้นการแปลงจึงทำได้ง่าย:

# แปลงพิกัดลูกบาศก์เป็นพิกัดแกน q = x r = z # แปลงพิกัดแกนเป็นลูกบาศก์ x = q z = r y = -x-z
ในโค้ด ฟังก์ชันทั้งสองนี้สามารถเขียนได้ดังนี้:

ฟังก์ชัน cube_to_hex(h): # axis var q = h.x var r = h.z return Hex(q, r) function hex_to_cube(h): # ลูกบาศก์ var x = h.q var z = h.r var y = -x-z return Cube(x, y , ซ)
พิกัดออฟเซ็ตค่อนข้างซับซ้อนกว่าเล็กน้อย:

รูปหกเหลี่ยมที่อยู่ติดกัน

เมื่อพิจารณาจากรูปหกเหลี่ยมหนึ่งอัน แล้วรูปหกเหลี่ยมหกเหลี่ยมนั้นอยู่ติดกับอะไร? อย่างที่คุณคาดหวัง คำตอบนั้นง่ายที่สุดในพิกัดลูกบาศก์ ค่อนข้างง่ายในพิกัดแนวแกน และยากกว่าเล็กน้อยในพิกัดการกระจัด คุณอาจต้องคำนวณรูปหกเหลี่ยม "แนวทแยง" หกรูปด้วย

พิกัดลูกบาศก์

การย้ายช่องว่างหนึ่งในพิกัดฐานสิบหกจะทำให้พิกัดลูกบาศก์หนึ่งในสามพิกัดเปลี่ยนเป็น +1 และอีกพิกัดหนึ่งเป็น -1 (ผลรวมต้องเป็น 0) ที่ +1 พิกัดที่เป็นไปได้สามพิกัดสามารถเปลี่ยนแปลงได้ และที่ -1 พิกัดที่เหลืออีกสองพิกัดสามารถเปลี่ยนแปลงได้ นี่ทำให้เรามีการเปลี่ยนแปลงที่เป็นไปได้หกประการ แต่ละอันสอดคล้องกับทิศทางใดทิศทางหนึ่งของรูปหกเหลี่ยม ที่ง่ายที่สุดและ วิธีที่เร็วที่สุด- คำนวณการเปลี่ยนแปลงล่วงหน้าและวางไว้ในตารางพิกัดลูกบาศก์ Cube(dx, dy, dz) ในเวลารวบรวม:

ทิศทางของตัวแปร = [ คิวบ์(+1, -1, 0), คิวบ์(+1, 0, -1), คิวบ์(0, +1, -1), คิวบ์(-1, +1, 0), คิวบ์( -1, 0, +1), Cube(0, -1, +1) ] ฟังก์ชัน cube_direction(ทิศทาง): ฟังก์ชันทิศทางการส่งคืน cube_neighbor(hex, ทิศทาง): ส่งคืน cube_add(hex, cube_direction(ทิศทาง))

พิกัดแนวแกน

เช่นเดิมเราใช้ระบบลูกบาศก์เริ่มต้น ลองใช้ตาราง Cube(dx, dy, dz) แล้วแปลงเป็นตาราง Hex(dq, dr):

ทิศทาง Var = [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0, +1) ] ฟังก์ชั่น hex_direction(ทิศทาง): กลับฟังก์ชันทิศทาง hex_neighbor(hex, ทิศทาง): var dir = hex_direction(ทิศทาง) กลับ Hex(hex.q + dir.q, hex.r + dir.r)

พิกัดออฟเซ็ต

ในพิกัดแนวแกน เราทำการเปลี่ยนแปลงโดยขึ้นอยู่กับตำแหน่งที่เราอยู่ในตาราง หากเราอยู่ในคอลัมน์/แถวออฟเซ็ต กฎจะแตกต่างจากกรณีของคอลัมน์/แถวที่ไม่มีออฟเซ็ต

เช่นเคย เราสร้างตารางตัวเลขที่ต้องเพิ่มใน col และ row อย่างไรก็ตาม คราวนี้เราจะมีสองอาร์เรย์ อาร์เรย์หนึ่งสำหรับคอลัมน์/แถวคี่ และอีกอาร์เรย์สำหรับอาร์เรย์คู่ ดูที่ (1,1) ในภาพแผนที่กริดด้านบน และสังเกตว่าคอลัมน์และแถวเปลี่ยนไปอย่างไรเมื่อคุณเคลื่อนที่ไปในแต่ละทิศทางในหกทิศทาง ตอนนี้เรามาทำซ้ำขั้นตอนสำหรับ (2,2) ตารางและโค้ดจะแตกต่างกันสำหรับกริดการกระจัดแต่ละประเภทจากทั้งหมดสี่ประเภท นี่คือโค้ดที่เกี่ยวข้องสำหรับกริดแต่ละประเภท

คี่ร
ทิศทาง var = [ [ Hex(+1, 0), Hex(0, -1), Hex(-1, -1), Hex(-1, 0), Hex(-1, +1), Hex(0 , +1) ], [ ฐานสิบหก(+1, 0), ฐานสิบหก(+1, -1), ฐานสิบหก(0, -1), ฐานสิบหก(-1, 0), ฐานสิบหก(0, +1), ฐานสิบหก( +1, +1) ] ] ฟังก์ชั่น offset_neighbor(hex, ทิศทาง): var parity = hex.row & 1 var dir = ทิศทางส่งคืน Hex(hex.col + dir.col, hex.row + dir.row)


คู่-r
ทิศทาง var = [ [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(0, +1), Hex(+1) , +1) ], [ ฐานสิบหก(+1, 0), ฐานสิบหก(0, -1), ฐานสิบหก(-1, -1), ฐานสิบหก(-1, 0), ฐานสิบหก(-1, +1), ฐานสิบหก (0, +1) ] ] ฟังก์ชั่น offset_neighbor(hex, ทิศทาง): var parity = hex.row & 1 var dir = ทิศทางส่งคืน Hex(hex.col + dir.col, hex.row + dir.row)


ตารางสำหรับแถวคู่ (EVEN) และคี่ (ODD)

คี่-คิว
ทิศทาง var = [ [ ฐานสิบหก (+1, 0), ฐานสิบหก (+1, -1), ฐานสิบหก (0, -1), ฐานสิบหก (-1, -1), ฐานสิบหก (-1, 0), ฐานสิบหก (0 , +1) ], [ ฐานสิบหก(+1, +1), ฐานสิบหก(+1, 0), ฐานสิบหก(0, -1), ฐานสิบหก(-1, 0), ฐานสิบหก(-1, +1), ฐานสิบหก (0, +1) ] ] ฟังก์ชั่น offset_neighbor(hex, ทิศทาง): var parity = hex.col & 1 var dir = ทิศทางส่งคืน Hex(hex.col + dir.col, hex.row + dir.row)


คู่-q
ทิศทาง var = [ [ Hex(+1, +1), Hex(+1, 0), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0 , +1) ], [ ฐานสิบหก(+1, 0), ฐานสิบหก(+1, -1), ฐานสิบหก(0, -1), ฐานสิบหก(-1, -1), ฐานสิบหก(-1, 0), ฐานสิบหก (0, +1) ] ] ฟังก์ชั่น offset_neighbor(hex, ทิศทาง): var parity = hex.col & 1 var dir = ทิศทางส่งคืน Hex(hex.col + dir.col, hex.row + dir.row)


ตารางสำหรับคอลัมน์คู่ (EVEN) และคี่ (ODD)

เส้นทแยงมุม

การเคลื่อนที่ในพื้นที่ "แนวทแยง" ในพิกัดฐานสิบหกจะเปลี่ยนพิกัดหนึ่งในสามพิกัดลูกบาศก์จะเปลี่ยน ±2 และอีกสองพิกัดด้วย ∓1 (ผลรวมต้องเป็น 0)

เส้นทแยงมุมต่างๆ = [ คิวบ์(+2, -1, -1), คิวบ์(+1, +1, -2), คิวบ์(-1, +2, -1), คิวบ์(-2, +1, +1) ), Cube(-1, -1, +2), Cube(+1, -2, +1) ] ฟังก์ชัน cube_diagonal_neighbor(hex, ทิศทาง): return cube_add(hex, diagonals)
เช่นเคย เราสามารถแปลงพิกัดเหล่านี้เป็นพิกัดแนวแกนได้โดยการละทิ้งหนึ่งในสามพิกัดนั้น หรือแปลงให้เป็นพิกัดออฟเซ็ตโดยการคำนวณผลลัพธ์ก่อน


ระยะทาง

พิกัดลูกบาศก์

ในระบบพิกัดลูกบาศก์ แต่ละหกเหลี่ยมจะเป็นลูกบาศก์ในปริภูมิสามมิติ รูปหกเหลี่ยมที่อยู่ติดกันจะเว้นระยะห่าง 1 จุดในตารางฐานสิบหก แต่เว้นระยะห่าง 2 จุดในตารางลูกบาศก์ ทำให้การคำนวณระยะทางเป็นเรื่องง่าย ในตารางสี่เหลี่ยม ระยะทางของแมนฮัตตันคือ abs(dx) + abs(dy) ในตารางลูกบาศก์ ระยะทางของแมนฮัตตันคือ abs(dx) + abs(dy) + abs(dz) ระยะห่างในตารางหกเหลี่ยมเท่ากับครึ่งหนึ่ง:

ฟังก์ชัน cube_distance(a, b): return (abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z)) / 2
ค่าที่เทียบเท่ากันของสัญกรณ์นี้ก็คือบอกว่าหนึ่งในสามพิกัดนั้นจะต้องเป็นผลรวมของอีกสองพิกัดที่เหลือ จากนั้นให้ถือว่าเป็นระยะทาง คุณสามารถเลือกรูปแบบการลดลงครึ่งหนึ่งหรือรูปแบบมูลค่าสูงสุดด้านล่าง แต่ให้ผลลัพธ์เหมือนกัน:

ฟังก์ชัน cube_distance(a, b): คืนค่าสูงสุด(abs(a.x - b.x), abs(a.y - b.y), abs(a.z - b.z))
ในรูปค่าสูงสุดจะถูกเน้นด้วยสี โปรดทราบว่าแต่ละสีแสดงถึงหนึ่งในหกทิศทาง "แนวทแยง"

กิฟ


พิกัดแนวแกน

ในระบบแกน พิกัดที่สามจะแสดงโดยปริยาย ลองแปลงจากแกนเป็นลูกบาศก์เพื่อคำนวณระยะทาง:

ฟังก์ชัน hex_distance(a, b): var ac = hex_to_cube(a) var bc = hex_to_cube(b) ส่งคืน cube_distance(ac, bc)
หากคอมไพลเลอร์แบบอินไลน์ (อินไลน์) hex_to_cube และ cube_distance ในกรณีของคุณ มันจะสร้างโค้ดดังนี้:

ฟังก์ชัน hex_distance(a, b): return (abs(a.q - b.q) + abs(a.q + a.r - b.q - b.r) + abs(a.r - b.r)) / 2
มีมากมาย ในรูปแบบต่างๆบันทึกระยะทางระหว่างรูปหกเหลี่ยมในพิกัดแกน แต่ไม่คำนึงถึงวิธีการบันทึก ระยะห่างระหว่างรูปหกเหลี่ยมในระบบแกนจะแยกจากระยะแมนฮัตตันในระบบลูกบาศก์- ตัวอย่างเช่น "ความแตกต่างของความแตกต่าง" ที่อธิบายไว้นั้นได้มาจากการเขียน a.q + a.r - b.q - b.r เป็น a.q - b.q + a.r - b.r และใช้รูปแบบค่าสูงสุดแทนรูปแบบการแบ่งแยก cube_distance ทั้งหมดนี้คล้ายกันหากคุณเห็นการเชื่อมต่อกับพิกัดลูกบาศก์

พิกัดออฟเซ็ต

เช่นเดียวกับพิกัดแนวแกน เราจะแปลงพิกัดออฟเซ็ตเป็นพิกัดลูกบาศก์ แล้วใช้ระยะลูกบาศก์

ฟังก์ชัน offset_distance(a, b): var ac = offset_to_cube(a) var bc = offset_to_cube(b) ส่งคืน cube_distance(ac, bc)
เราจะใช้รูปแบบเดียวกันสำหรับอัลกอริทึมหลายๆ ตัว เช่น แปลงจากรูปหกเหลี่ยมเป็นลูกบาศก์ เรียกใช้อัลกอริทึมเวอร์ชันลูกบาศก์ และแปลงผลลัพธ์ลูกบาศก์เป็นพิกัดหกเหลี่ยม (พิกัดแนวแกนหรือออฟเซ็ต)

การวาดเส้น

วิธีการลากเส้นจากรูปหกเหลี่ยมหนึ่งไปยังอีกรูปหนึ่ง? ฉันใช้การแก้ไขเชิงเส้นเพื่อวาดเส้น เส้นนี้จะถูกสุ่มตัวอย่างอย่างสม่ำเสมอที่จุด N+1 และจะมีการคำนวณว่าตัวอย่างเหล่านี้อยู่ในรูปหกเหลี่ยมใด

กิฟ


  1. อันดับแรก เราคำนวณ N ซึ่งจะเป็นระยะทางเป็นรูปหกเหลี่ยมระหว่างจุดสิ้นสุด
  2. จากนั้นเราจะสุ่มตัวอย่างจุด N+1 ระหว่างจุด A และ B เท่าๆ กัน โดยใช้การประมาณค่าเชิงเส้น เราพิจารณาว่าสำหรับค่า i ตั้งแต่ 0 ถึง N รวมทั้งค่าเหล่านี้ด้วย แต่ละจุดจะเป็น A + (B - A) * 1.0/N * ฉัน . ในรูป จุดควบคุมเหล่านี้จะแสดงเป็นสีน้ำเงิน ผลลัพธ์ที่ได้คือพิกัดจุดลอยตัว
  3. มาแปลงร่างกัน จุดควบคุม(ลอย) กลับไปเป็นรูปหกเหลี่ยม (int) อัลกอริทึมเรียกว่า cube_round (ดูด้านล่าง)
เราเชื่อมโยงทุกอย่างเข้าด้วยกันเพื่อลากเส้นจาก A ไป B:

ฟังก์ชั่น lerp(a, b, t): // สำหรับ float ส่งคืน a + (b - a) * t ฟังก์ชัน cube_lerp(a, b, t): // สำหรับรูปหกเหลี่ยมส่งคืน Cube(lerp(a.x, b.x, t), lerp(a.y, b.y, t), lerp(a.z, b.z, t)) ฟังก์ชัน cube_linedraw(a, b): var N = cube_distance(a, b) var results = สำหรับแต่ละ 0 ≤ i ≤ N: results.append( cube_round(cube_lerp(a, b, 1.0/N * i))) ส่งคืนผลลัพธ์
หมายเหตุ:

  • มีหลายกรณีที่ cube_lerp คืนค่าจุดที่อยู่บนขอบระหว่างรูปหกเหลี่ยมสองรูปพอดี จากนั้น cube_round จะเคลื่อนไปในทิศทางใดทิศทางหนึ่ง เส้นจะดูดีขึ้นหากเคลื่อนไปในทิศทางเดียว ซึ่งสามารถทำได้โดยการเพิ่ม "epsilon" - Cube หกเหลี่ยม (1e-6, 1e-6, -2e-6) ไปยังจุดปลายหนึ่งหรือทั้งสองก่อนที่จะเริ่มลูป วิธีนี้จะ "ดัน" เส้นไปในทิศทางเดียวเพื่อไม่ให้ไปชนขอบ
  • อัลกอริธึมเส้น DDA ในตารางสี่เหลี่ยมจะเท่ากับ N เป็นระยะทางสูงสุดในแต่ละแกน เราทำสิ่งเดียวกันในพื้นที่ลูกบาศก์ ซึ่งคล้ายกับระยะทางในตารางหกเหลี่ยม
  • ฟังก์ชัน cube_lerp ควรส่งคืนคิวบ์ที่มีพิกัดทศนิยม หากคุณกำลังเขียนโปรแกรมในภาษาที่พิมพ์แบบคงที่ คุณจะไม่สามารถใช้ประเภท Cube ได้ คุณสามารถกำหนดประเภท FloatCube แทน หรืออินไลน์ฟังก์ชันในโค้ดการวาดเส้นของคุณ หากคุณไม่ต้องการกำหนดประเภทอื่น
  • คุณสามารถปรับโค้ดให้เหมาะสมโดย inline cube_lerp จากนั้นคำนวณ B.x-A.x , B.x-A.y และ 1.0/N นอกลูป การคูณสามารถแปลงเป็นผลรวมซ้ำได้ ผลลัพธ์จะคล้ายกับอัลกอริทึมเส้น DDA
  • ฉันใช้พิกัดแกนหรือลูกบาศก์เพื่อวาดเส้น แต่ถ้าคุณต้องการทำงานกับพิกัดออฟเซ็ต ลองดูที่
  • มีตัวเลือกมากมายสำหรับการวาดเส้น บางครั้งจำเป็นต้อง "เคลือบทับ" ฉันถูกส่งโค้ดสำหรับการวาดเส้นที่มีเส้นปกคลุมเป็นพิเศษเป็นรูปหกเหลี่ยม แต่ฉันยังไม่ได้ตรวจสอบเลย

ระยะการเคลื่อนที่

พิกัดช่วง

เมื่อพิจารณาจากจุดศูนย์กลางรูปหกเหลี่ยมและช่วง N แล้วรูปหกเหลี่ยมใดอยู่ห่างจากจุดศูนย์กลาง N ขั้น

เราสามารถทำสิ่งที่ตรงกันข้ามจากสูตรระยะทางระหว่างรูปหกเหลี่ยม Distance = max(abs(dx), abs(dy), abs(dz)) ในการค้นหารูปหกเหลี่ยมทั้งหมดภายใน N เราต้องการ max(abs(dx), abs(dy), abs(dz)) ≤ N ซึ่งหมายความว่าจำเป็นต้องมีค่าทั้งสามค่า: abs(dx) ≤ N และ abs(dy) ≤ N และ abs(dz) ≤ N การลบค่าสัมบูรณ์เราจะได้ -N ≤ dx ≤ N และ -N ≤ dy ≤ N และ -N ≤ dz ≤ N ในโค้ดนี่จะเป็นลูปแบบซ้อน:

ผลลัพธ์ Var = สำหรับแต่ละ -N ≤ dx ≤ N: สำหรับแต่ละ -N ≤ dy ≤ N: สำหรับแต่ละ -N ≤ dz ≤ N: ถ้า dx + dy + dz = 0: results.append(cube_add(center, Cube(dx , dy, dz)))
วงจรนี้จะได้ผล แต่จะไม่ได้ผลเลยทีเดียว จากค่า dz ทั้งหมดที่เราวนซ้ำ มีเพียงค่าเดียวเท่านั้นที่ตรงตามเงื่อนไขคิวบ์ dx + dy + dz = 0 เราจะคำนวณค่า dz ที่ตรงตามเงื่อนไขแทน:

ผลลัพธ์ Var = สำหรับแต่ละ -N ≤ dx ≤ N: สำหรับแต่ละค่าสูงสุด (-N, -dx-N) ≤ dy ≤ นาที(N, -dx+N): var dz = -dx-dy results.append(cube_add( ศูนย์กลาง, คิวบ์(dx, dy, dz)))
วงจรนี้จะผ่านไปตามพิกัดที่ต้องการเท่านั้น ในรูปแต่ละช่วงจะเป็นเส้นคู่ แต่ละบรรทัดคือความไม่เท่าเทียมกัน เรานำรูปหกเหลี่ยมทั้งหมดที่ตอบสนองความไม่เท่าเทียมกันทั้งหก

กิฟ


ช่วงที่ทับซ้อนกัน

หากคุณต้องการค้นหารูปหกเหลี่ยมที่อยู่ในหลายช่วง คุณสามารถตัดกันในช่วงก่อนที่จะสร้างรายการรูปหกเหลี่ยมได้

คุณสามารถแก้ไขปัญหานี้ได้จากมุมมองของพีชคณิตหรือเรขาคณิต ในเชิงพีชคณิต แต่ละโดเมนจะแสดงเป็นเงื่อนไขความไม่เท่าเทียมกันในรูปแบบ -N ≤ dx ≤ N และเราจำเป็นต้องค้นหาจุดตัดของเงื่อนไขเหล่านี้ ในเชิงเรขาคณิต แต่ละขอบเขตจะเป็นลูกบาศก์ในอวกาศ 3 มิติ และเราจะตัดกันสองลูกบาศก์ในอวกาศ 3 มิติ เพื่อให้ได้ลูกบาศก์ในอวกาศ 3 มิติ จากนั้นเราฉายมันกลับลงบนระนาบ x + y + z = 0 เพื่อให้ได้รูปหกเหลี่ยม ผมจะแก้ปัญหานี้ด้วยพีชคณิต

อันดับแรก เราจะเขียนเงื่อนไข -N ≤ dx ≤ N ใหม่ในรูปแบบทั่วไป x min ≤ x ≤ x max และรับ x min = center.x - N และ x max = center.x + N ลองทำแบบเดียวกันกับ y และ z ผลลัพธ์ที่ได้ แบบฟอร์มทั่วไปรหัสจากส่วนก่อนหน้า:

ผลลัพธ์ Var = สำหรับแต่ละ xmin ≤ x ≤ xmax: สำหรับแต่ละค่า max(ymin, -x-zmax) ≤ y ≤ min(ymax, -x-zmin): var z = -x-y results.append(Cube(x, y, ซ))
จุดตัดของสองช่วง a ≤ x ≤ b และ c ≤ x ≤ d คือค่าสูงสุด(a, c) ≤ x ≤ min(b, d) เนื่องจากพื้นที่ของรูปหกเหลี่ยมแสดงเป็นช่วงบน x, ​​y, z เราจึงสามารถตัดกันแต่ละช่วงของ x, y, z แยกจากกัน จากนั้นใช้การวนซ้ำแบบซ้อนเพื่อสร้างรายการรูปหกเหลี่ยมในจุดตัด สำหรับพื้นที่หนึ่งของรูปหกเหลี่ยม เราใช้ x min = H.x - N และ x max = H.x + N ในทำนองเดียวกันสำหรับ y และ z . สำหรับจุดตัดของบริเวณหกเหลี่ยมสองแห่ง เราจะหา x min = max(H1.x - N, H2.x - N) และ x max = min(H1.x + N, H2.x + N) ในทำนองเดียวกันสำหรับ y และ z รูปแบบเดียวกันนี้ใช้ได้กับจุดตัดของพื้นที่สามแห่งขึ้นไป

กิฟ


อุปสรรค

หากมีสิ่งกีดขวาง วิธีที่ง่ายที่สุดคือเติมระยะทางให้เต็ม (ค้นหาความกว้างก่อน) ในรูปด้านล่าง เราจำกัดตัวเองไว้ที่สี่การเคลื่อนไหว ในโค้ด fringes[k] คืออาร์เรย์ของรูปหกเหลี่ยมทั้งหมดที่สามารถเข้าถึงได้ใน k ขั้นตอน แต่ละครั้งที่เราผ่านลูปหลัก เราจะขยายระดับ k-1 ทีละระดับ k

ฟังก์ชัน cube_reachable(start, movement): var visit = set() เพิ่ม start to visit var fringes = fringes.append() สำหรับแต่ละ 1< k ≤ movement: fringes.append() for each cube in fringes: for each 0 ≤ dir < 6: var neighbor = cube_neighbor(cube, dir) if neighbor not in visited, not blocked: add neighbor to visited fringes[k].append(neighbor) return visited

เลี้ยว

เมื่อพิจารณาจากเวกเตอร์รูปหกเหลี่ยม (ความแตกต่างระหว่างรูปหกเหลี่ยมสองรูป) เราอาจต้องหมุนเวกเตอร์เพื่อให้ชี้ไปที่รูปหกเหลี่ยมอีกอัน วิธีนี้ทำได้ง่ายๆ ด้วยพิกัดลูกบาศก์หากคุณหมุนวงกลม 1/6 วงกลม

การหมุนไปทางขวา 60° จะเลื่อนแต่ละพิกัดไปทางขวาหนึ่งตำแหน่ง:

[ x, y, z] ถึง [-z, -x, -y]
การหมุนไปทางซ้าย 60° จะย้ายแต่ละพิกัดไปทางซ้ายหนึ่งตำแหน่ง:

[ x, y, z] ถึง [-y, -z, -x]



“เมื่อเล่น” [ในบทความต้นฉบับ] ด้วยแผนภาพ คุณจะเห็นว่าการหมุนแต่ละครั้งเป็น 60° การเปลี่ยนแปลงสัญญาณและ "หมุน" พิกัดทางกายภาพ หลังจากหมุน 120° สัญญาณจะกลับมาเหมือนเดิมอีกครั้ง การหมุน 180° จะเปลี่ยนเครื่องหมาย แต่พิกัดจะกลับสู่ตำแหน่งเดิม

นี่คือลำดับการหมุนของตำแหน่ง P รอบตำแหน่งศูนย์กลาง C โดยสมบูรณ์ ซึ่งส่งผลให้ได้ตำแหน่ง R ใหม่:

  1. แปลงตำแหน่ง P และ C เป็นพิกัดลูกบาศก์
  2. คำนวณเวกเตอร์โดยการลบจุดศูนย์กลาง: P_from_C = P - C = Cube(P.x - C.x, P.y - C.y, P.z - C.z)
  3. หมุนเวกเตอร์ P_from_C ตามที่อธิบายไว้ข้างต้น และกำหนดเวกเตอร์สุดท้ายให้เป็นชื่อ R_from_C
  4. การแปลงเวกเตอร์กลับสู่ตำแหน่งโดยเพิ่มจุดศูนย์กลาง: R = R_from_C + C = Cube(R_from_C.x + C.x, R_from_C.y + C.y, R_from_C.z + C.z)
  5. แปลงตำแหน่งลูกบาศก์ R กลับเป็นระบบพิกัดที่ต้องการ
การเปลี่ยนแปลงมีหลายขั้นตอน แต่แต่ละขั้นตอนค่อนข้างง่าย คุณสามารถย่อขั้นตอนบางส่วนให้สั้นลงได้โดยการกำหนดการหมุนโดยตรงในพิกัดแนวแกน แต่เวกเตอร์ฐานสิบหกใช้ไม่ได้กับพิกัดออฟเซ็ต และฉันไม่รู้ว่าจะย่อขั้นตอนสำหรับพิกัดออฟเซ็ตให้สั้นลงได้อย่างไร ดูการอภิปรายเกี่ยวกับ stackexchange สำหรับวิธีอื่นในการคำนวณการหมุน

แหวน

แหวนธรรมดา

หากต้องการทราบว่ารูปหกเหลี่ยมที่ระบุเป็นของวงแหวนที่มีรัศมีที่กำหนดหรือไม่ คุณต้องคำนวณระยะห่างจากรูปหกเหลี่ยมนี้ถึงจุดศูนย์กลาง และค้นหาว่าเท่ากับรัศมีหรือไม่ หากต้องการดูรายการรูปหกเหลี่ยมทั้งหมด คุณจะต้องใช้รัศมีขั้นจากจุดศูนย์กลาง จากนั้นไปตามเวกเตอร์ที่หมุนไปตามเส้นทางไปตามวงแหวน

ฟังก์ชัน cube_ring(center, radius): var results = # รหัสนี้ใช้ไม่ได้กับรัศมี == 0; คุณเข้าใจไหมว่าทำไม? var cube = cube_add(center, cube_scale(cube_direction(4), radius)) สำหรับแต่ละ 0 ≤ i< 6: for each 0 ≤ j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
ในโค้ดนี้ คิวบ์เริ่มต้นบนวงแหวน ซึ่งแสดงด้วยลูกศรขนาดใหญ่จากตรงกลางถึงมุมของไดอะแกรม ฉันเลือกมุมที่ 4 เพื่อเริ่มต้นเพราะมันตรงกับเส้นทางที่ตัวเลขทิศทางของฉันกำลังเคลื่อนที่ คุณอาจต้องการมุมเริ่มต้นที่แตกต่างออกไป ในแต่ละขั้นของวงใน ลูกบาศก์จะเคลื่อนรูปหกเหลี่ยมไปรอบวงแหวนหนึ่งอัน หลังจากรัศมี 6 * ขั้น เขาก็สิ้นสุดที่จุดเริ่มต้น


แหวนเกลียว

เมื่อผ่านวงแหวนในรูปแบบเกลียวเราสามารถเติมส่วนด้านในของวงแหวนได้:

ฟังก์ชัน cube_spiral(center, radius): var results = สำหรับแต่ละรัศมี 1 ≤ k ≤: results = results + cube_ring(center, k) ส่งคืนผลลัพธ์



พื้นที่ของรูปหกเหลี่ยมขนาดใหญ่คือผลรวมของวงกลมทั้งหมดบวก 1 สำหรับจุดศูนย์กลาง ใช้สูตรนี้ในการคำนวณพื้นที่

การเคลื่อนที่ผ่านรูปหกเหลี่ยมด้วยวิธีนี้สามารถใช้เพื่อคำนวณช่วงการเคลื่อนที่ได้ (ดูด้านบน)

พื้นที่การมองเห็น

สิ่งที่มองเห็นได้จากตำแหน่งที่กำหนดในระยะทางที่กำหนด และไม่ถูกขัดขวางโดยสิ่งกีดขวาง? วิธีที่ง่ายที่สุดเพื่อกำหนดสิ่งนี้คือลากเส้นไปยังรูปหกเหลี่ยมแต่ละอันในช่วงที่กำหนด หากเส้นไม่ตรงกับผนัง คุณจะเห็นรูปหกเหลี่ยม เลื่อนเมาส์ไปเหนือรูปหกเหลี่ยม [ในแผนภาพในบทความต้นฉบับ] เพื่อดูว่าเส้นถูกลากไปยังรูปหกเหลี่ยมเหล่านี้และผนังที่เส้นมาบรรจบกันอย่างไร

อัลกอริธึมนี้อาจทำงานช้าในพื้นที่ขนาดใหญ่ แต่ใช้งานได้ง่าย ดังนั้นฉันขอแนะนำให้เริ่มต้นด้วย

กิฟ



การมองเห็นมีคำจำกัดความที่แตกต่างกันมากมาย คุณต้องการที่จะเห็นจุดศูนย์กลางของรูปหกเหลี่ยมอีกอันจากจุดศูนย์กลางของอันเดิมหรือไม่? คุณต้องการที่จะเห็นส่วนใดส่วนหนึ่งของรูปหกเหลี่ยมอื่นจากจุดศูนย์กลางของรูปเดิมหรือไม่? อาจมีส่วนใดส่วนหนึ่งของรูปหกเหลี่ยมอื่นจากจุดใดก็ได้ของจุดเริ่มแรกใช่หรือไม่ อุปสรรคที่ขัดขวางการมองเห็นของคุณมีขนาดเล็กกว่ารูปหกเหลี่ยมเต็มใช่ไหม? ขอบเขตเป็นแนวคิดที่ซับซ้อนและหลากหลายมากกว่าที่เห็นเมื่อมองแวบแรก เริ่มจากอัลกอริทึมที่ง่ายที่สุด แต่คาดหวังว่ามันจะคำนวณคำตอบในโครงการของคุณได้อย่างถูกต้องอย่างแน่นอน มีหลายกรณีที่อัลกอริธึมแบบธรรมดาให้ผลลัพธ์ที่ไร้เหตุผล

ฉันต้องการขยายคู่มือนี้ในอนาคต ฉันมี