版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kiwi_berrys/article/details/102934994
对于给定区域内的多边形需要显示出来,而区域外部的图形则不显示 例如:细线部分表示要去除的
from matplotlib import pyplot as plt
"""
函数说明:判断点超出哪个边界
"""
def edgeCode(x,y,yEdge,xEdge):
code = 0
if x < xEdge[0]:
code = code|1
if x > xEdge[1]:
code = code|2
if y < yEdge[0]:
code = code|4
if y > yEdge[1]:
code = code|8
return code
"""
函数说明:cohenSurtherland
parameter: pointX:点X的集合
pointY:点Y的集合
yEdge:上下边界
xEdge:左右边界
pic:图
"""
def cohenSurtherland(xEdge,yEdge,pointX,pointY,pic):
#边界区域
mid = 0
leftEdge = 1
rightEdege = 2
bottomEdge = 4
topEdge = 8
pointX.append(pointX[0])
pointY.append(pointY[0])
for i in range(len(pointX)-1):
time = 0 #用于判断线段完全处于外部的情况
x0 = pointX[i]
y0 = pointY[i]
x1 = pointX[i+1]
y1 = pointY[i+1]
code0 = edgeCode(x0,y0,xEdge,yEdge)
code1 = edgeCode(x1,y1,xEdge,yEdge)
while True:
if not(code0|code1) : #线段部分全部位于内部
pic.plot([x0,x1],[y0,y1],c = 'r')
break;
elif (code0&code1 or time > 3) : #线段全部位于外部
break;
else :
if(x1!=x0):
k = (y1 - y0) / (x1 - x0)
dk = 1/k #k的倒数
else:
dk = 0
#判断哪个端点位于外部
if code0 :
codeout = code0
temp = 0
else:
codeout = code1
temp = 1
#判断出界的方向并且更新点
if codeout&leftEdge :
y = pointY[i+temp]+k*(xEdge[0]-pointX[i+temp])
x = xEdge[0]
elif codeout&rightEdege :
y = pointY[i+temp]+k*(xEdge[1]-pointX[i+temp])
x = xEdge[1]
if codeout&topEdge :
x = pointX[i+temp]+dk*(yEdge[1]-pointY[i+temp])
y = yEdge[1]
elif codeout&bottomEdge:
x = pointX[i+temp]+dk*(yEdge[0]-pointY[i+temp])
y = yEdge[0]
if temp :
x1 = x
y1= y
code1 = edgeCode(x1,y1,xEdge,yEdge)
else :
x0 = x
y0 = y
code0 = edgeCode(x0,y0,xEdge,yEdge)
time+=1
def tes(ax2):
a = 8
b = 0
print(a|b)
if __name__ == '__main__':
#左右 下上边界
xEdge = [10,30]
yEdge = [10,30]
#点集
pointX = [20,20,40,35,25,32,27,20]
pointY = [25,45,40,15,20,30,35,25]
pic0 = plt.subplot(1,2,1)
pic0.axis([0,50,0,50])
pic0.plot([10,30,30,10,10],[10,10,30,30,10])
pic0.plot(pointX,pointY,c = 'r')
pic1 = plt.subplot(1,2,2)
pic1.axis([0, 50, 0, 50])
pic1.plot([10,30,30,10,10],[10,10,30,30,10])
cohenSurtherland(xEdge,yEdge,pointX,pointY,pic1)
plt.show()
运行结果: