Вычислить координату XY по заданному вектору - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть эти данные:

set.seed(1)
df <- data.frame(xstart=rnorm(5),ystart=rnorm(5),
                 xmax=rnorm(5),ymax=rnorm(5),
                 length=runif(5,0,1))

Где xstart и ystart определяют начальную координату вектора (т. Е. Линию в этом двухмерном пространстве с направлением) и lengthопределяет его длину.xmax и ymax определяют направление вектора (т. Е. (ymax - ystart)/(xmax - xstart) - это наклон).

Я ищу функцию, которая будет вычислять координаты xend и yend каждого вектора.По сути это можно решить с помощью уравнений:

length^2 = (xend - xstart)^2 + (yend - ystart)^2
yend = beta*(xend - xstart)

, где:

beta = (ymax - ystart)/(xmax - xstart)

1 Ответ

0 голосов
/ 07 декабря 2018

Это чистая геометрия.Я предлагаю использовать atan2 вместо наклона, поскольку он определен конечным образом (наоборот, наклон Inf или -Inf с вертикальными линиями).

angles <- atan2(df$ymax - df$ystart, df$xmax - df$xstart)
df$xend <- df$xstart + df$length * cos(angles)
df$yend <- df$ystart + df$length * sin(angles)
# and to verify the resulting lengths are as-desired
df$len2 <- sqrt( (df$xend - df$xstart)^2 + (df$yend - df$ystart)^2 )
df
#       xstart     ystart       xmax        ymax    length       xend        yend      len2
# 1 -0.6264538 -0.8204684  1.5117812 -0.04493361 0.8209463  0.1452983 -0.54055500 0.8209463
# 2  0.1836433  0.4874291  0.3898432 -0.01619026 0.6470602  0.4288186 -0.11138308 0.6470602
# 3 -0.8356286  0.7383247 -0.6212406  0.94383621 0.7829328 -0.2704346  1.28011746 0.7829328
# 4  1.5952808  0.5757814 -2.2146999  0.82122120 0.5530363  1.0433885  0.61133438 0.5530363
# 5  0.3295078 -0.3053884  1.1249309  0.59390132 0.5297196  0.6804608  0.09139217 0.5297196

Итак, как функция, что-тонапример:

somefunc <- function(xstart, ystart, xmax, ymax, len) {
  angles <- atan2(ymax - ystart, xmax - xstart)
  xend <- xstart + len * cos(angles)
  yend <- ystart + len * sin(angles)
  data.frame(xend = xend, yend = yend)
}

, который возвращает фрейм с двумя желаемыми столбцами.Их можно легко добавить к существующим данным с помощью cbind(origdat, somefunc(...)).

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