📐 Matematiksel Rehber ve Kanıt

Rastgele Coğrafi Koordinatlar Nasıl Çalışır: Küresel Gerçek

İnternetteki çoğu koordinat üretecinin neden matematiksel olarak hatalı olduğunu ve eşit alanlı izdüşümün nasıl kusursuz noktalar ürettiğini öğrenin.

📐 Matematiksel Kesinlik

Eşit Alanlı Küresel Dağılım vs. Kutup Sapması Hatası

Çoğu ücretsiz araç Dünya’yı düz bir dikdörtgen olarak kabul eder. Matematiğimizin bunu nasıl mükemmel şekilde düzelttiğini görün.

❌ Basit Düz Izgara (Rakiplerin Hatası)

Hatalı
// ❌ Flat 2D Rectangular Bug:
const lat = (Math.random() * 180) - 90;
const lng = (Math.random() * 360) - 180;

Sorun: Ekvatorda 1° enlem bandı 40.075 km iken 80°K’de yalnızca 6.950 km’dir. Düz enlem seçimi kutupları %400 fazla temsil eder.

✅ Marsaglia Eşit Alan Yöntemi (Bizim Algoritmamız)

Doğrulanmış ve Kesin
// ✅ Marsaglia Equal-Area Sphere Math:
const u = Math.random();
const lat = Math.asin(2 * u - 1) * (180 / Math.PI);
const lng = -180 + Math.random() * 360;

Çözüm: Enlemin sinüsünü sin(θ) olarak örneklemek, cos(lat) alan daralmasını mükemmel dengeler. Her kilometrekare eşit şansa sahiptir.

1. Dikdörtgen Harita Varsayımının Temel Geometrik Hatası

2B harita izdüşümünde (Mercator gibi), Dünya enlemi -90° ile +90°, boylamı -180° ile +180° olan düz bir dikdörtgen gibi görünür.

Birçok basit programlama rehberi koordinatları bu şekilde üretmeyi önerir:

// ❌ Naive algorithm (Suffers from polar bias bug)
const latitude = (Math.random() * 180) - 90;
const longitude = (Math.random() * 360) - 180;

Bu kod geçerli sayılar üretse de, tüm enlem bantlarının aynı fiziksel alana sahip olduğunu varsayar. Gerçek bir kürede enlem çemberi cos(enlem) oranında küçülür:

Circumference(θ) = 2πR · cos(θ)

Ekvatorda (0°) çevre 40.075 km iken 80° Kuzeyde yalnızca 6.950 km’ye düşer. Düz algoritma kutuplarda ekvatora göre 5,7 kat daha yoğun nokta üretir!

2. Marsaglia Eşit Alanlı Küresel Sinüs Dönüşümü

Noktaların küre yüzeyine tamamen eşit dağılması için olasılık yoğunluğu diferansiyel alan öğesiyle doğrudan orantılı olmalıdır:

dA = R² · cos(θ) dθ dφ = R² · d(sin θ) dφ

Alan öğesi d(sin θ) ile orantılı olduğundan, sin(θ) değerini [-1, 1] aralığında eşit olarak örnekleriz:

// ✅ Correct Archimedes-Lambert-Marsaglia equal-area algorithm:
function getRandomSpherePoint() {
  const u = Math.random(); // Uniform in [0, 1)
  const v = Math.random(); // Uniform in [0, 1)

  // Invert the cumulative distribution function:
  const sinLat = 2 * u - 1; // Uniform in [-1, 1]
  const latRad = Math.asin(sinLat); // In radians
  const lat = latRad * (180 / Math.PI); // In degrees [-90, +90]

  const lng = -180 + v * 360; // In degrees [-180, +180]

  return { lat, lng };
}

Bu zarif matematiksel dönüşüm, Dünya üzerindeki her bir kilometrekarenin tamamen eşit seçilme şansına sahip olmasını garanti eder.

3. Karada Reddetme Örneklemesi ve PRNG Belirlenirciliği

Dünya yüzeyinin yaklaşık %71’i okyanuslarla kaplıdır. Yalnızca kara modu seçildiğinde reddetme örneklemesi uygularız:

  1. Eşit alanlı bir küresel nokta üret.
  2. Kıta poligonu sınır vektörleriyle anlık kesişim testi yap.
  3. Eğer nokta okyanusa düşerse reddet ve 250 denemeye kadar yeniden üret.

Yinelenebilirlik için motorumuz 53-bit cyrb53 karmasını 32-bit mulberry32 PRNG ile birleştirerek %100 belirlenimci sonuçlar sağlar.