­

圖形裁剪(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()

運行結果: