Цитата:
есть 4 центра(количество произвольно) со своими координатами var centroids = [ { object: "A", point: [50.4404, 30.5582] }, { object: "B", point: [49.3905, 27.0426] }, { object: "C", point: [48.4931, 32.2721] }, { object: "D", point: [49.5623, 34.5573] } ]; и есть 6 точек(количество произвольно) со своими координатами var points = [ { point: [50.2153, 29.5036] }, { point: [50.3561, 32.1842] }, { point: [48.5515, 29.5915] }, { point: [47.6686, 32.4040] }, { point: [48.6972, 35.7438] }, { point: [47.1016, 35.2604] } ]; ![]() И нужно перебрать точки так, чтобы распределить их между центрами: к какому центру точка ближе, тому она и принадлежит. Но выходит, что при каждой итерации узнается только дистанция к каждому центру определенной точки, перебрать и узнать к какому центру эта точка ближе не получается. Перебрать точки на близлежащую во внутреннем цикле невозможно, а вне если сохранять дистанции в массив или обьект, то вне функции его уже не видно. Как можно перебрать значения и распределить точки по центрам? Может подскажите как внутри функции их перебрать, а то я что-то вообще не могу придумать ничего? Привожу полный код: var centroids = [ { object: "A", point: [50.4404, 30.5582] }, { object: "B", point: [49.3905, 27.0426] }, { object: "C", point: [48.4931, 32.2721] }, { object: "D", point: [49.5623, 34.5573] } ]; var points = [ { point: [50.2153, 29.5036] }, { point: [50.3561, 32.1842] }, { point: [48.5515, 29.5915] }, { point: [47.6686, 32.4040] }, { point: [48.6972, 35.7438] }, { point: [47.1016, 35.2604] } ]; var distance = 0; var i =0; var j = 0; $('#map').click(function(e) { for(i;i<points.length;i++){ for(j;j<centroids.length;j++){ (function(a, b) { ymaps.route([points[a]['point'], centroids[b]['point']]).then(function (router) { distance = Math.round(router.getLength() / 1000); var result = { mas: centroids[b]['object'], point: points[a]['point'], distance: distance }; }); })(i,j) } j=0; } }); |
Dark19,
var k = 0, pointsDistance = []; ... pointsDistance[a] = {length : 0} pointsDistance[a]["A"] = "A-distance " pointsDistance[a]["length"]++; if(pointsDistance[a]["length"] == 4) k++; if (k == 4) вычисляем что больше pointsDistance[0]["A"] или pointsDistance[0]["B"] ... для первой точки вычисляем что больше pointsDistance[5]["A"] или pointsDistance[5]["B"] ... для последней точки |
Цитата:
var k = 0, pointsDistance = []; pointsDistance[a] = {length : b};//записываем в массив обьект с итерацией центров if(pointsDistance[a]["length"] == 0) pointsDistance[a]["A"] = distance;//добавляем в массив букву к которой принадлежит дистанция if(pointsDistance[a]["length"] == 1) pointsDistance[a]["B"] = distance;//добавляем в массив букву к которой принадлежит дистанция if(pointsDistance[a]["length"] == 2) pointsDistance[a]["C"] = distance;//добавляем в массив букву к которой принадлежит дистанция if(pointsDistance[a]["length"] == 3) pointsDistance[a]["D"] = distance;//добавляем в массив букву к которой принадлежит дистанция pointsDistance[a]["length"]++; if(pointsDistance[a]["length"] == 4){ var arr = [ pointsDistance[k]["A"],pointsDistance[k]["B"],pointsDistance[k]["C"],pointsDistance[k]["D"] ]; var klusters = arr.min(); k++; } может я что-то не так понял |
Dark19,
<script> var centroids = [ { object: "A", point: [50.4404, 30.5582] }, { object: "B", point: [49.3905, 27.0426] }, { object: "C", point: [48.4931, 32.2721] }, { object: "D", point: [49.5623, 34.5573] } ]; var points = [ { point: [50.2153, 29.5036] }, { point: [50.3561, 32.1842] }, { point: [48.5515, 29.5915] }, { point: [47.6686, 32.4040] }, { point: [48.6972, 35.7438] }, { point: [47.1016, 35.2604] } ]; var i =0; var j = 0; var k = 0, pointsDistance = []; $('#map').click(function(e) { for(i;i<points.length;i++){ pointsDistance[i] = {length : 0} for(j;j<centroids.length;j++){ (function(a, b) { ymaps.route([points[a]['point'], centroids[b]['point']]).then(function (router) { var distance = Math.round(router.getLength() / 1000); pointsDistance[a][centroids[b]["object"]] = distance pointsDistance[a]["length"]++; if(pointsDistance[a]["length"] == centroids.length) k++; if (k == points.length) {console.log(pointsDistance)} //пора вычислять }); })(i,j) } j=0; } }); </script> |
Dark19,
без сервиса карт это будет так <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script> $(function() { var a = [{ object: "A", point: [50.4404, 30.5582] }, { object: "B", point: [49.3905, 27.0426] }, { object: "C", point: [48.4931, 32.2721] }, { object: "D", point: [49.5623, 34.5573] }], e = [], f = function(b, c) { var d = b[0] - c[0], a = b[1] - c[1]; return Math.sqrt(d * d + a * a) }; $.each([{ point: [50.2153, 29.5036] }, { point: [50.3561, 32.1842] }, { point: [48.5515, 29.5915] }, { point: [47.6686, 32.404] }, { point: [48.6972, 35.7438] }, { point: [47.1016, 35.2604] }], function(b, c) { var d = f(c.point, a[0].point); e[b] = a[0].object; $.each(a, function(a, g) { var h = f(c.point,g.point); h < d && (d = h, e[b] = g.object) }) }); alert(e) }); </script> </head> <body> </body> </html> итого: точки 0,1,2 ближе к центру 0 точка 3 ближе к центру 2 точки 4,5 ближе к центру 3 центр 1 выпал до него далеко всем, есть центры ближе это если лететь -- для реальных дорог считать через сервис карт. |
если честно, то не совсем понятно, что здесь происходит, но как я понимаю это функция подсчета расстояний:
f = function(b, c) { var d = b[0] - c[0], a = b[1] - c[1]; return Math.sqrt(d * d + a * a) }; а как мне на ее место подставить функцию подсчета из карт: ymaps.route([b, c]).then(function (router) { var distance = Math.round(router.getLength() / 1000); }); тут нельзя же так return сделать ибо я уже совсем запутался |
Цитата:
пост 14 строка 56 вам нужно только отсортировать/выбрать нужное из pointsDistance и всё |
Цитата:
for (var key1 in pointsDistance) for (var key2 in pointsDistance [key1]) console.log(pointsDistance [key1] [key2]); но оно мне, как то странно выводит, не все элементы, в одном внутреннем обьекте выведет, то 4, то 3 элемента. А если вот так вот просто без циклов console.log(pointsDistance); то бывает не все обьекты выведет, то1, то 2, то 4. Может ли глючить консоль или у нее какие ограничения может есть или я неправильно вывожу. А вот такая запись for (var key1 in pointsDistance) for (var key2 in pointsDistance [key1]) console.log(pointsDistance [key1] [key2]['A']); должна по идее выводить все значения поля 'A'? |
Dark19,
<!DOCTYPE html> <html> <head> </head> <body> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script type="text/javascript"> var mapsScript = document.createElement('script'); mapsScript.onload = function() { ymaps.ready(init); } mapsScript.src = 'http://api-maps.yandex.ru/2.1/?lang=ru_RU'; document.body.appendChild(mapsScript); var myMap; function init () { var centroids = [ { object: "A", point: [50.4404, 30.5582] }, { object: "B", point: [49.3905, 27.0426] }, { object: "C", point: [48.4931, 32.2721] }, { object: "D", point: [49.5623, 34.5573] } ]; var points = [ { point: [50.2153, 29.5036] }, { point: [50.3561, 32.1842] }, { point: [48.5515, 29.5915] }, { point: [47.6686, 32.4040] }, { point: [48.6972, 35.7438] }, { point: [47.1016, 35.2604] } ]; var i =0; var j = 0; var k = 0, pointsDistance = []; for(i;i<points.length;i++){ pointsDistance[i] = {length : 0} for(j;j<centroids.length;j++){ (function(a, b) { ymaps.route([points[a]['point'], centroids[b]['point']]).then(function (router) { var distance = Math.round(router.getLength() / 1000); pointsDistance[a][centroids[b]["object"]] = distance pointsDistance[a]["length"]++; if(pointsDistance[a]["length"] == centroids.length) k++; if (k == points.length) { $.each(pointsDistance, function(b, c) { var d = c.A, centre = "A"; for(var k in c) { var h = c[k]; k != "length" && h < d && (d = h, centre = k) } pointsDistance[b] = centre }); alert(pointsDistance) } }); })(i,j) } j=0; } ; } </script> </body> </html> |
Dark19,
или совсем без jquery <!DOCTYPE html> <html> <head> </head> <body> <script type="text/javascript"> var mapsScript = document.createElement('script'); mapsScript.onload = function() { ymaps.ready(init); } mapsScript.src = 'http://api-maps.yandex.ru/2.1/?lang=ru_RU'; document.body.appendChild(mapsScript); var myMap; function init() { var centroids = [{ object: "A", point: [50.4404, 30.5582] }, { object: "B", point: [49.3905, 27.0426] }, { object: "C", point: [48.4931, 32.2721] }, { object: "D", point: [49.5623, 34.5573] }]; var points = [{ point: [50.2153, 29.5036] }, { point: [50.3561, 32.1842] }, { point: [48.5515, 29.5915] }, { point: [47.6686, 32.4040] }, { point: [48.6972, 35.7438] }, { point: [47.1016, 35.2604] }]; var i = 0; var j = 0; var k = 0, pointsDistance = []; for (i; i < points.length; i++) { pointsDistance[i] = { length: 0 } for (j; j < centroids.length; j++) { (function(a, b) { ymaps.route([points[a]['point'], centroids[b]['point']]).then(function(router) { var distance = Math.round(router.getLength() / 1000); pointsDistance[a][centroids[b]["object"]] = distance pointsDistance[a]["length"]++; if (pointsDistance[a]["length"] == centroids.length) k++; if (k == points.length) { pointsDistance = pointsDistance.map(function(c, b) { var d = c.A, centre = "A"; for (var k in c) { var h = c[k]; k != "length" && h < d && (d = h, centre = k) } return centre }); alert(pointsDistance) } }); })(i, j) } j = 0; }; } </script> </body> </html> |
Часовой пояс GMT +3, время: 21:33. |