كيف أنشأت خرائط للقارات للعبة

الصورة

الجزء 1. SVG وتنسيق النظم


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

العالم مساحة كبيرة. لا تشبه معظم بطاقات "العالم" الخيالية الحجم الحقيقي. خذ ، على سبيل المثال ، ميدل إيرث ، حيث يتم عمل سيد الخواتم:


على الرغم من أنه يبدو أنه تم التقاط عالم ضخم عليه ، في الواقع ، تم إنشاء ميدل إيرث على أساس أوروبا.


أي أن الخريطة الحقيقية لـ "العالم" لعالم تولكين ستكون أكبر بحوالي 50 مرة من خريطة الأرض الوسطى (!). في الواقع ، تعكس معظم خرائط العالم الخيالية التي رأيتها منطقة بحجم قارة:


يبدو أن هذه هي أكبر منطقة يتم تصورها بشكل جيد في نمط بطاقة الخيال.

أي أن مهمة توليد "خرائط العالم" الحقيقية ربما تكون طموحة للغاية. من الأفضل أن تهدف إلى إنشاء خريطة للقارة (أو جزء من القارة). (ومع ذلك ، لا يزال من الملائم أكثر اعتبار البطاقة بحجم "العالم"). فما هو حجم البطاقة؟ إذا كانت بطاقات Dragons Abound الحالية بحجم "شبه قاري" ، فيمكننا أن نفترض أنك بحاجة إلى إنشاء بطاقات أكبر من 8 إلى 10 مرات.

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

بادئ ذي بدء ، يتم حاليًا إنشاء "عالم" الخريطة الإقليمية داخل مربع وحدة. تحتوي كل خريطة إقليمية على إحداثيات من (-0.5 ، -0.5) إلى (0.5 ، 0.5) ، والأصل (0،0) يقع في منتصف المنطقة.


أحد الشذوذ هنا هو أن المحور ص مقلوب مقارنة بما درسناه في هندسة المدرسة. -0.5 في أعلى الخريطة ، و 0.5 في الجزء السفلي. في رسومات الكمبيوتر ، غالبًا ما يتم قلب المحور Y. سمعت أن هذا يفسر بالطريقة التي أجرت بها الشاشات الأولى (أجهزة التلفاز) مسحًا من الأعلى إلى الأسفل ، أي أن خط المسح الأول كان في الأعلى ، وما يليه مباشرة ، وهكذا ، أي أن الفهرس Y لخطوط المسح تغير من صفر في الأعلى إلى بعض الأرقام الموجبة بالأسفل. مع ذلك ، يتم استخدام نفس نظام الإحداثيات بتنسيق SVG (Scalable Vector Graphics) ، وهذا هو السبب في أن Dragons Abound أيضًا.

نظام الإحداثيات هذا مستقل عن كيفية عرض الخريطة. هذا مجرد نظام بلا أبعاد لخلق العالم - تقع المدينة في (0.12875 ، -0.223) ، وتتجاوز الحدود من (0.337 ، 0.010) إلى (0.333 ، 0.017) ، وما إلى ذلك. وعلى الرغم من أن خرائطي الإقليمية الحالية تقتصر على نطاق من 0.5 إلى -0.5 ، فإن هذا ليس الحد الأقصى لنظام الإحداثيات. يمكنني إنشاء عالم يتجاوز هذه الحدود.

نظام الإحداثيات التالي هو ما يطلق عليه SVG مربع العرض. يقوم بتعيين الإحداثيات الحقيقية التي سيتم استخدامها لرسم الرسومات. على سبيل المثال ، يقوم Dragons Abound في البداية بتعيين مربع العرض إلى الإحداثيات (-500 ، -500) ويبلغ عرضه 1000 وارتفاعه 1000:


(يوجد خطأ مطبعي في الصورة ، يجب أن يكون الجزء العلوي من المحور ص -500 ، آسف.)

قد تلاحظ في هذه الحالة أن التحول بين نظام الإحداثيات الأول والثاني يتكون فقط من ضرب الكل في 1000. هذا هو. من أجل رسم شيء ما ، تجد اللعبة إحداثيات هذا الكائن ، وتضربهم في 1000 ، وترسم SVG في هذه الإحداثيات.

