Проверьте, находятся ли координаты в определенной области в системе координат - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть система координат с определенным количеством регионов, похожая на эту: coordinate system

Разница в моем случае, однако, в том, что все регионы имеют уникальную нумерацию, все имеют одинаковый размери их 16 (так что в каждом квадранте будет 4 среза одинакового размера).

У меня также есть набор кортежей (двухмерных координат), которые находятся между (-1, -1).) и (1,1).Теперь я хотел бы проверить, в какую область (то есть от 1 до 16) они приземлились бы, если бы они отображались в системе координат.

Как абсолютный новичок, я понятия не имею, как с этим справиться, но вот мой подход до сих пор:

Сделать все функции разделительных линий и проверить для каждой точки, является лиони выше и ниже их.Не обращайте внимания на тех, кто находится на границе принятия решения

Например: в квадранте 1 есть четыре региона.От оси x до оси y (против часовой стрелки) назовем их a, b, c и d.

a будет областью между осью x и f1 (x) = 0,3333x (красный)

b между f1 и f2, f2 (x) = x (желтый)

c между f2 и f3, f3 (x) = 3x (синий)

d между f3 и осью y

graphs

Как код:

def a(p):
   if(y > 0 and y < 0.3333x):
      return "a"
   else:
      b(p)

def b(p):
   if(y > 0.3333x and y < x)
      return "b"
   else:
      c(p)

def c(p):
   if(y > x and y < 3x):
      return "c"
   else: 
      d(p)

def d(p): 
   if(y > 3x and x > 0):
      return "d"

Примечание: для удобства чтения я просто написал «x» и «y» для соответствующих координат кортежа, вместо p [0] или p [1] каждый раз.Кроме того, как указано выше, я предполагаю, что нет элементов непосредственно в функциях, поэтому они игнорируются.

Теперь это возможное решение, но я чувствую, что почти наверняка есть более эффективное.

Ответы [ 2 ]

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

Поскольку вы работаете между (-1,-1) и (1,1) координатами и делением, равным декартовой плоскости, становится естественным использование тригонометрических функций.Думая в унитарном круге, который имеет 2*pi Дигр, вы делите его на n равных частей (в данном случае n = 16).Таким образом, каждый срез имеет (2*pi)/16 = pi/8 Дигр.Теперь вы можете представить произвольную точку (x, y), связанную с исходной точкой (0, 0), она образует угол с осью X.Чтобы найти этот угол, вам просто нужно вычислить арктангенс y/x.Тогда вам просто нужно проверить, в каком угловом разрезе он находится.

Вот эскиз:

sketch

И для непосредственного сопоставления синтервал, который вы можете использовать пополам модуль :

import bisect
from math import atan2
from math import pi

def find_section(x, y):

    # create intervals
    sections = [2 * pi * i / 16 for i in range(1, 17)]

    # find the angle
    angle = atan2(y, x)

    # adjusts the angle to the other half circle
    if y < 0:
        angle += 2*pi

    # map into sections
    return bisect.bisect_left(sections, angle)

Использование:

In [1]: find_section(0.4, 0.2)
Out[1]: 1

In [2]: find_section(0.8, 0.2)
Out[2]: 0
0 голосов
/ 25 ноября 2018

Shapely - это библиотека python, которая может помочь вам с типичной декартовой геометрией, но, насколько я знаю, у нее нет простого способа расширения объектов Line на неопределенное время на основе функции.

Если вы согласны с этим, то вы можете проверить, есть ли какой-либо Point в любом Polygon, используя шаблон Polygon.contains(Point), как показано здесь: https://shapely.readthedocs.io/en/stable/manual.html#object.contains

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...