代码之家  ›  专栏  ›  技术社区  ›  Readler

检查坐标是否在坐标系上的某个区域内

  •  3
  • Readler  · 技术社区  · 6 年前

    我有一个坐标系,有一定数量的区域,类似于这个: coordinate system

    然而,我的例子的不同之处在于,所有区域都是唯一编号的,都具有相同的大小,并且有16个区域(因此每个象限将有4个大小完全相同的切片)。

    我还有一组元组(二维坐标),它们都在(-1,-1)和(1,1)之间。现在,我想检查如果映射到坐标系上,它们将降落在哪个区域(即1到16)。

    作为一个完全的初学者,我不知道如何解决这个问题,但到目前为止,我的方法如下:

    制作所有的分界线函数,检查每个点是否在上面和下面。忽略决策边界上的那些

    a是x轴和f1(x)=0.3333x(红色)之间的区域

    b在f1和f2之间,f2(x)=x(黄色)

    f2和f3之间的c,f3(x)=3x(蓝色)

    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 回复  |  直到 6 年前
        1
  •  2
  •   Hemerson Tacon    6 年前

    既然你在两人之间工作 (-1,-1) (1,1) 坐标和占卜相等于笛卡尔平面,使用三角函数变得自然。在一元循环中思考,它具有 2*pi 迪格雷斯,你把它分成了两部分 n n = 16 ). 所以每一片都有 (2*pi)/16 = pi/8 (x, y) 连接到原点 (0, 0) ,它与x轴形成一个角度。要找到这个角度,只需计算 y/x

    这是一张草图:

    sketch

    要直接映射到时间间隔,可以使用 bisect module

    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
    
        2
  •  1
  •   Charles Landau    6 年前

    Shapely是一个python库,可以帮助您处理典型的笛卡尔几何体,但据我所知,它没有一种简单的方法来扩展其功能 Line 基于函数的对象。

    Point 有什么问题吗 Polygon 使用 Polygon.contains(Point) https://shapely.readthedocs.io/en/stable/manual.html#object.contains