 
			
				31.05.2015, 13:48
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.04.2014 
					
					
					
						Сообщений: 82
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от рони
			 
		
	 | 
 
	
		Dark19, 
потому что асинхронность когда у сервера есть возможность тогда и отвечает - 1 запрос скажем обрабатывался 100ms а второй 10ms -- в результате ответ на второй пришёл быстрее ответа на первый.
	 | 
 
	
 
 ага, понял. У меня теперь не получается следующая задумка:  
есть 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, 31.05.2015 в 14:02.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				31.05.2015, 14:14
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 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"] ... для последней точки 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				31.05.2015, 15:56
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.04.2014 
					
					
					
						Сообщений: 82
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от рони
			 
		
	 | 
 
	
		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, 31.05.2015 в 16:10.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				31.05.2015, 16:22
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		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>
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось рони, 31.05.2015 в 16:25.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				31.05.2015, 17:30
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		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 выпал до него далеко всем, есть центры ближе
 
это если лететь -- для реальных дорог считать через сервис карт.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось рони, 31.05.2015 в 17:33.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				31.05.2015, 19:42
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.04.2014 
					
					
					
						Сообщений: 82
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		если честно, то не совсем понятно, что здесь происходит, но как я понимаю это функция подсчета расстояний: 
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 сделать ибо я уже совсем запутался  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				31.05.2015, 19:56
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Dark19
			
		
	 | 
 
	| 
		а как мне на ее место подставить функцию подсчета из карт:
	 | 
 
	
 
 как я показал в посте 15 -- но вам это ненужно за вас это сделает  ymaps.route
 
пост 14 строка 56 вам нужно только отсортировать/выбрать нужное из  pointsDistance и всё  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				31.05.2015, 20:10
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.04.2014 
					
					
					
						Сообщений: 82
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от рони
			 
		
	 | 
 
	
		как я показал в посте 15 -- но вам это ненужно за вас это сделает  ymaps.route 
 
пост 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, 31.05.2015 в 20:27.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				31.05.2015, 21:08
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		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>
 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				31.05.2015, 21:16
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		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>
 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |