الهيدرولوجيا الإجرائية: محاكاة ديناميكية للأنهار والبحيرات

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

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

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

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

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

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

في طريقي ، أنا أسعى من أجل البساطة والواقعية على حساب زيادة طفيفة في تعقيد نظام التحات الأساسي. أوصي بقراءة مقالتي السابقة حول هذا النظام [ هنا ، الترجمة على حبري] ، لأن النموذج الجديد يعتمد عليه.


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

التفسير: لست جيولوجيًا ، لذلك أنشأت النظام بناءً على معرفتي.

مفهوم الهيدرولوجيا


أريد إنشاء نظام توليدي يمكنه محاكاة العديد من الظواهر الجغرافية ، بما في ذلك:

  • هجرة الأنهار والجداول
  • الشلالات الطبيعية
  • تشكيل الوادي
  • تورم التربة والسهول الفيضية

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

  • يؤثر التخفيف على حركة الماء
  • يؤثر التعرية والترسيب على التضاريس

في الواقع ، يحاكي هذا النظام التآكل الناجم عن المطر ، لكنه غير قادر على نقل العديد من التأثيرات الأخرى:

  • في تيار متحرك ، يتصرف الماء بشكل مختلف.
  • يتصرف الماء بشكل مختلف في حمام السباحة القائم

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

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

نموذج هيدرولوجي مبسط


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

ولذلك، يتكون لدينا نموذج الهيدرولوجية للخريطتين: تدفق خرائط و خرائط حوض .

ملحوظة: لا تنس أنهم مصممون على هيئة أنظمة ثنائية الأبعاد.

دفق وخرائط البلياردو


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

تصف خريطة الحوض المياه الساكنة على السطح (البرك ، البرك ، البحيرات ، المحيطات). يقوم بتخزين عمق المياه في الموضع المقابل للخريطة.

ملحوظة: خرائط التدفق والتجمع هي صفائف بنفس حجم خريطة الارتفاع.


الإغاثة مع التأثير الهيدرولوجي. يتم أخذ طبقة الماء في التقديم من الخرائط الهيدرولوجية.


خرائط هيدرولية مدمجة. الأزرق الفاتح هو خريطة دفق ؛ الأزرق الداكن هو خريطة تجمع.

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

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

الماء كجسيم


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

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

ملاحظة: يتم شرح مفهوم الجسيمات بمزيد من التفصيل في سابقة آخر [ ترجمة على حبري] (وعدد لا حصر له من الموارد الأخرى).

الدورة الهيدرولوجية وتفاعل الخريطة


تتفاعل الخرائط مع بعضها البعض من خلال دورة هيدرولوجية. تتكون الدورة الهيدرولوجية من الخطوات التالية:

  • خلق جسيم على التضاريس
  • (.. ).
  • , .
  • , .
  • , ( ) .
  • .

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


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

التنفيذ


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

ملاحظة: سأعرض فقط أجزاء التعليمات البرمجية ذات الصلة. يمكن العثور على مزيد من المعلومات في المستودع على Github. جميع أجزاء الكود ذات الصلة موجودة في ملف "water.h".

فئة الجسيمات


هيكل جسيم القطرات مطابق لهيكل النظام السابق. الهبوط والفيضان هم الآن أعضاء في الهيكل لأنهم يتصرفون على جسيم واحد فقط في كل مرة.

struct Drop{
  
  //... constructors

  int index;                         //Flat Array Index
  glm::vec2 pos;                     //2D Position
  glm::vec2 speed = glm::vec2(0.0);
  double volume = 1.0;
  double sediment = 0.0;

  //... parameters
  const double volumeFactor = 100.0; //"Water Deposition Rate"

  //Hydrological Cycle Functions
  void descend(double* h, double* stream, double* pool, bool* track, glm::ivec2 dim, double scale);
  void flood(double* h, double* pool, glm::ivec2 dim);
};

معلمة إضافية هي عامل الحجم ، الذي يحدد كيف ينقل الفيضان الحجم إلى مستوى المياه.

خوارزمية النسب


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

void Drop::descend(double* h, double* stream, double* pool, bool* track, glm::ivec2 dim, double scale){

  glm::ivec2 ipos; 

  while(volume > minVol){

    ipos = pos; //Initial Position
    int ind = ipos.x*dim.y+ipos.y; //Flat Array Index

    //Register Position
    track[ind] = true;

    //...
  }
};

يتم تعديل مجموعة المعلمات من خلال خرائط التدفق والتجمع:

//...
  //Effective Parameter Set
  double effD = depositionRate;
  double effF = friction*(1.0-0.5*stream[ind]);
  double effR = evapRate*(1.0-0.2*stream[ind]);
//...

