@Nik1712

Как отсортировать объекты по удаленности, зная координаты на JS?

Есть определение текущего местоположения пользователя. Нужно сделать фильтр для вывода объектов по удаленности, начиная от самых близких до далеких. Для этого, как я понимаю нужно вывести их по возрастанию расстояния от меньшего к большему. Как узнать эти расстояния, если известны координаты каждого объекта (они будут скажем в data атрибутах объектов) на JS?
  • Вопрос задан
  • 1631 просмотр
Пригласить эксперта
Ответы на вопрос 3
EreminD
@EreminD
Кое-что умею
Геометрия. Какой-то там класс
1. Фактически, имеем кучу векторов.
2. Начало у них у всех в одной точке (текущей). Для удобства, держим ее за (0, 0)
3. Координаты ваших точек - концы векторов
4. Считаем длину каждого вектора
//тут массив с вашими объектами
var items = [ {x: 1, y: 1}, 
			{ x: 22, y: 0}, 
			{ x: 2, y: 0},
			{ x: 0, y: 1},
			{ x: 2, y: 2},
			{ x: 1, y: 2},
			]

//тут будут храниться пары {объект, удаленность}
var sorteditems = [];

//получаем для каждого удаленность
items.forEach(getLength);
//сортируем по удаленности. сначала самые ближние. Если поставить {return b.len - a.len;}, то будут сначала самые дальние
var res = sorteditems.sort(function compare(a, b){return a.len - b.len;}); 
//фсе
console.log(res);


//вот тут описано, как получаем для каждого удаленность
function getLength(item, index, array) {
  var len = Math.sqrt(Math.pow(item.x, 2) + Math.pow(item.y, 2));
  sorteditems.push({item, len});
}


UPD: считать текущее положение как (0; 0) - неправильно, поскольку координаты объектов начинаются не относительно пользователя, а относительно общего нуля.
Так что корректный расчет удаленности такой:
1. Получить геопозицию смартфона X и У
2. Для каждого вашего объекта на карте, находим вектор: AB = {item.x - X; item.y - Y}.
3. А потом уже только высчитываем длину вектора АВ (как - описано выше)
Ответ написан
Комментировать
@GreatRash
var point_1 = {
  x: 10,
  y: 20
};

var point_2 = {
  x: 17,
  y: 3
};

var vector = {
  x: point_1.x - point_2.x,
  y: point_1.y - point_2.y
};

var vecror_length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);
var distance = vector_length;
Ответ написан
Комментировать
Deonisius
@Deonisius
Родился в 11110110111 году, 11000 января.
Скрипт (смотрите в конце страницы) и статья, описывающая пример сортировки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы