Цитата:
есть 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, время: 00:57. |