これはC#のようです。
まず、 と を定義する必要がありtoRadians
ますtoDegrees
。
double toRadians(double degrees) {
double sign = Math.Sign(degrees);
while(Math.Abs(degrees) > 360) {
degrees -= sign * 360;
}
return Math.PI * degrees / 180;
}
double toDegrees(double radians) {
double sign = Math.Sign(radians);
while(Math.Abs(radians) > 2 * Math.PI) {
radians -= sign * 2 * Math.PI;
}
return 180 * radians / Math.PI;
}
次に、三角関数を使用するにはMath.Sin
、Math.Cos
、 などを使用する必要があります。
double dist = Math.Sin(lat1) * Math.Sin(lat2)
+ Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(theta);
と
dist = toDegrees(Math.Acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;
コメント:
public static double distance (double lat1, double lon1, double lat2, double lon2) {
double lat1 = Convert.ToDouble(latitude);
double lon1 = Convert.ToDouble(longitude);
double lat2 = Convert.ToDouble(destlat);
double lon2 = Convert.ToDouble(destlon);
これは何ですか?latitude
、longitude
、destlat
およびはどこでdestlon
定義されていますか? さらに、このメソッドのパラメーターとしてとがあるようlat1
に見えるため、ここで同じ名前のローカルを定義することはできません。lon1
lat2
lon2
double theta = toRadians(lon1-lon2);
lat1 = toRadians(lat1);
lon1 = toRadians(lon1);
lat2 = toRadians(lat2);
lon2 = toRadians(lon2);
これはスタイルが悪い。が緯度を度で表している場合は、次のようlat1
にラジアンに相当する値を計算する方がはるかに優れています。lat1
double lat1Radians = toRadians(lat1);
したがって、上記を次のように置き換えます。
double theta = toRadians(lon1-lon2);
double lat1Radians = toRadians(lat1);
double lon1Radians = toRadians(lon1);
double lat2Radians = toRadians(lat2);
double lon2Radians = toRadians(lon2);
最後に:
double dist = sin(lat1) * sin(lat2)
+ cos(lat1) * cos(lat2) * cos(theta);
dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;
これもスタイル悪い。最初の式と 2 番目の式の両方が、計算しようとしている距離を表すことはできません。最初の式の結果を、より意味のある名前の変数に割り当てる必要があります。最悪の場合、少なくとも次のことを行います。
double temp = Math.Sin(lat1) * Math.Sin(lat2)
+ Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(theta);
double dist = toDegrees(Math.Acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;
return dist;