البناء السداسي المنتظم - كيفية رسم مسدس. كيفية بناء مسدس منتظم كيفية رسم مسدس بقلم رصاص

هل هناك قلم رصاص بالقرب منك؟ ألقِ نظرة على مقطعه العرضي - إنه مسدس منتظم أو كما يطلق عليه أيضًا مسدس. المقطع العرضي للجوز، وحقل الشطرنج السداسي، وبعض جزيئات الكربون المعقدة (على سبيل المثال، الجرافيت)، وندفة الثلج، وقرص العسل وغيرها من الأشياء لها هذا الشكل أيضًا. تم اكتشاف مسدس منتظم عملاق مؤخرًا في عام 2011. ألا يبدو غريبًا أن الطبيعة تستخدم في كثير من الأحيان هياكل من هذا الشكل المعين في إبداعاتها؟ دعونا نلقي نظرة فاحصة.

السداسي المنتظم هو مضلع له ستة أضلاع متساوية وزوايا متساوية. ومن المقرر الدراسي نعلم أنه يتمتع بالخصائص التالية:

  • طول جوانبها يتوافق مع نصف قطر الدائرة المقيدة. من بين كل الأشكال، فإن الشكل السداسي المنتظم فقط هو الذي يمتلك هذه الخاصية.
  • الزوايا متساوية، وقياس كل منها 120 درجة.
  • يمكن إيجاد محيط الشكل السداسي باستخدام الصيغة P=6*R، إذا كان نصف قطر الدائرة الموصوفة حوله معروفًا، أو P=4*√(3)*r، إذا كانت الدائرة منقوشة فيه. R و r هما نصف قطر الدائرة المقيدة والمدرجة.
  • يتم تحديد المساحة التي يشغلها الشكل السداسي المنتظم كما يلي: S=(3*√(3)*R 2)/2. إذا كان نصف القطر غير معروف، فاستبدل بطول أحد الأضلاع - كما هو معروف، فهو يتوافق مع طول نصف قطر الدائرة المحددة.

يتميز السداسي العادي بميزة واحدة مثيرة للاهتمام، والتي بفضلها أصبح واسع الانتشار في الطبيعة - فهو قادر على ملء أي سطح من المستوى دون تداخلات أو فجوات. حتى أن هناك ما يسمى بال ليما، والذي بموجبه يكون السداسي المنتظم، الذي يساوي ضلعه 1/√(3)، غطاءً عالميًا، أي أنه يمكنه تغطية أي مجموعة بقطر وحدة واحدة .

الآن دعونا ننظر في بناء مسدس منتظم. هناك عدة طرق، أبسطها يتضمن استخدام البوصلة والقلم الرصاص والمسطرة. أولاً، نرسم دائرة عشوائية بالبوصلة، ثم نحدد نقطة في مكان عشوائي على هذه الدائرة. دون تغيير زاوية البوصلة، نضع رأس البوصلة عند هذه النقطة، ونحدد الثلم التالي على الدائرة، ونستمر في ذلك حتى نحصل على النقاط الست كلها. الآن كل ما تبقى هو ربطهم معًا بأجزاء مستقيمة، وستحصل على الشكل المطلوب.

في الممارسة العملية، هناك حالات عندما تحتاج إلى رسم مسدس كبير. على سبيل المثال، على سقف من الجبس ذو مستويين، حول موقع تركيب الثريا المركزية، تحتاج إلى تثبيت ستة مصابيح صغيرة في المستوى السفلي. سيكون من الصعب جدًا العثور على بوصلات بهذا الحجم. ماذا تفعل في هذه الحالة؟ كيف يمكنك حتى رسم دائرة كبيرة؟ بسيط جدا. عليك أن تأخذ خيطًا قويًا بالطول المطلوب وتربط أحد طرفيه مقابل قلم الرصاص. الآن كل ما تبقى هو العثور على مساعد يضغط على الطرف الثاني من الخيط حتى السقف عند النقطة المطلوبة. بالطبع، في هذه الحالة، تكون الأخطاء البسيطة ممكنة، لكن من غير المرجح أن تكون ملحوظة على الإطلاق لشخص غريب.

محتوى:

الشكل السداسي المنتظم، والذي يُسمى أيضًا السداسي المثالي، له ستة أضلاع متساوية وست زوايا متساوية. يمكنك رسم شكل سداسي باستخدام شريط قياس ومنقلة، أو شكل سداسي خشن بجسم مستدير ومسطرة، أو شكل سداسي أكثر خشونة باستخدام قلم رصاص وقليل من الحدس. إذا كنت تريد معرفة كيفية رسم شكل سداسي بطرق مختلفة، فما عليك سوى متابعة القراءة.

خطوات

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" على نصف الدائرة، وقسمها إلى ستة أقسام متساوية.نظرًا لأنك رسمت بالفعل خطًا في منتصف الدائرة، فيجب أن تكون علامة X أوسع من طولها حتى تكون الأجزاء متساوية. تخيل تقسيم البيتزا إلى ستة أجزاء.
  4. 4 اصنع مثلثات من كل قسم.للقيام بذلك، استخدم المسطرة لرسم خط مستقيم أسفل الجزء المنحني من كل قسم، وربطه بالخطين الآخرين لتشكيل مثلث. افعل ذلك مع الأقسام الخمسة المتبقية. فكر في الأمر مثل صنع قشرة حول شرائح البيتزا.
  5. 5 محو كافة الخطوط المساعدة.تتضمن الخطوط الإرشادية دائرتك، والخطوط الثلاثة التي قسمت دائرتك إلى أقسام، والعلامات الأخرى التي رسمتها على طول الطريق.

3 ارسم شكلًا سداسيًا خشنًا باستخدام قلم رصاص واحد

  1. 1 ارسم خطًا أفقيًا.لرسم خط مستقيم بدون مسطرة، ما عليك سوى رسم نقطة البداية والنهاية للخط الأفقي. ثم ضع القلم الرصاص عند نقطة البداية وارسم الخط حتى النهاية. يمكن أن يصل طول هذا الخط إلى بضعة سنتيمترات فقط.
  2. 2 ارسم خطين قطريين من طرفي الخط الأفقي.يجب أن يشير الخط القطري الموجود على الجانب الأيسر إلى الخارج بنفس طريقة الخط القطري الموجود على اليمين. يمكنك أن تتخيل أن هذه الخطوط تشكل زاوية قياسها 120 درجة بالنسبة للخط الأفقي.
  3. 3 ارسم خطين أفقيين آخرين قادمين من الخطوط الأفقية الأولى المرسومة إلى الداخل.سيؤدي هذا إلى إنشاء صورة معكوسة للخطين القطريين الأولين. يجب أن يكون الخط الأيسر السفلي انعكاسًا للخط الأيسر العلوي، ويجب أن يكون الخط الأيمن السفلي انعكاسًا للخط الأيمن العلوي. في حين أن الخطوط الأفقية العلوية يجب أن تنظر إلى الخارج، فإن الخطوط السفلية يجب أن تنظر إلى الداخل نحو القاعدة.
  4. 4 ارسم خطًا أفقيًا آخر يربط بين الخطين القطريين السفليين.بهذه الطريقة سوف ترسم قاعدة السداسي الخاص بك. من الناحية المثالية، يجب أن يكون هذا الخط موازيا للخط الأفقي العلوي. الآن لقد أكملت السداسي الخاص بك.
  • يجب أن يكون القلم الرصاص والبوصلة حادين لتقليل الأخطاء الناتجة عن العلامات الواسعة جدًا.
  • عند استخدام طريقة البوصلة، إذا قمت بتوصيل كل علامة بدلاً من العلامات الستة جميعها، فستحصل على مثلث متساوي الأضلاع.

تحذيرات

  • البوصلة جسم حاد إلى حد ما، كن حذرًا جدًا معها.

مبدأ التشغيل

  • ستساعدك كل طريقة على رسم شكل سداسي يتكون من ستة مثلثات متساوية الأضلاع نصف قطرها يساوي طول جميع جوانبها. أنصاف الأقطار الستة المرسومة لها نفس الطول وجميع الخطوط التي تشكل الشكل السداسي هي أيضًا نفس الطول، نظرًا لأن عرض البوصلة لم يتغير. وبما أن المثلثات الستة متساوية الأضلاع، فإن قياس الزوايا الواقعة بين رؤوسها 60 درجة.

ما سوف تحتاجه

  • ورق
  • قلم
  • مسطرة
  • زوج من البوصلات
  • شيء يمكن وضعه تحت الورقة لمنع إبرة البوصلة من الانزلاق.
  • ممحاة

يتم إنشاء مثلث محدد منتظم على النحو التالي(الشكل 38). من مركز دائرة نصف قطرها معينة ص 1 ارسم دائرة بنصف القطر ر2 = 2ر1 وتقسيمها إلى ثلاثة أجزاء متساوية. نقاط التقسيم أ، ب، ج هي رؤوس مثلث منتظم محاط بدائرة نصف قطرها ص 1 .

الشكل 38

رباعي منتظم مقيد (مربع)ويمكن بناؤها باستخدام البوصلة والمسطرة (الشكل 39). في دائرة معينة، يتم رسم قطرين متعامدين بشكل متبادل. بأخذ نقاط تقاطع الأقطار مع الدائرة كمراكز، نصف قطر الدائرة ر وصف الأقواس حتى تتقاطع مع بعضها البعض في النقاط ا ب ت ث . نقاط أ , ب , ج , د وهي رؤوس مربع محدد حول دائرة معينة.

الشكل 39

لبناء مسدس منتظم مقيدةمن الضروري أولاً بناء رؤوس المربع الموصوف بالطريقة الموضحة أعلاه (الشكل 40، أ). بالتزامن مع تحديد رؤوس المربع، يتم تحديد دائرة نصف قطرها ر مقسمة إلى ستة أجزاء متساوية عند النقاط 1, 2, 3, 4, 5, 6 وارسم الجوانب الرأسية للمربع. رسم دائرة من خلال نقاط التقسيم 2–5 و 3–6 خطوط مستقيمة حتى تتقاطع مع الجوانب الرأسية للمربع (الشكل 40، ب)، نحصل على القمم أ، ب، د، ه وصف مسدس منتظم.

الشكل 40

قمم أخرى جو Fيتم تحديده باستخدام قوس دائرة نصف القطر الزراعة العضوية.والتي يتم تنفيذها حتى تتقاطع مع استمرار القطر الرأسي لدائرة معينة.
3 أزواج

دعونا نتعلم كيفية رسم منشور سداسي في مواضع مختلفة.

دراسة الطرق المختلفة لبناء شكل سداسي منتظم، وعمل رسومات للأشكال السداسية، والتحقق من صحة بنائها. بناء المنشورات السداسية على أساس الأشكال السداسية.

النظر في المنشور السداسي في الشكل. 3.52 وإسقاطاته المتعامدة في الشكل 3.52. 3.53. عند قاعدة المنشور السداسي (السداسي) توجد أشكال سداسية منتظمة، والأوجه الجانبية مستطيلات متطابقة. من أجل تصوير مسدس بشكل صحيح في المنظور، يجب عليك أولا أن تتعلم كيفية تصوير قاعدته بشكل صحيح في المنظور (الشكل 3.54). في السداسي في الشكل. يتم تحديد القمم 3.55 بالأرقام من واحد إلى ستة. إذا قمت بتوصيل النقاط 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). تظهر طريقة فحص أخرى في الشكل. 3.64.

مسدس عمودي. في مثل هذا الشكل السداسي، يكون للخطوط المستقيمة التي تربط النقاط 7 و 3 و ب و 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 أ) من الجوانب الأفقية للمربع وبالتوازي معها. من خلال ربط النقطتين 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).

تُستخدم الشبكات السداسية (الشبكات السداسية) في بعض الألعاب، لكنها ليست بسيطة أو شائعة مثل الشبكات المستطيلة. لقد قمت بجمع الموارد حول الشبكات السداسية منذ ما يقرب من 20 عامًا، وكتبت هذا الدليل لأكثر الأساليب أناقة، والتي يتم تنفيذها بأبسط التعليمات البرمجية. تستخدم هذه المقالة على نطاق واسع أدلة تشارلز فو وكلارك فيربروج. سأصف الطرق المختلفة لإنشاء شبكات سداسية وعلاقاتها والخوارزميات الأكثر شيوعًا. العديد من أجزاء هذه المقالة تفاعلية: يؤدي تحديد نوع الشبكة إلى تغيير المخططات والتعليمات البرمجية والنصوص المقابلة. (ملاحظة لكل: هذا ينطبق فقط على الأصل، أنصحك بدراسته. في الترجمة، يتم الاحتفاظ بجميع المعلومات الخاصة بالأصل، ولكن دون تفاعل.).