بمعنى ، يمكنني استخدام إحداثيات مربع العرض للسماح لي برسم خط من (0 ، 0) إلى (250 ، 250). ولكن في الحقيقة ، لا أريد رسم خط من (0 ، 0) إلى (250 ، 250) على شاشة الكمبيوتر. هذا يعني أنه إذا أردت عرض الخريطة في نقطة أخرى على الشاشة ، فسيتعين علي تغيير إحداثيات جميع كائنات الخريطة وإعادة رسمها. هذه ستكون مهمة ضخمة

للتحكم في إحداثيات عرض الرسومات على الشاشة ، يحتوي SVG على نظام إحداثي ثالث يسمى إطار العرض. إطار العرض هو ذلك الجزء من الصفحة الذي يجب رسم الرسومات فيه (على صفحة الويب ، هذا هو العنصر <svg>). لها عرض وارتفاع وموقع. الموقع هو إحداثيات الزاوية اليسرى العليا من إطار العرض. أي أنه إذا عرضت الخريطة في إطار العرض بإحداثيات (30 ، 100) ، يبلغ ارتفاعها وعرضها 800 ، فسيبدو نظام إحداثيات إطار العرض على النحو التالي:


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

لتلخيص: مدينة تقع في إحداثيات العالم (0.10 ، 0.33) يتم رسمها في إحداثيات (100 ، 330) وعرضها على الشاشة في (110 ، 764).

الآن يمكنك أن تفهم لماذا يمكن أن يكون هذا مربكًا!

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


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

ماذا يحدث إذا ضاعفت حجم صندوق العرض؟ حسنًا ، إذا قمت أيضًا بمضاعفة النسبة بين SC الأول وصندوق العرض (من 1000 إلى 2000) ، فلن يتغير شيء كثيرًا. إذا ظلت النسبة مساوية لـ 1000 ، فسيتم تخفيض الخريطة إلى النصف مرة أخرى.


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

والعكس صحيح ، إذا قمت بتقليل حجم مربع العرض بمقدار النصف ، فسيؤدي ذلك إلى إنشاء تأثير تكبير الخريطة:


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

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


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


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


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

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

الجزء 2. جعل البطاقات دائمة


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

من الواضح أن مشكلة وضع الأسماء ، التي وصفتها في الجزء السابق ، ملحوظة في هذين النوعين من بطاقة واحدة:


هنا هو نفس العالم ، يتم تغيير العرض فقط إلى اليسار:


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

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

بعد إزالة هذه المشكلة ، تظل الأسماء الموجودة على البطاقتين ثابتة:


و:


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

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

الآن دعنا أربعة أضعاف حجم الخريطة وإظهار ربعها فقط في نافذة الخريطة:


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

إليك نفس البطاقة بعد إصلاح المشكلة:


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


الآن الصورة أكثر منطقية. على اليمين ، بالكاد يكون مرئيًا على الخريطة ، لكن التسمية لا تزال موجودة حيث تكون مرئية.

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

سيكون من المنطقي قياس عدد المواقع وفقًا لحجم الخريطة ، ولكن للأسف ، فإن اعتماد سرعة تنفيذ Dragons Abound على عدد المواقع أسوأ بكثير من الخطية ، أي أن إنشاء خريطة بعدد كبير من المواقع يمكن أن يستغرق الكثير من الوقت. فيما يلي مثال لبطاقة ذات دقة رباعية (عدد المواقع):


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

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


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


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

أفضل حل هو حفظ SVG نفسه بحيث يمكن فتحه في برنامج مثل Inkscape.

اعتدت أن أكون قادرًا على قص ولصق خرائط SVG في Inkscape ، ولكن SVGs لخرائط العالم كبيرة جدًا لدرجة أنني عندما أحاول قطع أعطال المتصفح! لحسن الحظ ، وجدت FileSaver.js ويمكنك استخدامه لحفظ ملف SVG مباشرةً في ملف ، ثم فتحه في Inkscape ، وبالتالي إنشاء صورة كبيرة جدًا.

على الأقل نظريا. عندما أحاول فتح هذه الخرائط في Inkscape ، أواجه بعض المشاكل.

المشكلة الأولى هي أن افتراضات Inkscape تختلف عن افتراضات Chrome و Firefox في كيفية فتح SVG. على وجه الخصوص ، إذا لم يتم تحديد لون التعبئة في المسار ، فإن المتصفحات تفترض عدم وجود تعبئة ؛ يفترض إنكسكيب أن المخطط مليء باللون الأسود. لذلك ، عندما أقوم بفتح ملف SVG المحفوظ في Inkscape ، يكون لونه أسود بالكامل تقريبًا ، لأن الطبقة العليا من الخريطة لا تحتوي على لون تعبئة. يمكن إصلاح ذلك عن طريق تحديد "تعبئة: لا شيء" في الأماكن الضرورية بحيث تظهر المخططات بشكل متساوٍ في كل من المتصفح و Inkscape.

المشكلة الثانية هي أن إنكسكيب بها أخطاء في معالجة الأقنعة. يبدو أن Inkscape ينشئ أقنعة بعنصر واحد فقط ، ويعالج الأقنعة بعناصر متعددة بشكل سيئ. ينشئ Dragons Abound العديد من الأقنعة بعناصر عديدة. يمكنك التغلب على هذه المشكلة عن طريق تجميع كل عناصر قناع اللعبة في عنصر مجموعة (اختياري) واحد.

تتعلق المشكلة الثالثة بالصور والموارد الأخرى القابلة للتنزيل. في ملف SVG الأصلي ، يشار إلى الإشارات إليها في شكل نسبي ، على سبيل المثال ، "images / background0.png". يتم ترتيب مصادري بطريقة تمكن خادم الويب المنفصل الذي أستخدمه من العثور على هذه الموارد في الأماكن المحددة. عندما آخذ نفس SVG وفتحه في Inkscape ، يتم التعامل مع هذه المسارات النسبية على أنها "ملف:" URL ويبحث Inkscape عن الموارد المتعلقة بالمجلد حيث تم حفظ SVG. يمكن التحايل على هذه المشكلة بسهولة عن طريق حفظ SVG في مجلد توجد فيه بالفعل موارد في الأماكن الصحيحة ؛ يمكن أن يكون نفس المجلد الجذر الذي يستخدمه خادم الويب ، أو مكان آخر توجد فيه نسخ من الموارد على نفس المسارات (النسبية).

المشكلة الرابعة هي الخطوط. يستخدم Dragons Abound كل من خطوط الويب والخطوط المخزنة محليًا ؛ سواء بتنسيق WOFF2. في المتصفح ، يتم تطبيقها على النص باستخدام نمط عائلة خطوط CSS ، وقبل إنشاء الخريطة ، يتم تحميل جميع الخطوط الممكنة إلى صفحة الويب لتكون جاهزة للاستخدام. عندما يتم فتح الملف نفسه في اللعبة ، فإنه يبحث عن الخطوط في دليل خطوط النظام ، ويبدو أنه لا يمكن تحديد دليل خطوط آخر بأي شكل من الأشكال. الحل البسيط (على الأقل على الجهاز الذي أقوم بتطويره) هو تثبيت الخطوط التي تستخدمها اللعبة في دليل خطوط النظام. ومع ذلك ، فإنه ليس بهذه البساطة كما يبدو ، لأنه يجب أن تتطابق أسماء الخطوط ، وفي Windows لا توجد طرق سهلة لتغيير اسم الخط. ولكن ، بالطبع ، لن يعمل هذا المخطط على أجهزة الكمبيوتر التي لم يتم تثبيت جميع الخطوط الضرورية عليها. الحل الأكثر سهولة هو تضمين خطوط SVG في الخرائط . سيكون هذا على قائمة TODO الخاصة بي.

في النهاية ، جئت إلى واجهة إنشاء الخرائط هذه:


تحدد حقول الإدخال الموسعة الحجم الإجمالي للعالم ، حيث 1x1 هو حجم خرائط المصدر. يحدد حجم vbx (مربع العرض) حجم جزء من العالم المعروض على الخريطة ؛ في لقطة الشاشة ، تحتوي أيضًا على قيمة 1x1 ، أي أن الخريطة ستعرض العالم كله. تحدد حقول مركز vbx موقع مركز الخريطة في العالم ؛ 0 ، 0 هي مركز العالم. أخيرًا ، تحدد معلمات SVG عدد وحدات بكسل الشاشة لكل وحدة حجم مربع عرض واحد ؛ بقيمة 775 ، سيتم عرض خريطة 1x1 على الشاشة بحجم 775x775 بكسل. هذا مناسب عندما أقوم بإنشاء خريطة كبيرة جدًا. من خلال تعيين المعلمة على قيمة منخفضة (على سبيل المثال ، 150 بكسل) ، يمكنني احتواء خريطة كبيرة على الشاشة ككل.

من خلال تغيير هذه المعلمات الستة ، يمكنني التحكم في حجم العالم وجزء من العالم المعروض على الخريطة. يعمل زر الإنشاء تمامًا كما قد تخمن ؛ يعرض زر العرض ببساطة جزءًا من العالم ، أي أنه يمكنني إنشاء عالم ، ثم عرض أجزائه الفردية ، وتغيير معلمات مربع العرض دون الحاجة إلى إعادة توليد العالم. (يقوم المبرمج بتنفيذ ذلك بشكل أفضل مثل التحجيم والتمرير). يحفظ الزر حفظ PNG الخريطة المرئية كملف PNG ؛ يحفظ الزر حفظ SVG ملف SVG للخريطة بأكملها. يتم استخدام الزر Test It لتشغيل رمز الاختبار ، والذي يتغير أثناء تطوير الوظائف المختلفة.

الآن بعد أن تمكنت من إنشاء جميع أنحاء العالم الكبير وعكسها ، يمكنني الانتقال إلى تكييف شكل الأرض مع خرائط أكبر.

الجزء 3. أشكال السوشي


بعد إجراء تغييرات مختلفة في الجزء السابق ، يمكنني الآن إنشاء عوالم أكبر بكثير من العوالم السابقة (حتى 8 مرات أكثر) وحفظها كصور رسومية كبيرة:


(افتح الصورة في نافذة منفصلة لرؤية الخريطة بدقة كاملة 4800 × 2400 في فليكر.)

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


هذه البطاقة هي مجرد فوضى من الجزر وجبن السوشي السويسري.

هنا مثال آخر ، شيء بين البطاقتين السابقتين. إنها ليست واقعية تمامًا ، ولكنها قد تكون مثيرة للاهتمام لمحيط الخيال:


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

معظم خرائط العالم الخيالية التي رأيتها تمثل قارة جزيرة كبيرة (مع جزر صغيرة حولها) ، على سبيل المثال ، مثل خريطة Andelen هذه:


أو شبه جزيرة القارة ، كما في خريطة أنغورون :


من وقت لآخر ، تتكون الخريطة بالكامل من الأرض أو عدة قارات جزيرة ، ولكن من المرجح أن تكون استثناءات للقاعدة.

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


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


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


يمكن تصحيح ذلك بسهولة عن طريق إخفاء السوشي بدلاً من دائرة بقطع ناقص (مشوه) ، يتم التقاطه وفقًا لحجم الخريطة:


يتم تحجيم هذه الجزر المركزية لملء الخريطة ، ولكن في كثير من الحالات للخرائط القارية ، نحتاج إلى ترك "حدود" حول القارة. تتحكم معلمتان في حجم الخريطة التي تملأ الجزيرة على طول محوري X و Y.


هذا هو نفس نظام إدارة الحدود مع المزيد من التشوهات المنطقية:


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

ربما لاحظ القارئ اليقظ الذي درس الخريطة السابقة أن أنماط المحيط والأرض تتوقف في منتصف الخريطة.في السابق ، كان لدي خرائط بحجم 1x1 فقط ، لذلك تم تكييف أحجام أنماط المحيط والأرض مع هذه الخرائط. على الخرائط الكبيرة ، أحتاج إلى تجانب الأنماط يدويًا على الخريطة ، لذا أضفت هذه الميزة. (هناك طريقة في SVG لأداء تجانب النمط ، ولكنها تحتوي على خطأ في Chrome ، لذا لا يمكنني استخدامه.) هذه ميزة جيدة ، لأنه يمكنني الآن استخدام أنماط أصغر من الأرض والمحيطات التي سيتم تجانبها تلقائيًا. لا أدري لماذا لم أكن أدرك ذلك من قبل!

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


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

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


بالطبع ، هذا لا يضمن أن كتلة الأرض ستكون مثيرة للاهتمام للغاية ، وفي الواقع سيتم توحيدها:


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


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


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

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

الجزء 4. نموذج الرياح


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


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

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

