korba 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a8a9dc1d59d577592a4ef91601bb34a4921e2bb1eb731c0fe866698759717d09
4
- data.tar.gz: bb572412946fd8f08a00ab844c4a4975d08953871984a142225ffe09b786417d
3
+ metadata.gz: d032139625c6722891cef771fc76ffb90e8b082f89146ebb860a5f8034004b15
4
+ data.tar.gz: 354e2f0f7c382059bf7a424ffd952c32b56b6ae616b5c7bd42f50a148d2f42c3
5
5
  SHA512:
6
- metadata.gz: a6f13b11b06a7dc3159b5219204a3c83791a5708f7fc8d64c0d72734bd751c655b8438ef7d29fbb2599f94dfa6657e9c282235dbf86239fab49ad12a2eafff9d
7
- data.tar.gz: bcc2a2d8b20d9accbe8b6079334ce6c4610a22e78363d7c9e6243f39a1608c46a90adc0b7d0e52c53adb9fb7c81b7a4dc60f1a291e523e3166bc54b68f9a6897
6
+ metadata.gz: 6f73a3a19efff8c89299173d67dbfa1aaf754ce1c0828148f7bd3933cd57d8de8ba74352cc12849fcd405882c964f345353e1f6d4204b4e451d00a8a6ebf5337
7
+ data.tar.gz: 293456b12a49007bb1f1c1acc6201fcf99678e5427b1c81942d9f1e53ab5c9cc8716ffdeaaa562846c45ef2b245400f7d73758a05494da91df1528da9e06cba0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [0.7.1] - 2026-04-05
2
+
3
+ - FIX: Fixed calculation when orbital inclination and eccentricity are 0
4
+
1
5
  ## [0.7.0] - 2026-04-01
2
6
 
3
7
  - FIX: Use SGP4 for TLE to Cartesian conversion
data/lib/korba/kep.rb CHANGED
@@ -19,13 +19,23 @@ module Korba
19
19
  end
20
20
 
21
21
  def to_car
22
- vector_n = Vector[
23
- Math.sin(deg_to_rad(inclination)) * Math.sin(deg_to_rad(ra_of_asc_node)),
24
- -Math.sin(deg_to_rad(inclination)) * Math.cos(deg_to_rad(ra_of_asc_node)),
25
- Math.cos(deg_to_rad(inclination))
26
- ]
27
- vector_omega = Vector[Math.cos(deg_to_rad(ra_of_asc_node)), Math.sin(deg_to_rad(ra_of_asc_node)), 0]
28
- vector_m = vector_n.cross(vector_omega)
22
+ # 特異点対応: inclinationが0(または極めて小さい)場合の処理
23
+ is_equatorial = inclination.abs < 1e-10
24
+
25
+ if is_equatorial
26
+ # 赤道面内の場合、x軸を基準にする
27
+ vector_omega = Vector[1.0, 0.0, 0.0]
28
+ vector_m = Vector[0.0, 1.0, 0.0]
29
+ vector_n = Vector[0.0, 0.0, 1.0]
30
+ else
31
+ vector_n = Vector[
32
+ Math.sin(deg_to_rad(inclination)) * Math.sin(deg_to_rad(ra_of_asc_node)),
33
+ -Math.sin(deg_to_rad(inclination)) * Math.cos(deg_to_rad(ra_of_asc_node)),
34
+ Math.cos(deg_to_rad(inclination))
35
+ ]
36
+ vector_omega = Vector[Math.cos(deg_to_rad(ra_of_asc_node)), Math.sin(deg_to_rad(ra_of_asc_node)), 0.0]
37
+ vector_m = vector_n.cross(vector_omega)
38
+ end
29
39
 
30
40
  r_angle_factor = deg_to_rad(arg_of_pericenter + true_anomaly)
31
41
  vector_r = distance * (Math.cos(r_angle_factor) * vector_omega + Math.sin(r_angle_factor) * vector_m)
@@ -4,7 +4,7 @@ module Korba
4
4
  module OrbitUtils
5
5
  def semi_major_axis
6
6
  # a = (μ / n^2)^(1/3) m
7
- (Constant::GME / (mean_motion * 2 * Math::PI / 86400.0) ** 2.0) ** (1.0 / 3.0)
7
+ (Constant::GME / (mean_motion * 2.0 * Math::PI / 86400.0) ** 2.0) ** (1.0 / 3.0)
8
8
  end
9
9
 
10
10
  def height_at_perigee
@@ -21,8 +21,12 @@ module Korba
21
21
  end
22
22
 
23
23
  def true_anomaly
24
- factor = (Math.cos(deg_to_rad(eccentric_anomaly)) - eccentricity) / (1 - eccentricity * Math.cos(deg_to_rad(eccentric_anomaly)))
25
- rad_to_deg(Math.acos(factor))
24
+ e_rad = deg_to_rad(eccentric_anomaly)
25
+ y = Math.sqrt(1 - eccentricity ** 2) * Math.sin(e_rad)
26
+ x = Math.cos(e_rad) - eccentricity
27
+
28
+ # atan2(y, x) で正確な位相(-pi から pi)を求める
29
+ rad_to_deg(Math.atan2(y, x))
26
30
  end
27
31
 
28
32
  def distance
@@ -30,10 +34,12 @@ module Korba
30
34
  end
31
35
 
32
36
  def velocity
33
- Math.sqrt(Constant::GME * (2 / distance - 1 / semi_major_axis))
37
+ Math.sqrt(Constant::GME * (2.0 / distance - 1.0 / semi_major_axis))
34
38
  end
35
39
 
36
40
  def path_angle
41
+ return 0.0 if eccentricity < 1e-15
42
+
37
43
  factor = Math.sqrt(Constant::GME * semi_major_axis * (1 - eccentricity ** 2)) / (distance * velocity)
38
44
  rad_to_deg(Math.acos(factor))
39
45
  end
@@ -44,8 +50,8 @@ module Korba
44
50
  end
45
51
 
46
52
  def normalize_rad(rad)
47
- rad = rad + 2 * Math::PI if rad < 0
48
- normalize_rad = rad > 2 * Math::PI ? rad - 2 * Math::PI : rad
53
+ rad = rad + 2.0 * Math::PI if rad < 0
54
+ normalize_rad = rad > 2.0 * Math::PI ? rad - 2.0 * Math::PI : rad
49
55
  normalize_rad(normalize_rad) if normalize_rad != rad
50
56
  normalize_rad
51
57
  end
@@ -56,8 +62,8 @@ module Korba
56
62
  end
57
63
 
58
64
  def normalize_deg(deg)
59
- deg = deg + 360 if deg < 0
60
- normalized_deg = deg > 360 ? deg - 360 : deg
65
+ deg = deg + 360.0 if deg < 0
66
+ normalized_deg = deg > 360.0 ? deg - 360.0 : deg
61
67
  normalize_deg(normalized_deg) if normalized_deg != deg
62
68
  normalized_deg
63
69
  end
data/lib/korba/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Korba
4
- VERSION = "0.7.0"
4
+ VERSION = "0.7.1"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: korba
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - kk0000-kk