Поворот листовки Полилиния / Прямоугольник - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь повернуть прямоугольник листовки, используя код из этого вопроса .

rotatePoints (center, points, yaw) {
  const res = []
  const angle = yaw * (Math.PI / 180)
  for (let i = 0; i < points.length; i++) {
  const p = points[i]
  // translate to center
  const p2 = new LatLng(p.lat - center.lat, p.lng - center.lng)
  // rotate using matrix rotation
  const p3 = new LatLng(Math.cos(angle) * p2.lat - Math.sin(angle) * p2.lng, Math.sin(angle) * p2.lat + Math.cos(angle) * p2.lng)
  // translate back to center
  const p4 = new LatLng(p3.lat + center.lat, p3.lng + center.lng)
  // done with that point
  res.push(p4)
}
return res
}

Проблема заключается в том, что прямоугольник перекошен при вращении. Есть идеи, как оптимизировать эту функцию?

Исправлено Окончательный код:

rotatePoints (center, points, yaw) {
  const res = []
  const centerPoint = map.latLngToLayerPoint(center)
  const angle = yaw * (Math.PI / 180)
  for (let i = 0; i < points.length; i++) {
    const p = map.latLngToLayerPoint(points[i])
    // translate to center
    const p2 = new Point(p.x - centerPoint.x, p.y - centerPoint.y)
    // rotate using matrix rotation
    const p3 = new Point(Math.cos(angle) * p2.x - Math.sin(angle) * p2.y, Math.sin(angle) * p2.x + Math.cos(angle) * p2.y)
    // translate back to center
    let p4 = new Point(p3.x + centerPoint.x, p3.y + centerPoint.y)
    // done with that point
    p4 = map.layerPointToLatLng(p4)
    res.push(p4)
  }
return res
}

1 Ответ

1 голос
/ 10 марта 2020

Что такое "прямоугольник" на сфере? Это результат применения текущей проекции к таким координатам, что их изображение на карте / экране образует прямоугольник. Обратите внимание, что координаты широты и длины не должны быть равными для каждой стороны прямоугольника (например, долгота для выровненного по экватору прямоугольника будет отличаться для верхней и нижней точек в большинстве обычных проекций)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...