我要做的是创建一个圆,然后删除该圆中所有(整数)点之外的给定键(如圆与某些几何图形的区域交点)。几何图形表示为(x,y)
元组的列表,圆也是如此(附加O
变量等于它的中心)。我的代码是:
copy=circle
for bound in bounds:
for point in circle:
if checkPointSegmentIntersection(O,point,bound):
copy.remove(point)
print bound, point
print copy
我正在测试的圆的中心等于(5,8)
,半径等于3.圆的一个边界点是(5,11)
,并且有一个点的边界等于{{ 1}}。因此,点(5,10)
和(5,11)
应从(5,10)
中删除。 copy
可以,但(5,10)
没有。更重要的是,(5,11)
对甚至没有出现在输出中,(5,10) (5,11)
确实如此)!内循环继续绑定等于(5,10) (5,10)
,(5,10)
是唯一省略的点。 (5,11)
确实出现在其他外循环迭代中。这是怎么回事?什么可以导致循环省略其中一个点?
一点背景:这个代码在django服务器上执行,(5,11)
列表中等大,它包含10-15个元素,我使用的是python 2.7。如果bounds
位于checkPointSegmentIntersection(A,B,X)
和True
之间的线段上,X
功能将起作用并返回A
。我也对任何有关手头一般问题的不同方法的想法持开放态度。
谢谢!
答案 0 :(得分:6)
如果您认为创建列表副本,则只需创建对同一内存空间的另一个引用。相反,你应该使用
circ_copy=circle[:]
这基本上需要整个circle
的副本,并将其存储为circ_copy
中的新列表。现在你可以运行你的循环了。但是,您的意图完全正确地尝试遍历复制列表并对原始列表进行更改。
答案 1 :(得分:2)
分开事物可能更清楚,因此你有一个功能
checkPointSegmentIntersection(point, bounds)
返回True
或False
以获取针对当前边界的点。
然后你可以做类似
的事情[point for point in circle if checkPointsSegmentIntersection(point, bounds)]