У меня есть несколько матриц, заполненных координатами x и y нескольких точек в 2D-пространстве, составляющих график. Матрицы выглядеть примерно такПовернуть график по углу
x1 x2 x3 x4 ...
y1 y2 y3 y4 ...
Возможный график выглядит так
То, что я хочу сделать, вращает график вокруг точки A так, что линия между точками A и B параллельна оси X.
Моей идеей было рассматривать линию AB как гипотенуж прямоугольного треугольника, вычислить α (угол в точке A) и повернуть ее для этого графа с помощью матрицы вращения.
То, что я сделал до сих пор является следующая
#df is the subset of my data that describes the graph we're handling right now,
#df has 2 or more rows
beginx=df[1,]$xcord #get the x coordinate of point A
beginy=df[1,]$ycord #get the y coordinate of point A
endx=df[nrow(df)-1,]$xcord #get the x coordinate of point B
endy=df[nrow(df)-1,]$ycord #get the y coordinate of point B
xnow=df$xcord
ynow=df$ycord
xdif=abs(beginx-endx)
ydif=abs(beginy-endy)
if((xdif != 0) & (ydif!=0)){
direct=sqrt(abs((xdif^2)-(ydif^2))) #calculate the length of the hypothenuse
sinang=abs(beginy-endy)/direct
angle=1/sin(sinang)
if(beginy>endy){
angle=angle
}else{
angle=360-angle
}
rotmat=rot(angle) # use the function rot(angle) to get the rotation matrix for
# the calculated angle
A = matrix(c(xnow,ynow),nrow=2,byrow = TRUE) # matrix containing the graph coords
admat=rotmat%*%A #multiply the matrix with the rotation matrix
}
Этот подход не потому, что это не является достаточно гибкой, чтобы всегда рассчитать необходимый угол с результатом того, что график вращается неправильным углом и/или в неправильном направлении.
Заранее спасибо за чтение и, надеюсь, некоторые из вас может принести некоторые свежие идеи для этого
Edit: Данные для воспроизведения этого можно найти здесь
Не конечно, как предоставить данные, о которых вы просили, я с удовольствием предоставил бы его по-другому, если вы укажете, как вам понравится.
Просьба представить данные. – Roland
Сделайте небольшие примеры данных, которые демонстрируют проблему, и вставьте здесь результат 'dput'. –
Я попытаюсь сократить его, когда найду время, в основном вы могли бы просто выбрать две случайные точки в 2D-пространстве для A и B, что должно быть достаточным для воспроизведения основной проблемы. – Rickyfox