我是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,则可以使用两种附加颜色在屏幕外绘制两个多边形,并测试添加的像素颜色…)
然后将其扩展为三角形,正方形,矩形,圆形的“上方”和“下方”的含义.除了圆形以外,您对形状的基本定义将需要旋转,或者仅通过其顶点定义为多边形.