تمت كتابة أمثلة التعليمات البرمجية الموجودة في المقالة برمز زائف، لذا فهي أسهل في القراءة والفهم من أجل كتابة التنفيذ الخاص بك.

الهندسة

السداسيات هي مضلعات ذات ستة جوانب. الأشكال السداسية المنتظمة لها جميع الجوانب (الحواف) بنفس الطول. سنعمل فقط مع الأشكال السداسية العادية. عادةً، تستخدم الشبكات السداسية اتجاهات أفقية (قمة مدببة) ورأسية (قمة مسطحة).


أشكال سداسية ذات قمم مسطحة (يسار) وحادة (يمين).

السداسيات لها 6 وجوه. كل وجه مشترك بين شكلين سداسيين. السداسيات لديها 6 نقاط ركنية. كل نقطة زاوية مشتركة بين ثلاثة أشكال سداسية. يمكنك قراءة المزيد عن المراكز والحواف ونقاط الزوايا في مقالتي عن أجزاء الشبكة (المربعات والأشكال السداسية والمثلثات).

الزوايا

في الشكل السداسي المنتظم، قياس الزوايا الداخلية هو 120 درجة. هناك ستة "أسافين"، كل منها عبارة عن مثلث متساوي الأضلاع بزوايا داخلية تبلغ 60 درجة. نقطة الزاوية أنايقع على مسافة (60°*i)+30° بوحدات الحجم من مركز المركز. في الكود:

الوظيفة hex_corner(center, size, i): var angle_deg = 60 * i + 30 var angle_rad = PI / 180 * angle_deg نقطة الإرجاع (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 درجة.


زوايا سداسية ذات قمم مسطحة وحادة

الحجم والموقع

الآن نريد وضع عدة أشكال سداسية معًا. في الاتجاه الأفقي، ارتفاع الشكل السداسي هو height = size * 2 . المسافة الرأسية بين الأشكال السداسية المتجاورة هي vert = الارتفاع * 3/4.

عرض السداسي width = sqrt(3)/2 * height . المسافة الأفقية بين الأشكال السداسية المتجاورة هي الأفق = العرض .

تستخدم بعض الألعاب فن البكسل للأشكال السداسية، وهو ما لا يتطابق تمامًا مع الأشكال السداسية العادية. لن تتطابق صيغ الزاوية والموضع الموضحة في هذا القسم مع أبعاد هذه الأشكال السداسية. تنطبق بقية المقالة التي تصف خوارزميات الشبكة السداسية حتى لو كانت الأشكال السداسية ممتدة أو مضغوطة قليلاً.



نظم الإحداثيات

لنبدأ بتجميع الأشكال السداسية في شبكة. في حالة شبكات المربعات، هناك طريقة واحدة واضحة للتجميع. بالنسبة للأشكال السداسية، هناك العديد من الطرق. أوصي باستخدام الإحداثيات المكعبة كتمثيل أساسي. يجب استخدام الإحداثيات المحورية أو إحداثيات الإزاحة لتخزين الخرائط وعرض الإحداثيات للمستخدم.

إحداثيات الإزاحة

الأسلوب الأكثر شيوعاً هو إزاحة كل عمود أو صف لاحق. يتم تعيين الأعمدة بعمود أو 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. لقد عرضت نظامًا واحدًا فقط من بين العديد من الأنظمة. يمكنك أيضًا إنشاء إحداثيات مكعبة باستخدام xy-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): # محوري 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) في وقت الترجمة:

الاتجاهات المتغيرة = [ Cube(+1, -1, 0), Cube(+1, 0, -1), Cube(0, +1, -1), Cube(-1, +1, 0), Cube( -1, 0, +1), Cube(0, -1, +1) ] وظيفة cube_direction(direction): إرجاع الاتجاهات وظيفة cube_neighbor(hex, Direction): إرجاع cube_add(hex, cube_direction(direction))

الإحداثيات المحورية

كما في السابق، نستخدم النظام المكعب في البداية. لنأخذ الجدول Cube(dx, dy, dz) ونحوله إلى الجدول Hex(dq, dr):

