Клуб API Карт

Изменение вершин многоугольника при перетаскивании одной из них.

Пост в архиве.
ipzaur
21 декабря 2010, 12:27

Здравствуйте!

У меня случилась вот такая вот задачка:

Есть четырёхугольный полигон, который прямоугольник. Нужно сделать так, чтобы при перетаскивании одной из вершин прямоугольник оставался прямоугольником. То есть нужно каким-то образом автоматом перетащить соседние вершины (у одной изменить позицию по X, у другой по Y). На рисунке ниже я продемонстрировал, что претаскивается вершина с индексом 1 и автоматом должны перетащиться вершины 0 и 2 так, чтобы вновь образовался прямоугольник.

Проштудировав Яндекс (как материалы по API, так и просто через поисковик) и Гуголь, наткнулся на мысль, что вся тема должна быть где-то в функции "onPointDragging". Попробовал теста ради пока решить задачу для вершины с индексом 1 и сделал вот так:

polygon.setEditingOptions({
  drawing: false,
  maxPoints: 4,
  onPointDragging: function(points, index, flag) {
    if (index==1) {
      points[0].setY(points[1].getY());
      points[2].setX(points[1].getX());
      alert(points[2].getX() + ' = ' + points[1].getX());
    }
    return points[index];
  }
});

но ничего не получилось. При перетаскивании вершины 1, вершины 0 и 2 остаются на прежнем месте, хотя при этом алерт сообщает о том, что координата X у вершины 2 всё же сместилась.

 

Вопрос: в какую сторону мне копать, чтобы решить данную задачу?

2 комментария
Направление вы выбрали верное, только вершины нужно менять напрямую через интерфейс полигона. Примерно так:

            onPointDragging: function(points, index, flag) {
                if (index==1) {
                    var point1 = points[0].setY(points[1].getY()),
                        point2 = points[2].setX(points[1].getX());
                    polygon.splicePoints(0, 1, map.converter.mapPixelsToCoordinates(point1));
                    polygon.splicePoints(2, 1, map.converter.mapPixelsToCoordinates(point2));
                }
                return points[index];
            }

Только увы координаты таскаемой вершины менять нельзя. Поэтому scale, который вы хотите, будет выглядеть немного нетрадиционно ).
Постараемся в следующих версиях исправить.
вот оно как. теперь ясно. спасибо большое, всё заработало :)