Last active
November 8, 2020 02:55
-
-
Save refeed/91c4b1ab1a28a3731af876d3366cf06b to your computer and use it in GitHub Desktop.
Jarak 3D gamaforce
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from math import cos, sqrt, radians | |
INPUT_COORDINATE_MSG = 'Masukkan latitude longitude dan tinggi dipisahkan dengan spasi:\n' | |
def get_distance_any_dimensions(coordinate_1, coordinate_2): | |
""" | |
Menghitung jarak absolut dari dua koordinat dimensi apapun menggunakan | |
Euclidean distance. | |
:param coordinate_1: (Iterable) berisi x elemen integer/float | |
:param coordinate_2: (Iterable) berisi x elemen integer/float | |
:returns: (float) Jarak absolut dari dua koordinat | |
:raises ValueError: coordinate_1 atau coordinate_2 tidak memenuhi ketentuan | |
""" | |
if len(coordinate_1) != len(coordinate_2): | |
raise ValueError('Koordinat harus memiliki dimensi yang sama') | |
sum_value = 0 | |
for point_1, point_2 in zip(coordinate_1, coordinate_2): | |
sum_value += (point_1 - point_2)**2 | |
return sqrt(sum_value) | |
def get_distance_latitude_longitude_in_meters(coordinate_1, coordinate_2): | |
# Credits to https://stackoverflow.com/a/19356480/6156700 | |
# https://en.wikipedia.org/wiki/Geographic_coordinate_system#Length_of_a_degree | |
lat_mid = (coordinate_1[0] + coordinate_2[0]) / 2 | |
m_per_deg_lat = (111132.92 - 559.82*cos(radians(2*lat_mid)) + 1.175*cos(radians(4*lat_mid)) - 0.0023*cos(radians(6*lat_mid))) | |
m_per_deg_lon = 111412.84*cos(radians(lat_mid)) - 93.5*cos(radians(3*lat_mid)) + 0.118*cos(radians(5*lat_mid)) | |
delta_lat = abs(coordinate_1[0] - coordinate_2[0]) | |
delta_lon = abs(coordinate_1[1] - coordinate_2[1]) | |
distance_meter = get_distance_any_dimensions((0, delta_lat * m_per_deg_lat), | |
(delta_lon * m_per_deg_lon, 0)) | |
return distance_meter | |
if __name__ == "__main__": | |
# Baris pertama untuk koordinat pertama | |
# Baris kedua untuk koordinat kedua | |
# Kode hanya akurat untuk koordinat yang berdekatan | |
coordinate_1 = list(map(float, input(INPUT_COORDINATE_MSG).split())) | |
coordinate_2 = list(map(float, input(INPUT_COORDINATE_MSG).split())) | |
distance_lat_lon_in_meter = get_distance_latitude_longitude_in_meters( | |
coordinate_1[:2], coordinate_2[:2] | |
) | |
vector_1 = (0, coordinate_1[2]) | |
vector_2 = (distance_lat_lon_in_meter, coordinate_2[2]) | |
result = get_distance_any_dimensions(vector_1, vector_2) | |
print(result) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment