如何解决从python中的线段列表中检查线段的交点
我有一个“多边形”类来显示多边形的类型,无论它是简单的(凹面还是凸面)还是复杂的。为此,我从主程序中为多边形指定的顶点创建了线段列表。 然后,我创建了“ ccw”和“ intersection”函数来检测两个线段是否相交。 现在我想要的是一个函数,该函数应该检查列表中所有线段的交点。从线段(LS)3开始的功能应检查LS 3和LS 1的交点。...然后LS 4与LS 2和LS 1的交点。然后LS 5与LS 3的交点, LS 2和LS 1等等。。。但是对于列表中的最后一个线段,它不应该检查与LS 1的交点,因为Last LS将与LS 1联接(以创建闭合多边形),并且将始终显示相交,这不是必需的。因此,对于最后一个线段,该功能应跳过与线段1的相交检查。
class Polygon:
def __init__(self,*vertices):
self.vertices = [Polygon.Point(v[0],v[1]) for v in vertices] #Vertices of a polygon
@property
def lines(self):
#Retun list of all line segments of Polygon
return [Polygon.LSeg(self.vertices[i],self.vertices[(i+1)%len(self.vertices)]) for i in range(len(self.vertices))]
@property
def shape(self):
#THIS IS WHAT I HAVE TRIED BUT IT RETURNS "COMPLEX" FOR EVERY POLYGON#
for i in range(2,len(self.lines)):
for j in range(2,i+1):
if i == len(self.lines)-1 and j == i-1:
pass
elif self.intersect(self.lines[i],self.lines[i-j]):
return 'Complex'
def ccw(self,A,B,C):
return (C.y-A.y)*(B.x-A.x) > (B.y-A.y)*(C.x-A.x)
def intersect(self,L1,L2):
return self.ccw(L1.p1,L2.p1,L2.p2) != self.ccw(L1.p2,L2.p2) and self.ccw(L1.p1,L1.p2,L2.p1) != self.ccw(L1.p1,L2.p2)
class LSeg: #Line Segment Class
def __init__(self,p1,p2):
self.p1=p1
self.p2=p2
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
poly1 = Polygon((2,7),(10,1),(8,6),(11,(7,10)) #Simple Polygon
poly2 = Polygon((0.65,0.92),(-1,-3),(4,-2),(3,2),3),(6,(5,0)) #Complex Polgon
print(poly1.shape)
print(poly2.shape)
解决方法
在下面的代码中,我添加了一个类方法,该方法检查两个LSeg是否共享一个端点。我只是使用它来避免检查具有共享端点的线段之间的交点。
请注意我的_iter_()用户
class Polygon:
def __init__(self,*vertices):
self.vertices = [Polygon.Point(v[0],v[1]) for v in vertices] # Vertices of a polygon
@property
def lines(self):
# Retun list of all line segments of Polygon
return [Polygon.LSeg(self.vertices[i],self.vertices[(i + 1) % len(self.vertices)]) for i in
range(len(self.vertices))]
@property
def shape(self):
for base_line in self.lines:
for line in self.lines:
if not line.shares_end(base_line) and self.intersect(base_line,line):
return 'Complex'
def ccw(self,A,B,C):
return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x)
def intersect(self,L1,L2):
return self.ccw(L1.p1,L2.p1,L2.p2) != self.ccw(L1.p2,L2.p2) and self.ccw(L1.p1,L1.p2,L2.p1) != self.ccw(L1.p1,L2.p2)
class LSeg: # Line Segment Class
def __init__(self,p1,p2):
self.p1 = p1
self.p2 = p2
def __iter__(self):
yield self.p1
yield self.p2
def __repr__(self):
return f'({self.p1} | {self.p2})'
def shares_end(self,other):
for point in other:
if point in self:
return True
return False
class Point:
def __init__(self,x,y):
self.x = x
self.y = y
def __repr__(self):
return f'({self.x},{self.y})'
poly1 = Polygon((2,7),(10,1),(8,6),(11,(7,10)) # Simple Polygon
poly2 = Polygon((0.65,0.92),(-1,-3),(4,-2),(3,2),3),(6,(5,0)) # Complex Polgon
print(poly1.shape)
print(poly2.shape)
输出:
None
Complex
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。