@dovid כתבתי כעת מחדש את הקוד שלי תוך שימת לב לקלט שמגיע בפועל, וזה אכן עובד מעולה.
let coordinates = `[32.0809247 , 34.8426006, 32.0856592 , 34.840563, 32.0903809 , 34.8357482, 32.084932 , 34.835226, 32.0762743 , 34.8356051, 32.0766089 , 34.8085407]`
function haversineSort(coordinates) {
var sortedCoords = [];
var remainingCoords = coordinates.slice();
var currentCoord = remainingCoords[0].split(", ").map(Number);
sortedCoords.push(currentCoord);
remainingCoords.splice(0, 1);
while (remainingCoords.length > 0) {
var closestCoord = null;
var closestDistance = Number.POSITIVE_INFINITY;
for (var i = 0; i < remainingCoords.length; i++) {
var distance = haversineDistance(currentCoord, remainingCoords[i].split(", ").map(Number));
if (distance < closestDistance) {
closestCoord = remainingCoords[i];
closestDistance = distance;
}
}
sortedCoords.push(closestCoord.split(", ").map(Number));
remainingCoords.splice(remainingCoords.indexOf(closestCoord), 1);
currentCoord = closestCoord.split(", ").map(Number);
}
return sortedCoords;
}
function haversineDistance(coord1, coord2) {
var R = 6371e3;
var lat1 = coord1[0] * Math.PI / 180;
var lat2 = coord2[0] * Math.PI / 180;
var deltaLat = (coord2[0] - coord1[0]) * Math.PI / 180;
var deltaLon = (coord2[1] - coord1[1]) * Math.PI / 180;
var a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) +
Math.cos(lat1) * Math.cos(lat2) *
Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return R * c;
}
תודה ענקית על העזרה וההכוונה, זה לא מובן מאליו