Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция не видит переменные (https://javascript.ru/forum/misc/56100-funkciya-ne-vidit-peremennye.html)

Dark19 29.05.2015 17:36

Функция не видит переменные
 
Добрый день, подскажите как правильно записать. Вот код:
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<centroids.length;i++){
            for(j;j<points.length;j++){
                ymaps.route([centroids[i]['point'], points[j]['point']]).then(function (router) {

                        distance = Math.round(router.getLength() / 1000);
                    });
            }
        }
});


До функции ymaps.route([centroids[i]['point'], points[j]['point']]) внутри цикла точки и i,j выводит нормально, а вот внутри функции уже не видит их и получается, что на вход не подаются данные

Dark19 30.05.2015 18:02

с этим разобрался, там я j забыл обнулить после прохождения внутреннего цикла, но вот еще одна проблема: в переменную distance записывается число внутри функции, но после функции в цикле я его не могу вывести, потому что его уже нету. Вот код:
for(j;j<points.length;j++){
                ymaps.route([centroids[i]['point'], points[j]['point']]).then(function (router) {
                        distance = Math.round(router.getLength() / 1000);
                    });
                var result =
                {
                    mas: centroids[i]['object'],
                    point: points[j]['point'],
                    distance: distance
                };
                console.log(result);
            }


Как мне правильно записать, чтобы то число с функции можно было вывести после нее в цикле?

рони 30.05.2015 18:30

Dark19,
так может вам и строку 5 перенести в конец 3 строки?

Dark19 30.05.2015 18:34

Цитата:

Сообщение от рони (Сообщение 373209)
Dark19,
так может вам и строку 5 перенести в конец 3 строки?

тогда там i и j неправильно считает, когда пишу
console.log(i);

выводит 24 четверки
а когда
console.log(j);

выводит 24 нуля

рони 30.05.2015 18:39

Dark19,
for(j;j<points.length;j++){
            (function(a, b) {
                ymaps.route([centroids[a]['point'], points[b]['point']]).then(function (router) {
                        distance = Math.round(router.getLength() / 1000);

                var result =
                {
                    mas: centroids[a]['object'],
                    point: points[b]['point'],
                    distance: distance
                };
                console.log(result);  });
            })(i,j)
            }

Dark19 30.05.2015 18:48

спасибо, я б такое со своими знаниями в js не сделал
еще вопросик: можно ли передать координаты в обьект не как массив с двух элементов как сделано тут
point: points[b]['point']
, а в таком виде [47.6686,32.4040], но не строкой? Вот тут
ymaps.route([centroids[a]['point'], points[b]['point']])

передаются именно так.

рони 30.05.2015 18:52

Dark19,
не понял вопроса.

Dark19 30.05.2015 18:57

не все нормально, это я неправильно выводил, спасибо еще раз

Dark19 30.05.2015 20:25

Цитата:

Сообщение от рони (Сообщение 373212)
Dark19,
for(j;j<points.length;j++){
            (function(a, b) {
                ymaps.route([centroids[a]['point'], points[b]['point']]).then(function (router) {
                        distance = Math.round(router.getLength() / 1000);

                var result =
                {
                    mas: centroids[a]['object'],
                    point: points[b]['point'],
                    distance: distance
                };
                console.log(result);  });
            })(i,j)
            }

это не столь важно, но все же интересно. Почему вывод идет не по порядку как идет цикл, а в разнобой?
Object {mas: "A", point: Array[2], distance: 143}
map.js:79 Object {mas: "A", point: Array[2], distance: 98}
map.js:79 Object {mas: "A", point: Array[2], distance: 276}
map.js:79 Object {mas: "C", point: Array[2], distance: 122}
map.js:79 Object {mas: "B", point: Array[2], distance: 264}
map.js:79 Object {mas: "D", point: Array[2], distance: 237}
map.js:79 Object {mas: "C", point: Array[2], distance: 247}
map.js:79 Object {mas: "D", point: Array[2], distance: 177}
map.js:79 Object {mas: "B", point: Array[2], distance: 272}
map.js:79 Object {mas: "A", point: Array[2], distance: 410}
map.js:79 Object {mas: "C", point: Array[2], distance: 370}
map.js:79 Object {mas: "A", point: Array[2], distance: 491}
map.js:79 Object {mas: "B", point: Array[2], distance: 526}
map.js:79 Object {mas: "C", point: Array[2], distance: 285}
map.js:79 Object {mas: "C", point: Array[2], distance: 394}
map.js:79 Object {mas: "D", point: Array[2], distance: 341}
map.js:79 Object {mas: "D", point: Array[2], distance: 358}
map.js:79 Object {mas: "A", point: Array[2], distance: 620}
map.js:79 Object {mas: "D", point: Array[2], distance: 434}
map.js:79 Object {mas: "B", point: Array[2], distance: 477}
map.js:79 Object {mas: "D", point: Array[2], distance: 485}
map.js:79 Object {mas: "C", point: Array[2], distance: 320}
map.js:79 Object {mas: "B", point: Array[2], distance: 828}
map.js:79 Object {mas: "B", point: Array[2], distance: 754}

рони 30.05.2015 21:36

Dark19,
потому что асинхронность когда у сервера есть возможность тогда и отвечает - 1 запрос скажем обрабатывался 100ms а второй 10ms -- в результате ответ на второй пришёл быстрее ответа на первый.

Dark19 31.05.2015 13:48

Цитата:

Сообщение от рони (Сообщение 373225)
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;
        }
});

рони 31.05.2015 14:14

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"] ... для последней точки

Dark19 31.05.2015 15:56

Цитата:

Сообщение от рони (Сообщение 373247)
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++;
                        }


может я что-то не так понял

рони 31.05.2015 16:22

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 17:30

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 выпал до него далеко всем, есть центры ближе

это если лететь -- для реальных дорог считать через сервис карт.

Dark19 31.05.2015 19:42

если честно, то не совсем понятно, что здесь происходит, но как я понимаю это функция подсчета расстояний:
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

Цитата:

Сообщение от Dark19
а как мне на ее место подставить функцию подсчета из карт:

как я показал в посте 15 -- но вам это ненужно за вас это сделает ymaps.route

пост 14 строка 56 вам нужно только отсортировать/выбрать нужное из pointsDistance и всё

Dark19 31.05.2015 20:10

Цитата:

Сообщение от рони (Сообщение 373285)
как я показал в посте 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'?

рони 31.05.2015 21:08

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

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>

Dark19 01.06.2015 11:24

рони,
Если не затруднит, можете обьяснить этот кусок кода:
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)

рони 01.06.2015 11:40

Цитата:

Сообщение от Dark19
var d = c.A,

взять любое расстояние до любого цетра -- (в данном случае до центра "A")
Цитата:

Сообщение от Dark19
centre = "A";

сохранить название центра
Цитата:

Сообщение от Dark19
for (var k in c) {

пройтись по всем расстояниям
Цитата:

Сообщение от Dark19
var h = c[k];

сохраняем расстояние в буфер
Цитата:

Сообщение от Dark19
k != "length"

если мы точно на ключе с расстоянием
Цитата:

Сообщение от Dark19
h < d

и расстояние в буфере меньше эталонного
Цитата:

Сообщение от Dark19
(d = h, centre = k)

меняем эталонное расстояние на буферное и запоминаем название: новый центр до которого короче
Цитата:

Сообщение от рони
return centre

после проверки всех расстояний возвращаем название центра до которого получилось всех короче.
переходим к следующей точке

Dark19 01.06.2015 14:30

рони,
Огромное Вам спасибо, я как доделаю все, то выложу полный код с выводом на карту. По большому счету это получается алгоритм к-средних с использованием яндекс карт.

Dark19 09.06.2015 20:19

рони,
Опять я вернулся в эту тему, немного почитал литературы и решил продолжить написание. Так вот возникает такая проблема: мне на дальнейшую обработку данных нужно переслать ajax'ом в php их, а конкретно обьект postDistance. Я делаю так:
$.ajax({
                                type: "POST",
                                url: "http://geotest/ajax.php",
                                data: { zakaz:pointsDistance },
                                success: function(msg){
                                    console.log(msg);
                                }
                            });

и все отлично пересылает, но пересылает кучу раз, пока работает цикл, а мне нужно чтобы переслало окончательный результат. Но опять же как и раньше было, если я пишу пересылку после циклов, то уже не видно переменных, которые нужно переслать в php. Каким образом можно переслать обьект postDistance с уже конечными результатами работы циклов?

рони 09.06.2015 20:27

Цитата:

Сообщение от Dark19
Каким образом можно переслать обьект postDistance с уже конечными результатами работы циклов?

я вам показал как -- каким образом у вас отправка размножается известно только вам -- в показанных выше вариантах pointsDistance формируется всего один раз -- когда сформировали тогда и отсылайте

замените алерт вашей отправкой и всё

Dark19 09.06.2015 20:40

Цитата:

Сообщение от рони (Сообщение 374550)
я вам показал как -- каким образом у вас отправка размножается известно только вам -- в показанных выше вариантах pointsDistance формируется всего один раз -- когда сформировали тогда и отсылайте

замените алерт вашей отправкой и всё

извините, точно, не туда смотрел

Dark19 10.06.2015 17:38

рони,
Вот обновленный код программы:
function init() {
    var myMap = new ymaps.Map('map', {
            center: [49.2469, 31.4811],
            zoom: 6,
            type: 'yandex#map',
            behaviors: ['scrollZoom', 'drag'],
            controls: []
        });
                var centroids = [{
                    object: "A",
                    point: [50.4404, 30.5582],
                    color: '#ff0000'
                    }, {
                    object: "B",
                    point: [49.3905, 27.0426],
                    color: '#B723FF'
                    }, {
                    object: "C",
                    point: [48.4931, 32.2721],
                    color: '#32B51D'
                    }, {
                    object: "D",
                    point: [49.5623, 34.5573],
                    color: '#1E98FF'
                    }];

                var points = [{
                    point: [50.2153, 29.5036],
                    weight: 150,
                    name: 'a'
                    }, {
                    point: [50.3561, 32.1842],
                    weight: 200,
                    name: 'b'
                    }, {
                    point: [48.5515, 29.5915],
                    weight: 250,
                    name: 'c'
                    }, {
                    point: [47.6686, 32.4040],
                    weight: 300,
                    name: 'd'
                    }, {
                    point: [48.6972, 35.7438],
                    weight: 500,
                    name: 'e'
                    }, {
                    point: [47.1016, 35.2604],
                    weight: 400,
                    name: 'f'
                    }, {
                    point: [50.0390, 25.2796],
                    weight: 700,
                    name: 'g'
                    }];


                var i = 0;
                var j = 0;
                var k = 0,
                centerDistance = [];

        $('#map').click(function(e) {
                for (i; i < points.length; i++) {
                    centerDistance[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);
                                //вывод центроидов
                                var placemark1 = new ymaps.Placemark(centroids[b]['point'], { iconContent: centroids[b]['object'] }, {
                                    // Задаем стиль метки (метка в виде круга).
                                    preset: 'islands#darkGreenCircleIcon',
                                    // Задаем цвет метки (в формате RGB).
                                    iconColor: centroids[b]['color']
                                });
                                myMap.geoObjects.add(placemark1);

                                centerDistance[a][centroids[b]["object"]] = distance;
                                centerDistance[a]["length"]++;
                                if (centerDistance[a]["length"] == centroids.length){
                                    centerDistance[k]['point'] = points[k]['point'];
                                    centerDistance[k]['name'] = points[k]['name'];
                                    k++;
                                }
                                if (k == points.length) {
                                    centerDistance = centerDistance.map(function(c, b) {
                                        var d = c.A, point = centerDistance[b]['point'],name = centerDistance[b]['name'],
                                            centre = "A";
                                        for (var k in c) {
                                            var h = c[k];
                                            k != "length" && h < d && (d = h, centre = k);
                                        }
                                        var centerPoints = {
                                            center: centre,
                                            point: point,
                                            dist: d,
                                            name: name
                                        };
                                        return centerPoints;
                                    });

                                    //подбор цвета точки с помощью сравнения каждого центра (буквы) с буквой центроида
                                    for(var n in centerDistance)
                                        for(var z in centroids){
                                            //если буквы совпадают, то записываем цвет в текущую точку с такой же буквой
                                            if(centerDistance[n]['center']==centroids[z]['object'])
                                                centerDistance[n]['color']=centroids[z]['color'];
                                        }

                                    for(var m in centerDistance){
                                            //вывод точек
                                            var placemark2 = new ymaps.Placemark(centerDistance[m]['point'], { iconContent: centerDistance[m]['center'] }, {
                                                // Задаем стиль метки (метка в виде круга).
                                                preset: "islands#dotCircleIcon",
                                                // Задаем цвет метки (в формате RGB).
                                                iconColor: centerDistance[m]['color']
                                            });
                                            myMap.geoObjects.add(placemark2);

                                       
                                    }

                                    for(m=0;m<points.length;m++){
                                      
                                        for(n=0;n<points.length;n++){
                                            (function(c, e) {
                                                if((centerDistance[c]['center']==centerDistance[e]['center']) && (centerDistance[c]['point']!=centerDistance[e]['point'])){
                                                    
                                                    ymaps.route([centerDistance[c]['point'], centerDistance[e]['point']]).then(function(router) {
                                                        var dist = Math.round(router.getLength() / 1000);

                                                    });
                                                }
                                            })(m, n)
                                        }
                                        n=0;
                                    }
                                    
                                }

                            });
                        })(i, j)
                    }
                    j = 0;

                }
        });





   }

