Я работаю над геометрией c Морфометрия c Набор данных биологических образцов с двумерными декартовыми координатами (т.е. ориентирами). Часть моего интереса к этому набору данных состоит в том, чтобы создать кадр данных о расстояниях между важными ориентирами и углами между векторами ориентиров с гомологичными координатами по всем образцам для дальнейшего сравнения. Расстояния между точками не были проблемой, но у меня возникали проблемы, когда я пытался вычислить углы в каждом из моих образцов.
Я пытаюсь найти способ вычислить угол между линейными векторами, представляющими один и тот же угол на серии образцов одновременно (векторы описывают особенность с биологической значимостью, которая присутствует во всех образцах в моем наборе данных). Пакет R, который я использую для управления данными морфометрии c, выводит ориентиры как трехмерный объект класса array()
, где строки - это ориентиры, столбцы - это размеры координаты, а третье измерение - это образец. Вот координаты ориентира для трех образцов в данных образца, представленных здесь.
, , Specimen1
X Y
1 -0.2411 0.060183
2 -0.0677 -0.029954
3 0.1147 0.012111
4 0.0085 0.000462
, , Specimen2
X Y
1 -0.22509 0.0764
2 -0.09437 -0.0202
3 0.09135 -0.0182
4 0.00367 -0.0045
, , Specimen3
X Y
1 -0.2223 0.06122
2 -0.1001 -0.02366
3 0.0553 0.00577
4 -0.0617 -0.01557
Ниже приведен читаемый массив, который копирует данные, которые я получаю в качестве выходных данных для первых трех образцов.
data<-array(data=c(-0.2411,-0.0677,0.1147,0.0085,0.060183,-0.029954,0.012111,0.000462,-0.22509,-0.09437,0.09135,0.00367,0.0764,-0.0202,-0.0182,-0.0045,-0.2223,-0.1001,0.0553,-0.0617,0.06122,-0.02366,0.00577,-0.01557),c(4,2,3))
Мне интересно найти угол, образованный линиями между точками 1 и 2 и точками 3 и 4. Для этого я вычисляю вектор этих двух линий, вычитая координаты одной точки из другой. Когда я это делаю, я получаю матрицу 2 * N для каждого вектора, где строки соответствуют векторам по осям X и Y, а столбцы соответствуют образцу.
Я хочу найти угол между этими двумя векторами для образца 1 (столбец 1 на обеих матрицах), 2, 3 и т. д. В идеале я хотел бы получить выходные данные в формате, где R сообщает угол для каждого отдельного образца, например так:
Angle1
[,1] 146
[,2] 152
[,3] 135
И затем каким-то образом добавить его в кадр данных, чтобы он выглядел так:
Distance Angle1 Angle2
Specimen1 100 146 100
Specimen2 100 152 100
Specimen3 100 135 100
Расстояния и значения для Angle2 являются просто числами заполнения, чтобы показать формат, которого я пытаюсь достичь.
Я пытался использовать функцию angle()
в mathlib * Пакет 1022 * и функция angle.calc()
в пакете Morpho . Вот код, который я использовал для вычисления угла с помощью функции angle()
.
vector1<-data[1,,]-data[2,,]
vector2<-data[3,,]-data[4,,]
angle(as.vector(vector1),as.vector(vector2),degree=TRUE)
Эти функции рассчитают точный угол, однако они сделают это только для первого образца или одного образец, если не указано иное, и не составляют список углов для всех образцов. Я также проверил предыдущие вопросы о переполнении стека, но ни один из приведенных ответов не представляется применимым к набору данных, содержащему несколько образцов, каждый столбец в обеих матрицах которых представляет отдельный образец (и когда Я применяю их в лучшем случае, они, кажется, имеют ту же проблему, где они возвращают только угол для первого образца). Здесь только три образца, у меня есть большое количество образцов и несколько углов на образец в фактическом наборе данных, и невозможно измерить каждый угол отдельно для каждого образца.
Есть ли способ написать формула для получения списка, содержащего соответствующий угол для каждого из этих образцов?