📐 Guia e Demonstração Matemática

Como Funcionam as Coordenadas Geográficas: A Verdade Esférica

Por que a maioria dos geradores está matematicamente incorreta e como a projeção de área igual gera pontos uniformes.

📐 Rigor Matemático

Distribuição Esférica de Área Igual vs. Viés Polar

A maioria dos geradores gratuitos trata a Terra como um retângulo plano. Veja como nossa matemática garante exatidão total.

❌ Grade Plana Ingênua (Erro Comum)

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

O Problema: Uma faixa de 1° no equador mede 40.075 km, enquanto a 80°N mede apenas 6.950 km. A latitude uniforme super-representa o Ártico em 400%.

✅ Área Igual de Marsaglia (Nosso Algoritmo)

Verificado e Exato
// ✅ 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;

A Solução: Amostrar o seno da latitude sin(θ) de forma uniforme compensa a redução cos(lat). Cada quilômetro quadrado tem probabilidade idêntica.

1. O Erro Fundamental da Suposição Retangular

Em um mapa 2D (como Mercator), a Terra parece um retângulo plano com latitude de -90° a +90° e longitude de -180° a +180°.

Muitos tutoriais sugerem gerar coordenadas com matemática plana simples:

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

Embora gere números válidos, esse código assume que todas as faixas têm a mesma área física. Em uma esfera, a circunferência diminui com o cosseno da latitude:

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

No equador (0°), a circunferência é de 40.075 km. A 80° Norte, encolhe para 6.950 km. O algoritmo plano concentra 5,7 vezes mais pontos nos polos do que no equador!

2. A Transformação Esférica de Área Igual de Marsaglia

Para gerar pontos uniformemente distribuídos na esfera, a densidade deve ser proporcional ao elemento diferencial de área:

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

Como o elemento de área é proporcional a d(sin θ), escolhemos sin(θ) uniformemente no intervalo [-1, 1]:

// ✅ 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 };
}

Essa transformação matemática garante que cada quilômetro quadrado na Terra tenha exatamente a mesma probabilidade de ser escolhido.

3. Amostragem por Rejeição Terrestre e Reprodutibilidade PRNG

Cerca de 71% da Terra é oceano. Quando o usuário seleciona apenas terra firme, utilizamos amostragem por rejeição:

  1. Gerar um ponto esférico de área igual.
  2. Testar contra polígonos e vetores continentais.
  3. Se cair no oceano, descartar e regenerar com até 250 tentativas.

Para garantir reprodutibilidade, combinamos hash cyrb53 de 53 bits com PRNG mulberry32 de 32 bits, assegurando resultados 100% determinísticos.