ymaps.ready(init);


Пытаюсь как в предыдущем примере найти расстояния, только уже не точка с центроидом, а точка которая принадлежит центроиду с другими точками этого же центроида. Например, точка принадлежит к центроиду А, то нужно найти расстояния этой точки со всеми остальными точками по очереди, которые тоже принадлежат этому центроиду. И так каждую точку: точка А1 и точка А2, точка А1 и точка А3, ... , точкаА1 и точка Аn; точка А2 и точка А3, точка А2 и точка А4, ... , точкаА2 и точка Аn; и так со всеми точками. Также, я думаю, их нужно будет записывать в массив? потому что потом нужно будет работать с предыдущим массивом centerDistance и этим. И, наверное, нужно обозначить как-то эти точки именами? я подавал им маленькие буквы англ. алфавита, может им просто номера дать, так проще будет?

Вот я пытался делать такую задумку, но что-то уже на начальном этапе не очень получается:
for(m=0;m<points.length;m++){
                                        //console.log(pointsDistance);
                                        for(n=0;n<points.length;n++){
                                            (function(c, e) {
                                                if((centerDistance[c]['center']==centerDistance[e]['center']) && (centerDistance[c]['point']!=centerDistance[e]['point'])){
                                                    console.log(centerDistance[c]['point'],centerDistance[e]['point']);
                                                    ymaps.route([centerDistance[c]['point'], centerDistance[e]['point']]).then(function(router) {
                                                        var dist = Math.round(router.getLength() / 1000);

                                                    });
                                                }
                                            })(m, n)
                                        }
                                        n=0;
                                    }

рони 10.06.2015 17:48

Dark19,
нет я пас, вы хотите решить задачу коммивояжера

Dark19 10.06.2015 17:51

рони,
ну что-то типа того, это предусловие к алгоритму Кларка-Райта

Dark19 10.06.2015 18:42

рони,
подскажите хоть почему когда я в точке меняю name: 'a', name: 'b',... на цифры, то в поле center обьекта centerDistance записывается слово name и вообще все не правильно рассчитывается?

рони 10.06.2015 18:56