لكني لا أريد أن أتخلى تمامًا عن مخطط Voronoi الذي يكمن وراء تنين التنانين . (كحد أدنى ، سيتطلب هذا إعادة كتابة البرنامج بأكمله تقريبًا!) بدلاً من ذلك ، أريد تجربة ربط الخريطة بشبكة موحدة ، وتشغيل نموذج الرياح فيها ، ثم إجراء الربط العكسي. إذا كانت الخسارة في النسخ ذهابًا وإيابًا ليست كبيرة جدًا ، فقد يؤدي ذلك إلى جعل نموذج الرياح أسرع وأسهل.

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


في الواقع ، شبكة السداسيات هي أفضل طريقة لتقسيم سطح مستو إلى مناطق متساوية.

الخطوة التالية هي تحديد كيفية تمثيل شبكة السداسيات في برنامجي. لقد بحثت في الشبكة قليلاً للحصول على المساعدة ، وأعادني كل رابط إلى الصفحة حول شبكات السداسيات في Amit Patel ( الترجمة في حبري). ربما ، من الضروري البدء به ؛ من الجيد أيضًا استكشاف موقع Red Blob Games أولاً إذا كنت تبحث عن معلومات حول تنفيذ ميكانيكا الألعاب. يشرح أميت أفضل مني ، لذلك إذا كان هناك شيء غير واضح ، فاقرأ صفحته.

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


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

بعد الاختيار ، علي الآن أن أتعلم كيفية إرفاق الفهارس بشبكة من السداسيات. على سبيل المثال ، إذا كنت أبحث عن خلية سداسية (3 ، 3) ، فماذا سيكون جيرانها؟ إذا كان عرض كل خلية 5 بكسل ، فما هي إحداثيات مركز الخلية (3 ، 3)؟ وهكذا دواليك.قد يكون التعامل مع هذا أمرًا صعبًا ، لذلك أنا سعيد لأن أميت فعل ذلك من أجلي.

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


هذه السداسيات أكبر بكثير من تلك التي سأستخدمها لنموذج الرياح ، لكنها تبين لي أن كل شيء في مكانه الصحيح.

هنا فتحت حواف الخريطة ورسمت فقط السداسي المركزي وعلى الحدود للتحقق مما إذا كنت قد أغلقت الخريطة بأكملها حقًا:


الجزء العلوي والسفلي خارج الخريطة ، ولكن وجود عدة خلايا في الخارج ليس مهمًا إذا لم أفوت جزءًا من الخريطة.

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


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


في هذه الحالة ، يتم البحث في الاتجاه المعاكس - يتم تمييز السداسي على أنه أرض إذا كان هناك أي أرض فيه. أيهما أفضل يعتمد على ما تحتاجه.

على أي حال ، يمكنني زيادة الدقة عن طريق تقليل حجم السداسيات:


الآن أصبح الساحل أفضل بكثير ، ولكن ظهرت مشكلة جديدة - العديد من السداسيات الداخلية التي لا تعتبر أرضًا. يحدث هذا لأنه عندما تصبح السداسيات صغيرة بما يكفي ، داخل بعضها لا توجد مثلثات Delaunay على الإطلاق. لذلك ، ليس لديهم "ارتفاع". (يوضح هذا أيضًا عدم انتظام مثلثات Delaunay.)

يمكنك استخدام هذا الحل - خذ ارتفاع المثلثات المفقودة كمتوسط ​​لجيرانهم ، أو كحد أقصى لجيرانهم.


بشكل عام ، عندما لا يكون الربط بين السداسيات والمواقع واحد لواحد ، هناك حاجة إلى تصحيحات لملء المعلومات الناقصة.

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

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

تتطلب المرحلة الثانية (تحديد كيفية خروج الرياح الكلية من السداسي) التفكير. أبسط الحالات هي الرياح التي تهب مباشرة من خلال السداسي:


في هذه الحالة ، نتوقع أن تنتقل الرياح إلى الخلية التالية دون تغييرات. (هنا ، المتجه الأحمر هو الريح الأصلية ، والأزرق هو متجه الريح المنتشرة.)

ولكن ماذا لو لم تهب الرياح مباشرة إلى الخلية المجاورة؟


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

من الضروري أيضًا تحديد اتجاه الرياح المنتشرة. أحد الخيارات هو الحفاظ على اتجاه الريح الأصلية:


يبدو أن هذا هو الخيار الأكثر واقعية ، ولكن هناك خيار آخر - لتغيير اتجاه الرياح وفقًا لحافة السداسي التي تتقاطع معها:


هذا النهج أقل دقة ، ولكن له ميزة: ستكون الرياح الواردة دائمًا في أحد الاتجاهات الستة ، والتي يمكن أن تبسط الحسابات.

تنشأ صعوبة أخرى عند النظر في التضاريس. ماذا يجب أن يحدث عندما يرتفع الجبل في مهب الريح؟


في هذه الحالة ، يمر جزء من الريح فوق الجبل (ربما يخلق هطول الأمطار) ، لكن جزءًا من الرياح يتحول إلى الجانبين.


لذلك ، تعتمد طريقة خروج الرياح من السداسي على اتجاهها ، وكذلك الطبوغرافيا في الخلايا المجاورة.

الآن دعونا نتحدث عن كيفية تمثيل المتجهات. هناك خياران رئيسيان أولاً ، يمكن تمثيل المتجه كقيم X و Y ، على سبيل المثال مثل هذا:


إذا رسمنا متجهًا يبدأ من (0 ، 0) ، فإن (X، Y) هي إحداثيات نقاط النهاية. مثل هذا السجل يجعل من السهل جدًا جمع المتجهات. نحن نجمع كل القيم (X ، Y) ونحصل على متجه جديد:


خيار آخر هو استخدام زاوية وطول المتجه:


في هذا النموذج ، من السهل إجراء عمليات مثل ناقلات دوارة أو تغيير طولها.
بالنسبة لغالبية العمليات المطلوبة في نموذج الرياح ، يكون الخيار الأول أفضل ، ولكن في بعض الحالات يكون الخيار الثاني أفضل ، لذلك سيكون من المناسب التبديل بينهما إذا لزم الأمر. من أجل عدم إعادة اختراع العجلة ، بحثت عن مكتبة متجهة لـ Javascript و Victor.js ظهرت تمامًا ، لذلك استفدت منها.

سأبدأ بإضافة متجه الرياح إلى كل مسدس ومعرفة ما إذا كان يمكنني تصور ذلك:


تبدو جيدة حتى الآن.

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


أي أن المتجه عند 0 درجة يشير إلى مسدس على اليمين ، عند 60 درجة - إلى مسدس في أسفل اليمين ، وهكذا. يتم تقسيم المتجه الذي يشير بين هذين الاتجاهين بشكل نسبي بين خليتين - أي أن المتجه بزاوية 30 درجة سيتم تقسيمه بالتساوي بين الخلية إلى اليمين والخلية من الأسفل إلى اليمين. يقع كل ناقل في مكان ما بين زوايا وجه خليتين متجاورتين ، لذا انظر إلى زاوية ناقل الرياح ، واكتشف أنه يقع بين الزوايا المركزية لسداسيتين ، ثم قسمه نسبيًا بين هذين السداسيين.

على سبيل المثال ، إذا كانت متجه الرياح له زاوية 22 درجة:


ثم تنتشر 38/60 من القيمة إلى الخلية على اليمين ، و 22/60 من قيمة المتجه إلى الخلية في أسفل اليمين. إذا تم تقديم المتجهات كزوج من قيم X و Y ، فيمكنك توزيعها بضرب كل قيمة للمتجه الأصلي في جزء (على سبيل المثال ، 22/60) ، ثم إضافته إلى متجه الرياح في الشكل السداسي الجديد.

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


هنا نرى أن الرياح تلتقي على طول القطر وتتحد لتندفع نحو الزاوية السفلية.

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

  1. تتحول الرياح عن العقبات.
  2. تتباطأ الريح عندما ترتفع وتتسارع وتنخفض.

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


يمكن تعديل قوة الرياح. على الخريطة أعلاه ، فهو قوي للغاية ، مما سيؤدي إلى ظهور العديد من المناطق الحيوية غير الواقعية. هنا معنى أكثر منطقية:


لا تزال نسبة كبيرة من حركة الرياح التي تسببها النقوش باقية ، ولكن الفجوات والوديان الكبيرة للرياح القوية أصبحت أصغر.

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


كما ترون ، بدأت الرياح فوق المؤخرات تتلاشى قليلاً.

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

إليك كيف يبدو كل شيء:


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

الآن يمكنني استبدال رياح جديدة في خوارزمية هطول الأمطار الحالية. هنا مقارنة (رياح قديمة على اليسار ، رياح جديدة على اليمين):


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

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

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

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

Source: https://habr.com/ru/post/ar429620/


All Articles