@RobinBobinBarabek

Можно как-то отрефакторить данный код?

function addPointCenter(id, c) {
    let lastEl = latlng[latlng.length - 1];

    let latLeft;
    let lngLeft;
    let latRight;
    let lngRight;

    /* 
    если id равен первому элементу, то сравниваю значения с последним элементом массива и помещаю значение в массив перед ним, и сравниваю со следующим элемнтом и помещаю значение после него
    если id равен последнему элементу, то сравниваю его со сзначением первого элемента массива и помещаю после него в массив, и сравниваю со значением предыдущего элемента и помещаю значение между ними
    иначе сравниваю значения с предыдущим и следующим значением
    */
    if (id == 0) {
        latLeft = (lastEl.lat + latlng[id].lat) / 2;
        lngLeft = (lastEl.lng + latlng[id].lng) / 2;

        latRight = (latlng[id + 1].lat + latlng[id].lat) / 2;
        lngRight = (latlng[id + 1].lng + latlng[id].lng) / 2;

        latlng.splice(id, 0, { lat: latLeft, lng: lngLeft });
        latlng.splice(id + 2, 0, { lat: latRight, lng: lngRight });
    } else if (id == latlng.length - 1) {
        latLeft = (latlng[0].lat + latlng[id].lat) / 2;
        lngLeft = (latlng[0].lng + latlng[id].lng) / 2;
        latlng.splice(id + 1, 0, { lat: latLeft, lng: lngLeft });

        latRight = (latlng[id - 1].lat + latlng[id].lat) / 2;
        lngRight = (latlng[id - 1].lng + latlng[id].lng) / 2;
        latlng.splice(id, 0, { lat: latRight, lng: lngRight });
    } else {
        latLeft = (latlng[id - 1].lat + latlng[id].lat) / 2;
        lngLeft = (latlng[id - 1].lng + latlng[id].lng) / 2;

        latRight = (latlng[id + 1].lat + latlng[id].lat) / 2;
        lngRight = (latlng[id + 1].lng + latlng[id].lng) / 2;

        latlng.splice(id, 0, { lat: latLeft, lng: lngLeft });
        latlng.splice(id + 2, 0, { lat: latRight, lng: lngRight });
    }
    drawMarkers();

    console.log('id: ', id);
    console.log('coor new pos.: ', c);
    console.log('splice: ', latlng)
}
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Если правильно понял, в массиве лежит «кольцо» точек. Первая соседствует с последней.
И к любой выбранной точке надо добавить две новые, слева и справа, с усреднёнными с соседями координатами.
function addPointCenter(index) {
  const avg = (a, b) => (a + b) / 2;
  const midPoint = (p1, p2) => ({ lat: avg(p1.lat, p2.lat), lng: avg(p1.lng, p2.lng) });
  const insert = (index, point) => latlng.splice(index, 0, point);

  const { length } = latlng;
  const current = latlng[index];

  const indexLeft = (index - 1 + length) % length;
  const pointLeft = midPoint(current, latlng[indexLeft]);

  const indexRight = (index + 1) % length;
  const pointRight = midPoint(current, latlng[indexRight]);

  insert(index + 1, pointRight);
  insert(index, pointLeft);

  drawMarkers();
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const prevId = (id + latlng.length - 1) % latlng.length;
const nextId = (id + 1) % latlng.length;

const latLeft = (latlng[prevId].lat + latlng[id].lat) / 2;
const lngLeft = (latlng[prevId].lng + latlng[id].lng) / 2;
const latRight = (latlng[id].lat + latlng[nextId].lat) / 2;
const lngRight = (latlng[id].lng + latlng[nextId].lng) / 2;

latlng.splice(id, 0, { lat: latLeft, lng: lngLeft });
latlng.splice(id + 2, 0, { lat: latRight, lng: lngRight });
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы