圖形裁剪(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()
運行結果:
