Преобразование между декартовыми и полярными координатами. Надеюсь, что результат положительный - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть несколько точек, которые мне нужны, чтобы преобразовать их из декартовых в полярные координаты. Но для некоторых точек полученные результаты были отрицательными значениями.

Например, источник или центр системы - (50,50), а точка, которую я хочу скрыть, - (10, 43) , Угол, который я получил из своего кода, равен -170,07375449, но я sh равен 189,92624551. (Я надеюсь, что все углы после преобразования находятся между 0 ~ 360 градусов)

Как я могу это исправить?

Спасибо !!!

import numpy as np
points = np.array([(10, 43), (10, 44), (10, 45), (10, 46), (10, 47)])
#Set the center (origin) at (50, 50). Not (0, 0)
def cart_to_pol(coords, center = [50,50], deg = True):
    complex_format = np.array(coords, dtype = float).view(dtype = np.complex) -\
                     np.array(center, dtype = float).view(dtype = np.complex)
    # return np.abs(complex_format).squeeze(), np.angle(complex_format, deg = deg).squeeze()
    return np.angle(complex_format, deg=deg).squeeze()

print(cart_to_pol(points))

Ответы [ 3 ]

2 голосов
/ 15 февраля 2020

Вы можете использовать np.where, чтобы добавить 360 к отрицательным углам:

import numpy as np
points = np.array([(10, 43), (10, 44), (10, 45), (10, 46), (10, 47)])
#Set the center (origin) at (50, 50). Not (0, 0)
def cart_to_pol(coords, center = [50,50], deg = True):
    complex_format = np.array(coords, dtype = float).view(dtype = np.complex) -\
                     np.array(center, dtype = float).view(dtype = np.complex)
    angles = np.angle(complex_format, deg=deg).squeeze()
    summand = 360 if deg else 2*np.pi
    return np.where(angles < 0, angles+summand, angles)

print(cart_to_pol(points))

Вывод:

[189.92624551 188.53076561 187.12501635 185.71059314 184.28915333]

Обратите внимание, что комплексные числа здесь не нужны. arctan2(y, x) вычисляет желаемый угол. Чтобы получить расстояния: np.linalg.norm(diff_with_center, axis=-1).

def cart_to_pol(coords, center=[50, 50], deg=True):
    conversion = 180 / np.pi if deg else 1
    diff_with_center = points - center
    angles = np.arctan2(diff_with_center[:, 1], diff_with_center[:, 0])
    return conversion * np.where(angles < 0, angles + 2*np.pi, angles)
1 голос
/ 16 февраля 2020

Комбинируя некоторые другие решения здесь ...

Если вы укажете начало координат и / или точки как плавающие, вы можете использовать представление для них в качестве комплексных чисел, а затем просто вернуть угол по модулю 360 градусов:

points = points - origin    
np.angle(points.view(np.complex), deg=True) % 360
>>> array([[189.92624551],
           [188.53076561],
           [187.12501635],
           [185.71059314],
           [184.28915333]])

Или, с операциями на месте, предполагая, что точки уже являются плавающей точкой:

np.subtract(points, origin, out=points)
v = points.view(np.complex)
np.arctan2(v.imag, v.real, out=v.real)
np.degrees(v.real, out=v.real)
np.mod(v.real, 360, out=v.real)
print(points[0])  # or print(v.real)
>>> array([[189.92624551],
           [188.53076561],
           [187.12501635],
           [185.71059314],
           [184.28915333]])

В этом случае мы не можем использовать angle, потому что опция out отсутствует, но мы можем вычислить arctan2 на месте в точках [0], с нашей точки зрения. При этом используется не больше памяти, чем в исходном (с плавающей запятой) массиве точек, и, хотя я не рассчитывал время, не нужно больше операций для вычисления.

1 голос
/ 15 февраля 2020

Если вам нужно конвертировать [-180; 180] угол до [0; 360] вы можете использовать этот код:

def convert_angle(angle):
    return (angle + 360) % 360
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...