ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-29 23:59:06  阅读:250  来源: 互联网

标签:shapes relation data-structures python


我是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,则可以使用两种附加颜色在屏幕外绘制两个多边形,并测试添加的像素颜色…)

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

标签:shapes,relation,data-structures,python
来源: https://codeday.me/bug/20191029/1963689.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有