Orbital elements: Difference between revisions
Content added Content deleted
(Scala contribution added.) |
(Added Go) |
||
Line 127: | Line 127: | ||
Speed : (-0.5527708409604437, 0.9574270831797614, 0.0000000000000000) |
Speed : (-0.5527708409604437, 0.9574270831797614, 0.0000000000000000) |
||
Edit source/app.d to start your project.</pre> |
Edit source/app.d to start your project.</pre> |
||
=={{header|Go}}== |
|||
{{trans|Kotlin}} |
|||
<lang go>package main |
|||
import ( |
|||
"fmt" |
|||
"math" |
|||
) |
|||
type vector struct{ x, y, z float64 } |
|||
func (v vector) add(w vector) vector { |
|||
return vector{v.x + w.x, v.y + w.y, v.z + w.z} |
|||
} |
|||
func (v vector) mul(m float64) vector { |
|||
return vector{v.x * m, v.y * m, v.z * m} |
|||
} |
|||
func (v vector) div(d float64) vector { |
|||
return v.mul(1.0 / d) |
|||
} |
|||
func (v vector) abs() float64 { |
|||
return math.Sqrt(v.x*v.x + v.y*v.y + v.z*v.z) |
|||
} |
|||
func (v vector) String() string { |
|||
return fmt.Sprintf("(%g, %g, %g)", v.x, v.y, v.z) |
|||
} |
|||
func orbitalStateVectors( |
|||
semimajorAxis, eccentricity, inclination, longitudeOfAscendingNode, |
|||
argumentOfPeriapsis, trueAnomaly float64) (position vector, speed vector) { |
|||
i := vector{1, 0, 0} |
|||
j := vector{0, 1, 0} |
|||
k := vector{0, 0, 1} |
|||
mulAdd := func(v1, v2 vector, x1, x2 float64) vector { |
|||
return v1.mul(x1).add(v2.mul(x2)) |
|||
} |
|||
rotate := func(i, j vector, alpha float64) (vector, vector) { |
|||
return mulAdd(i, j, math.Cos(alpha), math.Sin(alpha)), |
|||
mulAdd(i, j, -math.Sin(alpha), math.Cos(alpha)) |
|||
} |
|||
i, j = rotate(i, j, longitudeOfAscendingNode) |
|||
j, _ = rotate(j, k, inclination) |
|||
i, j = rotate(i, j, argumentOfPeriapsis) |
|||
l := 2.0 |
|||
if eccentricity != 1.0 { |
|||
l = 1.0 - eccentricity*eccentricity |
|||
} |
|||
l *= semimajorAxis |
|||
c := math.Cos(trueAnomaly) |
|||
s := math.Sin(trueAnomaly) |
|||
r := l / (1.0 + eccentricity*c) |
|||
rprime := s * r * r / l |
|||
position = mulAdd(i, j, c, s).mul(r) |
|||
speed = mulAdd(i, j, rprime*c-r*s, rprime*s+r*c) |
|||
speed = speed.div(speed.abs()) |
|||
speed = speed.mul(math.Sqrt(2.0/r - 1.0/semimajorAxis)) |
|||
return |
|||
} |
|||
func main() { |
|||
long := 355.0 / (113.0 * 6.0) |
|||
position, speed := orbitalStateVectors(1.0, 0.1, 0.0, long, 0.0, 0.0) |
|||
fmt.Println("Position :", position) |
|||
fmt.Println("Speed :", speed) |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
Position : (0.7794228433986797, 0.45000003465368416, 0) |
|||
Speed : (-0.5527708409604438, 0.9574270831797618, 0) |
|||
</pre> |
|||
=={{header|Java}}== |
=={{header|Java}}== |