ملاحظة: اكتشفت أن تغيير المعلمة يعمل بشكل جيد.

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

//... nind is the next position after moving the particle
  
  //Out-Of-Bounds
  if(!glm::all(glm::greaterThanEqual(pos, glm::vec2(0))) ||
     !glm::all(glm::lessThan((glm::ivec2)pos, dim))){
       volume = 0.0;
       break;
  }

  //Slow-Down
  if(stream[nind] > 0.5 && length(acc) < 0.01)
    break;

  //Enter Pool
  if(pool[nind] > 0.0)
    break;

//...

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

ملاحظة: تقوم حالة الفائض أيضًا بإعادة تعيين الحجم بحيث لا تنتقل الجزيئات إلى خوارزمية الفيضان.

خوارزمية الفيضانات


يمكن أن يتدفق جسيم مع الحجم المتبقي من موقعه الحالي. يحدث هذا إذا توقف عن الهبوط (لا يوجد تسارع) أو دخل إلى تجمع موجود.

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


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

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

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

void Drop::flood(double* height, double* pool, glm::ivec2 dim){

  index = (int)pos.x*dim.y + (int)pos.y;
  double plane = height[index] + pool[index];  //Testing Plane
  double initialplane = plane;                 //Water Level

  //Flood Set
  std::vector<int> set;
  int fail = 10; //Just in case...

  //Iterate while particle still has volume
  while(volume > minVol && fail){

    set.clear();
    bool tried[dim.x*dim.y] = {false};

    //Lowest Drain
    int drain;
    bool drainfound = false;

    //Recursive Flood-Fill Function
    std::function<void(int)> fill = [&](int i){

      //Out of Bounds
      if(i/dim.y >= dim.x || i/dim.y < 0) return;
      if(i%dim.y >= dim.y || i%dim.y < 0) return;

      //Position has been tried
      if(tried[i]) return;
      tried[i] = true;

      //Wall / Boundary of the Pool
      if(plane < height[i] + pool[i]) return;

      //Drainage Point
      if(initialplane > height[i] + pool[i]){

        //No Drain yet
        if(!drainfound)
          drain = i;

        //Lower Drain
        else if( pool[drain] + height[drain] < pool[i] + height[i] )
          drain = i;

        drainfound = true;
        return; //No need to flood from here
      }

      //Part of the Pool
      set.push_back(i);
      fill(i+dim.y);    //Fill Neighbors
      fill(i-dim.y);
      fill(i+1);
      fill(i-1);
      fill(i+dim.y+1);  //Diagonals (Improves Drainage)
      fill(i-dim.y-1);
      fill(i+dim.y-1);
      fill(i-dim.y+1);
    };

    //Perform Flood
    fill(index);

    //...

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

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

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

    //...

    //Drainage Point
    if(drainfound){

      //Set the Particle Position
      pos = glm::vec2(drain/dim.y, drain%dim.y);

      //Set the New Waterlevel (Slowly)
      double drainage = 0.001;
      plane = (1.0-drainage)*initialplane + drainage*(height[drain] + pool[drain]);

      //Compute the New Height
      for(auto& s: set) //Iterate over Set
        pool[s] = (plane > height[s])?(plane-height[s]):0.0;

      //Remove some sediment
      sediment *= 0.1;
      break;
    }

    //...

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

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

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

    //...

    //Get Volume under Plane
    double tVol = 0.0;
    for(auto& s: set)
      tVol += volumeFactor*(plane - (height[s]+pool[s]));

    //We can partially fill this volume
    if(tVol <= volume && initialplane < plane){

      //Raise water level to plane height
      for(auto& s: set)
        pool[s] = plane - height[s];

      //Adjust Drop Volume
      volume -= tVol;
      tVol = 0.0;
    }

    //Plane was too high and we couldn't fill it
    else fail--;

    //Adjust Planes
    float approach = 0.5;
    initialplane = (plane > initialplane)?plane:initialplane;
    plane += approach*(volume-tVol)/(double)set.size()/volumeFactor;
  }

  //Couldn't place the volume (for some reason)- so ignore this drop.
  if(fail == 0)
    volume = 0.0;

} //End of Flood Algorithm

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

التفاف التآكل


تحتوي الفئة العالمية على جميع الخرائط الثلاث في شكل صفائف عادية:

class World {

public:
  void generate();            //Initialize
  void erode(int cycles);     //Erode with N Particles

  //...

  double heightmap[256*256] = {0.0};
  double waterstream[256*256] = {0.0};
  double waterpool[256*256] = {0.0};

};

ملاحظة: تتم تهيئة خريطة الارتفاع باستخدام ضوضاء Perlin.

تتكون كل خطوة هيدرولوجية لجسيم فردي مما يلي:

//...