اتجاهات متغيرة = [ Hex(+1, 0)، Hex(+1, -1)، Hex(0, -1)، Hex(-1, 0)، Hex(-1, +1)، Hex(0, +1)] وظيفة hex_direction(direction): إرجاع الاتجاهات وظيفة hex_neighbor(hex, Direction): var dir = hex_direction(direction) return Hex(hex.q + dir.q, hex.r + dir.r)

إحداثيات الإزاحة

في الإحداثيات المحورية، نقوم بإجراء تغييرات اعتمادًا على مكان تواجدنا على الشبكة. إذا كنا في عمود/صف إزاحة، فإن القاعدة تختلف عن حالة العمود/الصف بدون إزاحة.

كما في السابق، قمنا بإنشاء جدول بالأرقام التي يجب إضافتها إلى العمود والصف. ومع ذلك، هذه المرة سيكون لدينا مصفوفتان، واحدة للأعمدة/الصفوف الفردية والأخرى للأعمدة/الصفوف الزوجية. انظر إلى (1،1) في صورة خريطة الشبكة أعلاه ولاحظ كيف يتغير العمود والصف أثناء تحركك في كل اتجاه من الاتجاهات الستة. الآن دعونا نكرر العملية لـ (2,2) . ستكون الجداول والأكواد مختلفة لكل نوع من الأنواع الأربعة لشبكات الإزاحة، وإليك الكود المقابل لكل نوع من أنواع الشبكة.

غريب ص
اتجاهات فار = [ [ 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, Direction): var parity = hex.row & 1 var dir = الاتجاهات return Hex(hex.col + dir.col, hex.row + dir.row)


حتى ص
اتجاهات فار = [ [ سداسي عشري (+1، 0)، سداسي عشري (+1، -1)، سداسي عشري (0، -1)، سداسي عشري (-1، 0)، سداسي عشري (0، +1)، سداسي عشري (+1) ، +1) ]، [ سداسي عشري(+1، 0)، سداسي عشري(0، -1)، سداسي عشري(-1، -1)، سداسي عشري(-1، 0)، سداسي عشري(-1، +1)، سداسي عشري (0, +1) ] ] الدالة offset_neighbor(hex, Direction): var parity = hex.row & 1 var dir = الاتجاهات return Hex(hex.col + dir.col, hex.row + dir.row)


شبكة للصفوف الزوجية (EVEN) والفردية (ODD).

غريب س
اتجاهات فار = [ [ سداسي عشري (+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, Direction): var parity = hex.col & 1 var dir = الاتجاهات return Hex(hex.col + dir.col, hex.row + dir.row)


حتى س
اتجاهات فار = [ [ سداسي عشري(+1، +1)، سداسي عشري(+1، 0)، سداسي عشري(0، -1)، سداسي عشري(-1، 0)، سداسي عشري(-1، +1)، سداسي عشري(0) ، +1) ]، [ سداسي عشري(+1، 0)، سداسي عشري(+1، -1)، سداسي عشري(0، -1)، سداسي عشري(-1، -1)، سداسي عشري(-1، 0)، سداسي عشري (0, +1) ] ] الدالة offset_neighbor(hex, Direction): var parity = hex.col & 1 var dir = الاتجاهات return 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, Direction): إرجاع cube_add(hex, Diagonals)
وكما في السابق، يمكننا تحويل هذه الإحداثيات إلى إحداثيات محورية بإسقاط أحد الإحداثيات الثلاثة، أو تحويلها إلى إحداثيات إزاحة عن طريق حساب النتائج أولاً.


المسافات

الإحداثيات المكعبة

في نظام الإحداثيات المكعب، كل شكل سداسي هو مكعب في الفضاء ثلاثي الأبعاد. تكون الأشكال السداسية المتجاورة متباعدة بمقدار 1 في الشبكة السداسية، ولكنها متباعدة بمقدار 2 في الشبكة المكعبة. وهذا يجعل حساب المسافات أمرًا بسيطًا. في شبكة من المربعات، مسافات مانهاتن هي abs(dx) + abs(dy) . في شبكة من المكعبات، مسافات مانهاتن هي abs(dx) + abs(dy) + abs(dz) . المسافة في الشبكة السداسية تساوي نصفها:

وظيفة cube_distance(a, b): العودة (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))
في الشكل، يتم تمييز القيم القصوى بالألوان. لاحظ أيضًا أن كل لون يمثل أحد الاتجاهات الستة "القطرية".

