t03-antimeridian-probe.mjs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import * as c from '../../../src/modules/cockpit/domain/camera.js'
  2. /** 把经度序列解缠成连续弧长(每步取最短弧增量累加)。 */
  3. function unwrap(lons) {
  4. let acc = 0
  5. const out = [0]
  6. for (let i = 1; i < lons.length; i += 1) {
  7. acc += c.shortestAngleDelta(lons[i - 1], lons[i])
  8. out.push(acc)
  9. }
  10. return out
  11. }
  12. const from = { lon: 179.9, lat: 10, height: 0 }
  13. const to = { lon: -179.9, lat: 10, height: 0 }
  14. console.log('== 换中心 lerpPivot 跨 ±180 ==')
  15. const seq = []
  16. for (let i = 0; i <= 10; i += 1) seq.push(c.lerpPivot(from, to, i / 10).lon)
  17. const arc = unwrap(seq)
  18. console.log('落点:', seq.map((v) => v.toFixed(3)).join(' → '))
  19. console.log('弧长:', arc.map((v) => v.toFixed(3)).join(' → '))
  20. console.log('总弧长 °:', arc[arc.length - 1].toFixed(3), '(0.2 才对;-359.8 表示绕了一圈)')
  21. console.log('单调推进:', arc.every((v, i) => i === 0 || v >= arc[i - 1] - 1e-12))
  22. console.log('')
  23. console.log('== 阻尼 approachPivot 跨 ±180 ==')
  24. let shown = { lon: 179.99, lat: 10, height: 0 }
  25. const target = { lon: -179.99, lat: 10, height: 0 }
  26. const seq2 = [shown.lon]
  27. for (let i = 0; i < 10; i += 1) {
  28. shown = c.approachPivot(shown, target, 0.3)
  29. seq2.push(shown.lon)
  30. }
  31. const arc2 = unwrap(seq2)
  32. console.log('落点:', seq2.map((v) => v.toFixed(3)).join(' → '))
  33. console.log('总弧长 °:', arc2[arc2.length - 1].toFixed(3), '(应 ≈ -0.02)')
  34. console.log('单调推进:', arc2.every((v, i) => i === 0 || Math.abs(v) >= Math.abs(arc2[i - 1]) - 1e-12))
  35. console.log('')
  36. console.log('== 反方向(-179.9 → 179.9)==')
  37. const seq3 = []
  38. for (let i = 0; i <= 10; i += 1) seq3.push(c.lerpPivot({ lon: -179.9, lat: 0 }, { lon: 179.9, lat: 0 }, i / 10).lon)
  39. const arc3 = unwrap(seq3)
  40. console.log('落点:', seq3.map((v) => v.toFixed(3)).join(' → '))
  41. console.log('总弧长 °:', arc3[arc3.length - 1].toFixed(3), '(应 ≈ +0.2)')