//Spawn Particle
glm::vec2 newpos = glm::vec2(rand()%(int)dim.x, rand()%(int)dim.y);
Drop drop(newpos);

int spill = 5;
while(drop.volume > drop.minVol && spill != 0){

  drop.descend(heightmap, waterstream, waterpool, track, dim, scale);

  if(drop.volume > drop.minVol)
    drop.flood(heightmap, waterpool, dim);

  spill--;
}

//...

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

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

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

void World::erode(int N){

  //Track the Movement of all Particles
  bool track[dim.x*dim.y] = {false};

  //Simulate N Particles
  for(int i = 0; i < N; i++){
   
    //... simulate individual particle

  }

  //Update Path
  double lrate = 0.01;  //Adaptation Rate
  for(int i = 0; i < dim.x*dim.y; i++)
    waterstream[i] = (1.0-lrate)*waterstream[i] + lrate*((track[i])?1.0:0.0);

}

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

الأشجار


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

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

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

//... descend function
double effD = depositionRate*max(0.0, 1.0-treedensity[ind]);
//...

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


بفضل التظليل والخرائط العادية ، حتى العفاريت الشجرية البسيطة جدًا تجعل الراحة أكثر جمالًا.

ملاحظة: يمكن العثور على نموذج الشجرة في الملف "vegetation.h" وفي الوظيفة "World :: Grow ()".

تفاصيل أخرى


يتم تصور النتائج باستخدام غلاف OpenGL محلي الصنع ، والذي تم وضعه [ هنا ].

النتائج


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

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

يمكن ملاحظة ظواهر أخرى في النظام ، مثل الشلالات ، والتعرق ودلتا الأنهار ، والبحيرات ، وتورم التربة ، وما إلى ذلك.

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


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

مقارنة آثار تضييق التدفقات


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

قمت بمحاكاة نفس التضاريس ثلاث مرات:

  • التآكل القائم على الجسيمات (التآكل الأساسي) الذي يتلقى خرائط التدفق والتجمع. لا تزال التجمعات تؤثر على التوليد
  • تغيرت التآكل الأساسي مع المعلمات بواسطة الخرائط الهيدرولوجية (بالاشتراك مع التآكل)
  • التآكل المشترك مع البارامترات التي تغيرتها الخرائط الهيدرولوجية وتؤثر على التآكل بواسطة الأشجار

ملاحظة: هذا نظام فوضوي إلى حد ما ، ونوع الهيدرولوجيا الذي يظهر يعتمد بشكل كبير على التضاريس. من الصعب العثور على مثال "كاشف للغاية" للإغاثة.


تقديم الإغاثة للنظام الأساسي


تقديم ارتفاع النظام المشترك


تقديم تضاريس نظام مع الأشجار

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

يتعامل تقليل الاحتكاك والتبخر بنجاح مع حقيقة أن الجسيمات تبدأ في تفضيل القنوات الموجودة بالفعل.

تأثيرات أخرى أكثر وضوحا مع الملاحظة المباشرة للإغاثة.


الخريطة الهيدرولوجية للنظام الأساسي


الخريطة الهيدرولوجية للنظام المشترك


الخريطة الهيدرولوجية للنظام مع الأشجار

ملاحظة: تم إنشاء هذه النتائج في 60 ثانية بالضبط من وقت المحاكاة.

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


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

تأثير التجمع


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


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

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

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


بعد دقيقة أخرى من الجيل ، ظهرت عدة تجمعات جديدة من تلقاء نفسها.


بزاوية أكثر حدة ، يكون الفرق في ارتفاعات الحوض أكثر وضوحًا.


تُظهر الخريطة الهيدرولوجية بوضوح أن الحوض المركزي يندمج في الحوض السفلي.

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

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

سرعة المحاكاة


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

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

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

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

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

فيديوهات أجمل



محاكاة الهيدرولوجيا على التضاريس الرأسية غير المستوية.


راحة أكثر سلاسة. تتحول بعض البحيرات إلى تذبذب قليل.

محاكاة الهيدرولوجيا على تضاريس ناعمة مسطحة.

تم تسجيل مقاطع الفيديو اللاحقة بعد تحسن السرعة.


تضاريس أكثر سلاسة وسلاسة.


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


راحة أكثر تفاوتا مع تكوين الأنهار.

أنا يمكن أن تستمر إلى الأبد.

الخلاصة والعمل من أجل المستقبل


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

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

سيكون من المثير للاهتمام إضافة أنواع مختلفة من التربة في شكل خريطة للتربة يمكن من خلالها أخذ معلمات التآكل.

يمكنك أيضًا تغيير نظام الأشجار بسهولة لإنشاء أنواع مختلفة من الأشجار التي تثبت التربة في مكانها.

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

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

All Articles