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

运行结果: