Python测试如果Point在Rectangle中

时间:2015-07-09 14:51:14

标签: python geospatial

我是python的新手,仍在学习绳索,但我希望有更多经验的人可以帮助我。

我正在尝试编写一个python脚本:

  1. 创建四个点
  2. 创建四个矩形
  3. 检查每个点是否在任何矩形中,然后将结果写出到输出文件。
  4. 问题涉及两个数据结构Point和Rectangle类。我已经开始创建Point类和Rectangle类。 Rectangle类应该包含从随机模块的随机方法创建的相关数据集。正如你从我的尝试中可以看出我到处都是,但我已经使用了#comments来试图得到我想要做的事情。

    我的具体问题是:
    1)我怎样才能使这个脚本工作?
    2)我缺少哪些变量或函数来生成随机矩形并查看特定点是否在这些矩形中?

    ## 1. Declare the Point class
    class Point:
        def __init__(self,x = 0.0, y = 0.0): 
            self.x = x 
            self.y = y
        pass
    ## 2. Declare the Rectangle class 
    class Rectangle: 
        def __int__(self): ## A rectangle can be determined aby (minX, maxX) (minY, maxY) 
            self.minX = self.minY = 0.0 
            self.maxX = self.maxY = 1.0 
        def contains(self, point): ## add code to check if a point is within a rectangle 
            """Return true if a point is inside the rectangle."""
            # Determine if a point is inside a given polygon or not
            # Polygon is a list of (x,y) pairs. This function
            # returns True or False. 
        def point_in_poly(x,y,poly):
            n = len(poly)
            inside = False
            p1x,p1y = poly[0]
            for i in range(n+1):
                p2x,p2y = poly[i % n]
                if y > min(p1y,p2y):
                    if y <= max(p1y,p2y):
                        if x <= max(p1x,p2x):
                            if p1y != p2y:
                                xints = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x
                        if p1x == p2x or x <= xints:
                            inside = not inside
                p1x,p1y = p2x,p2y
            return inside
    ## 3. Generate four points 
    ##define a Point list to keep four points 
    points = []
    ##add codes to generate four points and append to the points list
    polygon = [(0,10),(10,10),(10,0),(0,0)]
    point_x = 5
    point_y = 5
    
    ## 4. Generate four rectangles 
    ##define a Rectangle list 
    rects = [] 
    for i in range(4):
        rectangle = Rectangle() 
        ## Generate x 
        x1 = random.random() 
        x2 = random.random() 
        ## make sure minX != maxX 
        while(x1 == x2): 
            x1 = random.random() 
        if x1<x2: 
            rectangle.minX=x1 
            rectangle.maxX=x2 
        elif x1>x2:
            rectangle.minX=x2
            rectangle.maxX=x1
        rects.append(rectangle)
        ## Develop codes to generate y values below 
        ## make sure minY != maxY 
        while(y1 == y2):
            y1 = random.random()
        if y1<y2:
            rectangle.minY=y1
            rectangle.maxY=y2
        elif y1>y2:
            recetangle.minY=y2
            racetangle.maxY=y1
        ## add to the list 
        rects.append(rectangle)
    
    ## 5. Add code to check which point is in which rectangle 
    resultList = [] ## And use a list to keep the results 
    for i in range(4):
        for j in range(4):
            if points[i] in rectangle[j]:
                print i
    
    # write the results to file
    f=open('Code5_4_1_Results.txt','w') 
    for result in resultList:
        f.write(result+'\n') 
    f.close()
    

2 个答案:

答案 0 :(得分:3)

这是非常简单的数学。给定一个带点(x1,y1)和(x2,y2)的矩形并假设x1 < x2y1 < y2(如果没有,你可以只交换它们),一个点(x,y)就在那个点内如果x1 < x < x2 and y1 < y < y2,则为矩形。由于可以链接Python比较运算符,这甚至是有效的Python代码,它应该产生正确的结果(在其他语言中,您必须编写类似x1 < x and x < x2的东西等)。

如果需要,您可以使用<=代替<。使用<=表示矩形边界上的点(例如,点(x1,y1))计数在其中,而使用<则意味着这些点位于其外部。

答案 1 :(得分:2)

最好编写一个单独的函数来完成这项工作。这是我的职能。您可以根据需要复制它

def pointInRect(point,rect):
    x1, y1, w, h = rect
    x2, y2 = x1+w, y1+h
    x, y = point
    if (x1 < x and x < x2):
        if (y1 < y and y < y2):
            return True
    return False