Рассчитать координаты точки на основе синуса / косинуса - PullRequest
0 голосов
/ 06 июля 2018

позвольте мне начать с того, что я прочитал Рассчитать точку A из заданной точки E и угла, а затем вычислить точку A из E и угла , Рассчитать точку, учитывая x, y, угол и расстояние , проблема с функциями тригонометрии и особенно Как получить координаты точки в системе координат на основе угла и расстояния , и ни одна из них не смогла подними завесу растерянности, окружающую меня.

Что я делаю: Я хочу создать некое мгновенное поле зрения (FOV) для набора последовательностей точек; поля зрения будут представлять то, что видно из каждой точки, в зависимости, конечно, от направления, в котором мы смотрим (0 - север; 90 - восток; 180 - юг; 270 - запад; 360 - север). FOV - это, по сути, треугольник, где центральной (C) вершиной является сама точка, вершина A и вершина B, чьи координаты я ищу, являются теми, которые связаны с основанием треугольника.

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

enter image description here

--------- VERTEX -------------

for (p in 1:nrow(pnp.90.deg@data)){   #pnp is the spatial points dataframe, containing attribute information such as lon/lat(coordinates) and ca(camera angle - showing the direction of sight/movement in degrees)
   a_alfa1 <- pnp.90.deg@data$ca - (pnp.90.deg@data$ca - 60)
   a_alfa1rad <- a_alfa1 * (pi/180)
   a_x1 <- pnp.90.deg@data$lon + 0.00035 * cos(a_alfa1rad)
   a_y1 <- pnp.90.deg@data$lat + 0.00035 * sin(a_alfa1rad) 
   avert1 <- cbind(a_x1, a_y1)
   colnames(avert1) <- c("lon", "lat") 
   avert.90<-SpatialPoints(avert1, proj4string=CRS("+proj=longlat +datum=WGS84      +no_defs +ellps=WGS84 +towgs84=0,0,0"), bbox=NULL) 
 }

--------- B VERTEX -------------

for (p in 1:nrow(pnp.90.deg@data)){
  b_alfa1 <- pnp.90.deg@data$ca - (pnp.90.deg@data$ca + 60)
  b_alfa1rad <- b_alfa1 * (pi/180)
  b_x1 <- pnp.90.deg@data$lon + 0.00035 * cos(b_alfa1rad)
  b_y1 <- pnp.90.deg@data$lat + 0.00035 * sin(b_alfa1rad)
  bvert1 <- cbind(b_x1, b_y1)
  colnames(bvert1) <- c("lon", "lat") 
  bvert.90<-SpatialPoints(bvert1, proj4string=CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"), bbox=NULL) 
}

Результат: код создает треугольник, как и следовало ожидать, но это происходит только тогда, когда угол (ca) находится в диапазоне 0-90 градусов:

enter image description here

Проблема

Эта формула не работает для других ракурсов камеры. На мой взгляд (и согласно предоставленным ссылкам на темы) формула должна быть универсально применима для любого углового измерения. Может ли кто-нибудь предоставить некоторые сведения о том, правильно ли я использую формулу и правильно ли я ее использую.

ОБНОВЛЕНИЕ: ссылка на фрейм данных пространственных точек в формате шейп-файла: https://drive.google.com/file/d/1ax5OG8c8Cl-Hz3N16ye9OoG4z7l8HSAQ/view?usp=sharing

ОБНОВЛЕНИЕ 2: процесс перехода от pnpover (общий spdf) к pnp.90.deg - это просто пространственное подмножество:

pnp.90.deg <- subset(pnpover, pnpover@data$ca <= 90)

Я решил создать углы обзора в диапазоне 0-90; 91-180; 181-270; 271-360, чтобы проверить, что идет не так.

Спасибо, любезно!

1 Ответ

0 голосов
/ 06 июля 2018

Посмотрите на эту картинку:

enter image description here

с:

  • ca - это направление камеры. Это угол, который начинается с севера и идет по часовой стрелке, поэтому 0 = север, 90 = восток и т. Д.

  • fa - внутренний угол поля зрения (FOV).

  • C - положение камеры.

  • A и B - это координаты для расчета. Их расстояние до C равно d.

Возможно, вы уже знаете преобразование полярных в декартовы координаты:
x = cx + d * cos(alpha) и y = cy + d * sin(alpha)

Но мы сказали, что ca идет по часовой стрелке . Это означает, что мы должны изменить sin/cos использование.

Необходимые формулы:

x = cx + d * sin(alpha)
y = cy + d * cos(alpha)

Итак, для координат A, B:

ax = cx + d * sin(ca - fa/2)
ay = cy + d * cos(ca - fa/2)
bx = cx + d * sin(ca + fa/2)
by = cy + d * cos(ca + fa/2)

Это действительные формулы для всего диапазона {0, 360}. Или {0, 2PI}, как вы предпочитаете.
Если бы происхождение отличалось от Севера (скажем, 0 = Восток), тогда нам потребовались бы некоторые исправления знака.

Вероятно, компилятор может использовать любой угол, даже вне диапазона {0, 2PI}. Если нет, вы должны сначала зафиксировать угол в диапазоне. Я не говорю r, поэтому я пишу это в общем виде:

float parts = angle / 360
float rest = parts - int(parts)
float cAngle = rest * 360
better cAngleRadians = rest * 2 *pi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...