请将此代码检查为@Arun R在how to find area of rectangle which is covering another rectangle中告诉的算法错误
我的输出是
为什么不删除其他
中的矩形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
答案 0 :(得分:1)
问题在于你的过滤逻辑。
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
位于rect
内,则box
为真。您需要针对所有其他矩形检查每个矩形,如果它不在其中任何一个内,则保存它。你当然可以调整性能。
另一种需要较少比较的方法是考虑整个列表,并删除在其他列表中找到的矩形。但是你必须非常小心索引,并且在列表中间弹出的东西也很昂贵。