GIF


الإحداثيات المحورية

في النظام المحوري، يتم التعبير عن الإحداثي الثالث ضمنا. دعونا نحول من المحوري إلى المكعب لحساب المسافة:

الدالة hex_distance(a, b): var ac = hex_to_cube(a) var bc = hex_to_cube(b) return cube_distance(ac, bc)
إذا كان المترجم مضمنًا (مضمنًا) hex_to_cube وcube_distance في حالتك، فسوف يقوم بإنشاء رمز مثل هذا:

الوظيفة hex_distance(a, b): العودة (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) return cube_distance(ac, bc)
سنستخدم نفس النمط للعديد من الخوارزميات: التحويل من الأشكال السداسية إلى المكعبات، وتشغيل النسخة المكعبة من الخوارزمية، وتحويل النتائج المكعبة إلى إحداثيات سداسية (الإحداثيات المحورية أو الإزاحة).

خطوط الرسم

كيفية رسم خط من مسدس إلى آخر؟ أنا أستخدم الاستيفاء الخطي لرسم الخطوط. يتم أخذ عينات من الخط بشكل موحد عند نقاط N + 1 ويتم حساب الأشكال السداسية التي توجد بها هذه العينات.

GIF


  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): // للأشكال السداسية return 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" (1e-6، 1e-6، -2e-6) إلى إحدى نقطتي النهاية أو كلتيهما قبل بدء الحلقة. سيؤدي هذا إلى "دفع" الخط في اتجاه واحد حتى لا يصل إلى الحواف.
  • تعادل خوارزمية خط DDA في الشبكات المربعة N إلى أقصى مسافة على طول كل محور. نحن نفعل الشيء نفسه في الفضاء المكعب، وهو ما يشبه المسافة في الشبكة السداسية.
  • يجب أن تقوم الدالة cube_lerp بإرجاع مكعب بإحداثيات عائمة. إذا كنت تقوم بالبرمجة بلغة مكتوبة بشكل ثابت، فلن تتمكن من استخدام النوع المكعب. يمكنك تحديد نوع FloatCube بدلاً من ذلك، أو تضمين وظيفة في كود رسم الخط الخاص بك إذا كنت لا تريد تحديد نوع آخر.
  • يمكنك تحسين الكود عن طريق 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 ، دي، دي زد)))
ستعمل هذه الدورة، لكنها ستكون غير فعالة تماما. من بين جميع قيم dz التي نمر بها، هناك واحدة فقط تلبي شرط المكعب dx + dy + dz = 0. بدلًا من ذلك، سنحسب مباشرة قيمة dz التي تحقق الشرط:

نتائج فار = لكل -N ≥ dx ≥ N: لكل max(-N, -dx-N) ≥ dy ≥ min(N, -dx+N): var dz = -dx-dy results.append(cube_add( المركز، المكعب (dx، dy، dz)))
تمر هذه الدورة فقط على طول الإحداثيات المطلوبة. في الشكل، كل نطاق عبارة عن زوج من الخطوط. كل سطر هو عدم المساواة. نحن نأخذ جميع الأشكال السداسية التي تحقق المتباينات الستة.

GIF


نطاقات متداخلة

إذا كنت تريد العثور على أشكال سداسية موجودة في نطاقات متعددة، فيمكنك تقاطع النطاقات قبل إنشاء قائمة من الأشكال السداسية.

يمكنك التعامل مع هذه المشكلة من وجهة نظر الجبر أو الهندسة. جبريًا، يتم التعبير عن كل منطقة كشروط عدم المساواة بالصيغة -N ≥ dx ≥ N ، ونحتاج إلى إيجاد تقاطع هذه الشروط. هندسياً، كل منطقة عبارة عن مكعب في الفضاء ثلاثي الأبعاد، وسوف نقوم بتقاطع مكعبين في الفضاء ثلاثي الأبعاد للحصول على مكعب في الفضاء ثلاثي الأبعاد. ثم نسقطه مرة أخرى على المستوى x + y + z = 0 للحصول على الأشكال السداسية. سأحل هذه المشكلة جبريا.