Dark19,
не могу вам более помочь, стека не хватает )))

Dark19 10.06.2015 19:05

Цитата:

Сообщение от рони (Сообщение 374676)
Dark19,
не могу вам более помочь, стека не хватает )))

в смысле не хватает стека?
я немного по другому решил эту проблему, но причину точно так и не понял, нашел только где это происходит

рони 10.06.2015 19:11

Цитата:

Сообщение от Dark19
в смысле не хватает стека?

нет ресурсов чтоб осмыслить ваш код, какие были идеи, вам уже показал.

Dark19 10.06.2015 19:13

Цитата:

Сообщение от рони (Сообщение 374683)
нет ресурсов чтоб осмыслить ваш код, какие были идеи, вам уже показал.

эх, ладно, дальше сам буду, я просто с js недавно работаю, не понимаю многих вещей...

Dark19 13.06.2015 15:05

рони,
и все таки нужна Ваша помощь. Есть перебор точек по условию и нужно когда все точки уже перебрались, передать обьект в php. Я вроде бы логично делаю: проверяю если первый и второй цикл дошел до конца присваиваю переменной единицу
if ((e==points.length-1) && (f==points.length-1))
                                                    d=1;

а в самом цикле проверяю если переменная == 1, то посылаю данные
if(d==1){
                                                            console.log(pointsDistance);
                                                            $.ajax({
                                                                type: "POST",
                                                                url: "http://geotest/ajax.php",
                                                                data: { centerDist:centerDistance,pointDist:pointsDistance },
                                                                success: function(msg){
                                                                    $("#result").empty();
                                                                    $("#result").append(msg);
                                                                }
                                                            });

                                                        }
                                                    });
, но оно доходит до конца циклов и еще посылает кучу раз эти данные. Как сделать чтобы дошло до окончания перебора и один раз переслало обьект?

Вот весь кусок:

var pointsDistance = [],d=0;
                                    for(m=0;m<points.length;m++){
                                        //console.log(pointsDistance);

                                        for(n=0;n<points.length;n++){
                                            (function(e, f) {
                                                //проверяем ровняется ли центр первой точки с любой другой и не равна ли эта точка себе же и больше ли у нее идентификатор чем у найденой
                                                if((centerDistance[e]['center']==centerDistance[f]['center']) && (centerDistance[e]['point']!=centerDistance[f]['point'])
                                                    &&(centerDistance[e]['name']>centerDistance[f]['name']) ){
                                                    //рассчитываем растояние между найдеными точками одной зоны
                                                    ymaps.route([centerDistance[e]['point'], centerDistance[f]['point']]).then(function(router) {
                                                        var dist = Math.round(router.getLength() / 1000);

                                                        pointsDistance [e]= {
                                                            name: centerDistance[e]['name'] + centerDistance[f]['name'],
                                                            distance: dist,
                                                            center: centerDistance[e]['center'],
                                                            kmwin: centerDistance[e]['dist'] + centerDistance[f]['dist'] - dist
                                                        };
                                                        var route = router.getPaths();
                                                        route.options.set({ strokeWidth: 3, strokeColor: centerDistance[f]['color'], opacity: 0.5 });
                                                        myMap.geoObjects.add(route);
                                                        console.log(d);
                                                        if(d==1){
                                                            console.log(pointsDistance);
                                                            $.ajax({
                                                                type: "POST",
                                                                url: "http://geotest/ajax.php",
                                                                data: { centerDist:centerDistance,pointDist:pointsDistance },
                                                                success: function(msg){
                                                                    $("#result").empty();
                                                                    $("#result").append(msg);
                                                                }
                                                            });

                                                        }
                                                    });

                                                }                                                
                                                console.log(e,f);
                                                if ((e==points.length-1) && (f==points.length-1))
                                                    d=1;
                                            })(m, n)
                                        }
                                        n=0;
                                    }

рони 13.06.2015 15:27

Dark19,
немогу помочь, причину смотрите выше, проблема слабо локализована.


Часовой пояс GMT +3, время: 12:29.