图形裁剪(Cohen-Surtherland算法)
- 2019 年 11 月 12 日
- 筆記
版权声明:本文为博主原创文章,遵循 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()
运行结果:
