Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menjana Pulau Realistik Menggunakan Algoritma Diamond-Square yang Diubahsuai?

Bagaimana untuk Menjana Pulau Realistik Menggunakan Algoritma Diamond-Square yang Diubahsuai?

Patricia Arquette
Patricia Arquetteasal
2025-01-07 12:27:45447semak imbas

How to Generate Realistic Islands Using a Modified Diamond-Square Algorithm?

Perlin Noise Islands with No Circles

Daripada menggunakan bulatan kecerunan, pertimbangkan untuk menggunakan algoritma Diamond & Square dengan beberapa pengubahsuaian untuk mencipta rupa semula jadi pulau dalam penjana peta anda.

Algoritma Berlian & Petak dengan Pengubahsuaian

  • Konfigurasikan sifat penjanaan: Wujudkan parameter seperti ketinggian maksimum dan minimum, paras laut dan julat tumbuh-tumbuhan.
  • Buat peta ketinggian rupa bumi (zed[][]):

    • Ubah suai algoritma Diamond & Square untuk mengelakkan rupa bumi "dalam" dengan memulakan sudut dengan ketinggian paling rendah.
    • Abaikan berlian pertama langkah dan mulakan titik tengah dengan nilai rawak.
    • Selepas setiap lelaran segi empat sama, laraskan titik sempadan kepada minimum (di bawah air) ketinggian.
  • Buat peta permukaan (taip[][]):

    • Tetapkan ciri permukaan berdasarkan ketinggian, seperti air, pasir, tumbuh-tumbuhan dan batu.
    • Tambahkan ciri berdasarkan cerun rupa bumi, seperti batu.
    • Sertakan elemen tambahan seperti sungai, sungai dan bangunan berdasarkan peraturan tertentu.

Contoh C Pelaksanaan

void map_random(int _xs, int _ys) {
  // Configuration and parameter initialization

  // Terrain generation
  ter=new int*[mys+1]; for (y=0;y<=mys;y++) ter[y]=new int[mxs+1];
  typ=new int*[mys+1]; for (y=0;y<=mys;y++) typ[y]=new int[mxs+1];
  ...

  // First pass
  t=-r2;
  ter[  0][  0]=t;
  ter[  0][mxs]=t;
  ter[mys][  0]=t;
  ter[mys][mxs]=t;
  ter[dy2][dx2]=r2;

  ...

  for (;dx2|dy2;dx=dx2,dx2>>=1,dy=dy2,dy2>>=1)    // subdivide step until full image is filled
  {
    ...
    // diamond (skip first one for islands)
    if ((!_island)||(dx!=mxs))
     for (y=dy2,yy=mys-dy2;y<=yy;y+=dy)
      for (x=dx2,xx=mxs-dx2;x<=xx;x+=dx)
       ter[y][x]=((ter[y-dy2][x-dx2]+ter[y-dy2][x+dx2]+ter[y+dy2][x-dx2]+ter[y+dy2][x+dx2])>>2)+Random(r)-r2;
    ...
    // adjust border
    if (_island)
        {
        for (y=0;y<=mys;y+=dy2) { ter[y][0]=t; ter[y][mxs]=t; }
        for (x=0;x<=mxs;x+=dx2) { ter[0][x]=t; ter[mys][x]=t; }
        }
  }

  // Additional steps and enhancements
  ...
}

Output

Ini pendekatan menghasilkan lebih banyak pulau yang kelihatan semula jadi dengan berbilang bukit dan garis pantai yang realistik.

Atas ialah kandungan terperinci Bagaimana untuk Menjana Pulau Realistik Menggunakan Algoritma Diamond-Square yang Diubahsuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn