Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
# geo_maths.gd # geospatial mathematics utilities for earth globe # translated from geographical-adventures geomaths.cs class_name GeoMaths const EARTH_RADIUS_KM: float = 6371.0 const EARTH_CIRCUMFERENCE_KM: float = EARTH_RADIUS_KM * PI * 2.0 # convert point on unit sphere to coordinate (longitude, latitude in radians) static func point_to_coordinate(point_on_unit_sphere: Vector3) -> Vector2: var latitude = asin(point_on_unit_sphere.y) var a = point_on_unit_sphere.x var b = -point_on_unit_sphere.z var longitude = atan2(a, b) return Vector2(longitude, latitude) # calculate point on sphere given longitude and latitude (in radians) and radius static func coordinate_to_point(longitude: float, latitude: float, radius: float = 1.0) -> Vector3: var y = sin(latitude) var r = cos(latitude) # radius of 2d circle cut through sphere at y var x = sin(longitude) * r var z = -cos(longitude) * r return Vector3(x, y, z) * radius # convert coordinate (lon, lat in radians) to uv texture coordinates [0,1] static func coordinate_to_uv(longitude: float, latitude: float) -> Vector2: var u = (longitude + PI) / (2.0 * PI) var v = (latitude + PI / 2.0) / PI return Vector2(u, v) # convert point on unit sphere to uv coordinates static func point_to_uv(point_on_unit_sphere: Vector3) -> Vector2: var coord = point_to_coordinate(point_on_unit_sphere) return coordinate_to_uv(coord.x, coord.y) # convert uv coordinates to coordinate (lon, lat in radians) static func uv_to_coordinate(uv: Vector2) -> Vector2: var longitude = (uv.x - 0.5) * 2.0 * PI var latitude = (uv.y - 0.5) * PI return Vector2(longitude, latitude) # convert uv coordinates to point on unit sphere static func uv_to_point_on_sphere(uv: Vector2) -> Vector3: var coord = uv_to_coordinate(uv) return coordinate_to_point(coord.x, coord.y) # calculate distance between two points on unit sphere (result in radians) static func distance_between_points_on_unit_sphere(a: Vector3, b: Vector3) -> float: # more precise for small distances than acos(dot(a,b)) return atan2(a.cross(b).length(), a.dot(b))
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)