أولاً، نعيد كتابة الشرط -N ≥ dx ≥ N في الصيغة الأكثر عمومية x min ≥ x ≥ x max ، ونأخذ x min = center.x - N و x max = center.x + N . لنفعل الشيء نفسه بالنسبة لـ y وz، مما يؤدي إلى الشكل العام للكود من القسم السابق:

نتائج فار = لكل 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 هو max(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 و ض . يعمل نفس النمط على تقاطع ثلاث مناطق أو أكثر.

GIF


عوائق

إذا كانت هناك عوائق، فإن أسهل طريقة هي ملء حدود المسافة (بحث العرض أولاً). في الشكل أدناه نقتصر على أربع خطوات. في الكود، هامش[k] عبارة عن مصفوفة من جميع الأشكال السداسية التي يمكن الوصول إليها بخطوات k. في كل مرة نمر فيها عبر الحلقة الرئيسية، نقوم بتوسيع المستوى k-1 إلى المستوى k.

الدالة cube_reachable (البدء، الحركة): var تمت زيارتها = set() أضف البداية إلى var franches التي تمت زيارتها = fris.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 مرة أخرى إلى نظام الإحداثيات المطلوب.
هناك عدة مراحل للتحول، ولكن كل منها بسيط للغاية. من الممكن تقصير بعض هذه الخطوات عن طريق تحديد التدوير مباشرة في الإحداثيات المحورية، لكن المتجهات السداسية لا تعمل مع إحداثيات الإزاحة، ولا أعرف كيفية تقصير خطوات إحداثيات الإزاحة. راجع أيضًا المناقشة حول تبادل المكدس للتعرف على طرق أخرى لحساب التدوير.

خواتم

حلقة بسيطة

لمعرفة ما إذا كان مسدس معين ينتمي إلى حلقة ذات نصف قطر معين، تحتاج إلى حساب المسافة من هذا السداسي إلى المركز، ومعرفة ما إذا كان يساوي نصف القطر. للحصول على قائمة بجميع هذه الأشكال السداسية، عليك أن تتخذ خطوات نصف القطر من المركز، ثم تتبع المتجهات الدائرية على طول المسار على طول الحلقة.

وظيفة cube_ring(center, radius): var results = # هذا الكود لا يعمل مع radius == 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 (المركز، نصف القطر): نتائج var = لكل 1 ≥ k ≥ نصف القطر: النتائج = النتائج + cube_ring (المركز، k) تُرجع النتائج



مساحة الشكل السداسي الكبير هي مجموع جميع الدوائر بالإضافة إلى 1 للمركز. استخدم هذه الصيغة لحساب المساحة.

يمكن أيضًا استخدام عبور الأشكال السداسية بهذه الطريقة لحساب نطاق الحركة (انظر أعلاه).

مجال الرؤية

ما هو الشيء الذي يمكن رؤيته من موضع معين وعلى مسافة معينة ولا تحجبه العوائق؟ إن أبسط طريقة لتحديد ذلك هي رسم خط لكل شكل سداسي في نطاق معين. إذا كان الخط لا يلتقي بالجدران، فإنك ترى شكلًا سداسيًا. حرك مؤشر الفأرة فوق الأشكال السداسية [على الرسم البياني في المقالة الأصلية] لترى كيف يتم رسم الخطوط على هذه الأشكال السداسية والجدران التي تلتقي بها الخطوط.

يمكن أن تكون هذه الخوارزمية بطيئة في مساحات كبيرة، ولكن من السهل تنفيذها، لذا أوصي بالبدء بها.

GIF



هناك العديد من التعريفات المختلفة للرؤية. هل تريد رؤية مركز مسدس آخر من مركز الشكل الأصلي؟ هل تريد رؤية أي جزء من شكل سداسي آخر من مركز الشكل الأصلي؟ ربما أي جزء من مسدس آخر من أي نقطة في الشكل الأولي؟ العوائق التي تعيق رؤيتك أصغر من الشكل السداسي الكامل؟ النطاق هو مفهوم أكثر تعقيدًا وتنوعًا مما يبدو للوهلة الأولى. لنبدأ بأبسط خوارزمية، لكن توقع أنها ستحسب الإجابة بشكل صحيح في مشروعك. بل إن هناك حالات تنتج فيها خوارزمية بسيطة نتائج غير منطقية.

أريد توسيع هذا الدليل في المستقبل. أملك