正确的数据结构,用于包含形状和它们之间的空间关系

我是Python的入门者,我真的需要一些帮助.

我有一个(有效的)脚本,可以检索手工绘制的图像中的简单形状.下一步是确定形状与包含所有这些信息的数据结构之间的空间关系.我知道如何确定形状之间的空间关系,例如内部,旁边,上方和下方.但是,我需要一个数据结构来包含所有这些信息:边缘的形状(x,y)坐标以及与其他形状的关系.
我在考虑分层表示,如下图所示:

其中每个形状都包含信息.

Shape = (x0, y0, ..., xn, yn), position(Shape)

哪里

>(x0,y0,…,xn,yn)是形状边缘的坐标
> position(Shape)是形状与另一个形状之间的关系.

例如:

S1: (x0, y0, x1, y1, x2, y2, x3, y3), below(T1)
T1: (x0, y0, x1, y1, x2, y2), above(S1)
C1: (radius), inside(S1), above(C2)
C2: (radius), inside(S1), below(C1)

但是如何在python中实现呢?我读过一些有关字典(here)的信息,但是我不确定它是否适合在这里使用.为什么?因为我需要在数据结构中写出形状相对于其他位置的位置.那我怎么写这种关系呢?我对这个论点很困惑,我真的需要帮助.

解决方法:

为此使用Python的类.

一个简单的例子.首先,我们定义一个Point数据结构,该结构将以笛卡尔坐标保存有关点的信息:

class Point(object):
    """ Define a point at X, Y """
    def __init__(self, x=0, y=0):
        self.x=x
        self.y=y

现在让我们定义一个圆:

class Circle(object):
    def __init__(self, x=0, y=0, radius=1):
        """ Define a circle centered at X, Y with radius """
        self.x=x
        self.y=y
        self.radius=radius

现在,您可以声明每个对象的实例并测试该点是否在圆内:

>>> c1=Circle()      # default of x=0, y=0, radius=1
>>> p1=Point(5,6)    # a point at x=5, y=6

那是圆圈内的那个点吗?您可以对其进行测试:

>>> ((p1.x-c1.x)**2 + (p1.y - c1.y)**2)**0.5<c1.radius
False

如果我们不必记住圆心和圆点的毕达哥拉斯定理,那将容易得多.让我们将基本功能添加到Circle对象中:

class Circle(object):
    def __init__(self, x=0, y=0, radius=1):
        self.x=x
        self.y=y
        self.radius=radius

    def point_in(self, p):
        return ((p.x-self.x)**2 + (p.y - self.y)**2)**0.5<self.radius

现在,您可以使用更合理的方法:

>>> c1.point_in(Point(5,5))
False
>>> c1.point_in(Point(.5,.5))
True

那么“上方”或“下方”呢?我想“上方”是指如果点在圆之外并且Point.y> Circle.y.将此添加到Circle类:

def above(self, p):
    return ((p.x-self.x)**2 + (p.y - self.y)**2)**0.5 > self.radius and p.y>self.y 

测试一下:

>>> c1.above(Point(5,5)) 
True

您可以扩展此概念,以便可以测试一个圆是否与另一个圆重叠或由Points定义的多边形区域.您也可以扩展它,以便每个形状将为其自身和其他形状使用适当的公式. (您怎么知道多边形是否相交?现在我们要谈论更多的复杂性!从HERE开始.如果您使用的是OpenGL,则可以使用两种附加颜色在屏幕外绘制两个多边形,并测试添加的像素颜色…)

然后将其扩展为三角形,正方形,矩形,圆形的“上方”和“下方”的含义.除了圆形以外,您对形状的基本定义将需要旋转,或者仅通过其顶点定义为多边形.

上一篇:php – 如何在Laravel 5.6中查看Has One关系


下一篇:有效插入/更新mysql m:n关系