Как рассчитать угол Эйлера, который я рассчитываю, от 0 до 180 градусов, положительный или отрицательный по сравнению с другими, которые я вычисляю? - PullRequest
0 голосов
/ 18 февраля 2019

У меня большое количество координат в трехмерном пространстве.Эти координаты равномерно расположены на поверхности объекта, который лучше всего можно описать как несовершенную сферу.Он достаточно близок к сфере, и я могу вычислить центральную точку, просто взяв средние координаты x, y и z всех позиций.

Получив центр объекта, я могу проследить вектор от центра к каждой точке поверхности и вычислить вектор.

В реальном выражении я обрезаю точки из трехмерного объема.в каждой координате.С точки зрения уменьшения вычислительной нагрузки для меня очень полезно знать углы Эйлера от оси z, в которых каждое обрезанное место располагается относительно центра объекта.

В настоящее время я написал код для расчета углов Эйлера.В программе, которую я буду использовать позже, нужны углы Эйлера вокруг оси (0,0,1), (0,1,0) и (0,0,1).К счастью, я могу игнорировать окончательное вращение вокруг оси z и позволить программе автоматически выровнять это, поэтому я могу просто установить его на 0 градусов.

Следующие два угла я вычисляю, проецируя задачу в 2D на ось 010 или 001 соответственно и используя арккос и точечные произведения для вычисления угла.Я был бы признателен за проверку моей работы здесь, если у вас есть шанс, но я думаю, что это работает нормально.

Моя проблема с этим методом при токе в том, что он просто предоставляет угол, под которым вектор расположен относительно центра, как положительный угол между 0 и 180 градусами.Мне нужно знать, является ли угол положительным или отрицательным по отношению к другим углам.

%croppoints is a three column array with each column being an x, y or z value. 
croppoints = int64(modelinfo.crop_points)

%Here I just extract each column into its own array to compartmentalise things for my ease later on.        
xvalues = croppoints(:,1)
yvalues = croppoints(:,2)
zvalues = croppoints(:,3)

xsize = size(xvalues)
ysize = size(yvalues)
zsize = size(zvalues)

#Here I calculate the centre point of the object
xcentre = (sum(xvalues) / xsize(1,1))
ycentre = (sum(yvalues) / ysize(1,1))
zcentre = (sum(zvalues) / xsize(1,1))

Centre = [xcentre, ycentre, zcentre]
n = 1

%Just use a while loop to go through the whole array and calculate the angle in each scenario, in the actual code I append a text file at the end of each loop with the results. 
while n < zsize(1,1)

    CurrentPoint = [xvalues(n),yvalues(n),zvalues(n)]
    CurrentPointFP = cast(CurrentPoint, 'like', Centre)
    vector = CurrentPointFP - Centre

    axis = [0,1] %In each case the axis is essentially 0,1 in 2D space
    vector010 = vector([1,2]) %First I project onto the X,Y axis
    magvector010 = sqrt((vector010(1)^2) + (vector010(2)^2))
    magaxis = sqrt((axis(1)^2) + (axis(2)^2))
    vector001 = vector([1,3]) %Second I project onto the axis X,Z axis
    magvector001 = sqrt((vector001(1)^2) + (vector001(2)^2))

    firstEuler = 0 %The first euler is the third euler in the program I use so this is set to 0 degrees.
    secondEuler = acos(dot(axis, vector010) / (magvector010 * magaxis));
    secondEulerDegrees = (secondEuler * 180) / pi;
    thirdEuler = acos(dot(axis, vector001) / (magvector001 * magaxis));
    thirdEulerDegrees = (thirdEuler * 180) / pi;

    EulerAnglesForOutput(n,1) = firstEuler;
    EulerAnglesForOutput(n,2) = secondEulerDegrees;
    EulerAnglesForOutput(n,3) = thirdEulerDegrees;
    n = n + 1
    end

Я хотел бы знать углы Эйлера как положительные или отрицательные между -180 и 180 градусами.В настоящее время коды просто выводят значения в диапазоне от 0 до 180 градусов.

Возможно, мне не хватает чего-то очень глупого, это мой первый набег в подсчете эйлеров сам.Любая помощь очень ценится.Спасибо.

...