当前位置: 首页 > 知识库问答 >
问题:

为什么我的代码没有删除内部矩形

牧献
2023-03-14

请检查这段代码,看看@Arun R在如何计算覆盖另一个矩形的矩形面积中所说的算法有什么问题

为什么它没有删除其他内部的矩形

cdef class Ray:
    cdef public:
        Point2D p
        Point2D q
        list points

cdef class Boundbox:
    cdef public:
        Point2D minP
        Point2D maxP
        int componentID

        int getComponentID(self):
            return self.componentID
def __numeric_compare_by_x(self,Boundbox a,Boundbox b):
    cdef Point2D tempA,tempB
    tempA=a.minP
    tempB=b.minP
    return tempA.x-tempB.x

def __numeric_compare_by_y(self,Boundbox a,Boundbox b):
    cdef Point2D tempA,tempB
    tempA=a.minP
    tempB=b.minP
    return tempA.y-tempB.y

def isBoundbox_inside(self,b1,b2):
    if((b1.minP.x<=b2.minP.x and b1.minP.y<=b2.minP.y)and(b1.maxP.x>=b2.maxP.x and b1.maxP.y>=b2.maxP.y)):
        return True
    return False

def boundboxFilter(self,boundbox):

    cdef:
        int i
        int minx,miny,maxx,maxy
        list pointList=[]
        Boundbox p,b1,b2

    #for i in xrange(len(boundbox)):
    #    pointList.append(boundbox[i])

    pointList=boundbox
    pointList.sort(cmp=self.__numeric_compare_by_x)

    stack=[]
    stack.append(pointList[0])

    for p in pointList[1:]:
        top=len(stack)-1
        b1=stack[top]
        b2=p
        if(not(self.isBoundbox_inside(b1,b2))):
            stack.append(b2)

    pointList=stack
    pointList.sort(cmp=self.__numeric_compare_by_y)

    stack=[]
    stack.append(pointList[0])
    for p in pointList[1:]:
        top=len(stack)-1
        b1=stack[top]
        b2=p
        if(not(self.isBoundbox_inside(b1,b2))):
            stack.append(b2)

    return stack

共有1个答案

金高轩
2023-03-14

问题出在你的过滤逻辑上。

outsiders = []
for rect in pointList:
    if not any(is_inside(rect, box) for box in pointlist if box is not rect):
        outsiders.append(rect)

其中,如果矩形盒子内,则is_inside为真。您需要对照所有其他矩形检查每个矩形,如果它不在其中任何一个矩形中,请保存它。当然,您可以调整它以提高性能。

另一种需要较少比较的方法是考虑整个列表,删除其他列表中的矩形。但是你必须非常小心索引,把东西放在列表中间也很昂贵。

 类似资料:
  • 问题内容: 考虑以下功能: 它们应该是等效的。但是存在性能差异: 不带的版本else慢10%。这非常重要。为什么? 问题答案: 对我来说,它们的速度几乎相同:(Debian上的Python 2.6.6) 字节码也非常相似: 唯一的区别是,如果控制到达函数主体的末尾,则else返回包含代码的版本None。

  • 今天我在家里的电脑上安装了netbean,以便在家做一些工作。我安装了java 8 JDK(151),并安装了包含所有内容的netbean(没有进行自定义安装)。然后我把我的项目从github上撤下来。 我的安装文件夹是在E:\netbean我的项目文件夹是默认的c: 我加载了项目,打开XAMPP并运行它。太好了,很管用。 然后我对HTML进行了更改(修复了我犯的一个拼写错误)。再次运行。找不到零

  • 我对java中的JFrames和图形非常陌生。我的长期目标是创建一个RayCast游戏世界。下面的代码是我第一次在jframe中以其坐标移动矩形。当用户按下箭头键时,坐标会发生变化。然而,似乎有些问题,因为当我使用该程序时,矩形只会被绘制并创建一条路径。我想在坐标的位置画一个矩形。 请解释我做错了什么。提前谢谢你帮助我!

  • 您将自动执行著名的歌曲“墙上的99瓶XXX”。你将打印这首歌所有99个诗句的歌词。用循环!如果你不知道歌词,用谷歌查一下。 该方案应: a.如果他们不到21岁,或者他们喜欢苏打水,那么歌词是“墙上有99瓶苏打水” B.如果他们超过21岁,那么是“99瓶啤酒” 您必须使用WHILE循环,并且counter变量必须是print语句的一部分! 所以第一节是: 99瓶苏打水挂在墙上 墙上有98瓶苏打水 最

  • 需要以这种形式解决 没有使用的最后一个字符

  • 我有以下在mongoDB CLI中工作的查询: 下面的问题,我认为是猫鼬的等价物: 使用mongoose调试,我可以看到mongoose转换为的以下查询正在删除数组中所有文档的整个pull操作的后半部分。为什么会这样?