Как получить координаты в 2D, начиная с (0,0) с длиной и углом - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующие координаты

[-20, -20], [-20, 20], [-40, 0], [-40, 20], [-40, 40], [-20, 80], [20, 80], [40, 40], [80, 20], [80, -20]. 

Моя задача - получить начальную точку координат из [0, 0]. Я могу получить углы и длину из указанных выше координат. Углы должны быть от 0 до 360 положительных.

Предположим, у меня нет исходных координат сейчас. Мне нужно рассчитать координаты, начиная с 0,0 с углами и длиной. Мне нужны текущие координаты, предыдущие и следующие координаты.

Пример: если текущий сегмент координат имеет длину 5, то координаты равны (0,0) (0,5). Конечная точка предшественника - (0,0), а начальная точка преемника - ( 0,5).

Что может быть формулой, Мне нужно рассчитать, имея в виду квадранты и, наконец, повернуть его ??

Чтобы найти следующую и предыдущую координаты, я использую как в квадранте 1. x1=x+l * cos(angle), y1=y+l * sin(angle).

Меняются ли приведенные выше формулы в моем случае с квадрантами, как показано ниже, или они совпадают.

x1=x-l*cos(angle), y1=y-l*sin(angle) etc (change w.r.t quadrants).

Помогите мне узнать.

Фактическая цифра:

Original Coordinates, this shape is flipped by y-axis Красный - текущий, синий - предшественник, черный - преемник.

1 Ответ

0 голосов
/ 08 ноября 2018

Не Java, а Python, так как он был помечен как «вычислительная геометрия».При необходимости вы можете перевести

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

Если это не то, что нужно, вы можете извлечь из него то, что вам нужно.

a = np.array([[-20, -20], [-20, 20], [-40, 0], [-40, 20], [-40, 40], [-20, 80], [20, 80], [40, 40], [80, 20], [80, -20]])
pnt = np.array([0,0]

import numpy as np

def e_dist(a, b, metric='euclidean'):
    """Distance calculation for 1D, 2D and 3D points using einsum

    `a`, `b` : array like
        Inputs, list, tuple, array in 1, 2 or 3D form
    `metric` : string
        euclidean ('e', 'eu'...), sqeuclidean ('s', 'sq'...),
    -----------------------------------------------------------------------
    """
    a = np.asarray(a)
    b = np.atleast_2d(b)
    a_dim = a.ndim
    b_dim = b.ndim
    if a_dim == 1:
        a = a.reshape(1, 1, a.shape[0])
    if a_dim >= 2:
        a = a.reshape(np.prod(a.shape[:-1]), 1, a.shape[-1])
    if b_dim > 2:
        b = b.reshape(np.prod(b.shape[:-1]), b.shape[-1])
    diff = a - b
    dist_arr = np.einsum('ijk,ijk->ij', diff, diff)
    if metric[:1] == 'e':
        dist_arr = np.sqrt(dist_arr)
    dist_arr = np.squeeze(dist_arr)
    return dist_arr



def radial_sort(pnts, cent=None, as_azimuth=False):
    """Sort about the point cloud center or from a given point

    `pnts` : points
        An array of points (x,y) as array or list
    `cent` : coordinate
        list, tuple, array of the center's x,y coordinates
    >>> cent = [0, 0] or np.array([0, 0])

    Returns:
    -------
        The angles in the range -180, 180 x-axis oriented

    """
    pnts = np.asarray(pnts, dtype=np.float64)
    if cent is None:
        cent = _center(pnts, remove_dup=False)
    ba = pnts - cent
    ang_ab = np.arctan2(ba[:, 1], ba[:, 0])
    ang_ab = np.degrees(ang_ab)
    sort_order = np.argsort(ang_ab)
    if as_azimuth:
        ang_ab = np.where(ang_ab > 90, 450.0 - ang_ab, 90.0 - ang_ab)
    return ang_ab, sort_order

Теперь, если вы используете «a» и «pnt» выше, вы получитеследующие результаты.

    dist = e_dist(a, pnt)
    angles = radial_sort(a, pnt, True)[0]

    dist
    Out[36]: 
    array([28.284, 28.284, 40.   , 44.721, 56.569, 82.462, 82.462, 56.569, 82.462,
           82.462])

    angles
    Out[37]: 
    array([225.   , 315.   , 270.   , 296.565, 315.   , 345.964,  14.036,  45.   ,
            75.964, 104.036])
...