Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 01.06.2015, 11:24
Аспирант
Отправить личное сообщение для Dark19 Посмотреть профиль Найти все сообщения от Dark19
 
Регистрация: 29.04.2014
Сообщений: 82

рони,
Если не затруднит, можете обьяснить этот кусок кода:
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)
Ответить с цитированием
  #22 (permalink)  
Старый 01.06.2015, 11:40
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

Сообщение от 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
после проверки всех расстояний возвращаем название центра до которого получилось всех короче.
переходим к следующей точке

Последний раз редактировалось рони, 01.06.2015 в 11:43.
Ответить с цитированием
  #23 (permalink)  
Старый 01.06.2015, 14:30
Аспирант
Отправить личное сообщение для Dark19 Посмотреть профиль Найти все сообщения от Dark19
 
Регистрация: 29.04.2014
Сообщений: 82

рони,
Огромное Вам спасибо, я как доделаю все, то выложу полный код с выводом на карту. По большому счету это получается алгоритм к-средних с использованием яндекс карт.
Ответить с цитированием
  #24 (permalink)  
Старый 09.06.2015, 20:19
Аспирант
Отправить личное сообщение для Dark19 Посмотреть профиль Найти все сообщения от Dark19
 
Регистрация: 29.04.2014
Сообщений: 82

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

и все отлично пересылает, но пересылает кучу раз, пока работает цикл, а мне нужно чтобы переслало окончательный результат. Но опять же как и раньше было, если я пишу пересылку после циклов, то уже не видно переменных, которые нужно переслать в php. Каким образом можно переслать обьект postDistance с уже конечными результатами работы циклов?
Ответить с цитированием
  #25 (permalink)  
Старый 09.06.2015, 20:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

Сообщение от Dark19
Каким образом можно переслать обьект postDistance с уже конечными результатами работы циклов?
я вам показал как -- каким образом у вас отправка размножается известно только вам -- в показанных выше вариантах pointsDistance формируется всего один раз -- когда сформировали тогда и отсылайте

замените алерт вашей отправкой и всё
Ответить с цитированием
  #26 (permalink)  
Старый 09.06.2015, 20:40
Аспирант
Отправить личное сообщение для Dark19 Посмотреть профиль Найти все сообщения от Dark19
 
Регистрация: 29.04.2014
Сообщений: 82

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

замените алерт вашей отправкой и всё
извините, точно, не туда смотрел
Ответить с цитированием
  #27 (permalink)  
Старый 10.06.2015, 17:38
Аспирант
Отправить личное сообщение для Dark19 Посмотреть профиль Найти все сообщения от Dark19
 
Регистрация: 29.04.2014
Сообщений: 82

рони,
Вот обновленный код программы:
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;
                                    }
Ответить с цитированием
  #28 (permalink)  
Старый 10.06.2015, 17:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

Dark19,
нет я пас, вы хотите решить задачу коммивояжера
Ответить с цитированием
  #29 (permalink)  
Старый 10.06.2015, 17:51
Аспирант
Отправить личное сообщение для Dark19 Посмотреть профиль Найти все сообщения от Dark19
 
Регистрация: 29.04.2014
Сообщений: 82

рони,
ну что-то типа того, это предусловие к алгоритму Кларка-Райта
Ответить с цитированием
  #30 (permalink)  
Старый 10.06.2015, 18:42
Аспирант
Отправить личное сообщение для Dark19 Посмотреть профиль Найти все сообщения от Dark19
 
Регистрация: 29.04.2014
Сообщений: 82

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
замыкания, почему функция не видит переменные ruvi Общие вопросы Javascript 5 31.05.2014 17:36
Индивидуальные переменные в each Spamol jQuery 6 08.12.2012 14:34
Callback функция и глобальные переменные drunia85 Events/DOM/Window 5 14.10.2012 03:06
Функция не меняет глобальные переменные, считая их локальными alex_oo7 Общие вопросы Javascript 2 13.10.2012 14:32
Функция и переменные wcb-falcon Общие вопросы Javascript 3 03.04.2012 23:44