前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图形裁剪(Cohen-Surtherland算法)

图形裁剪(Cohen-Surtherland算法)

作者头像
Max超
发布2019-11-12 19:07:00
4830
发布2019-11-12 19:07:00
举报

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/kiwi_berrys/article/details/102934994

问题

对于给定区域内的多边形需要显示出来,而区域外部的图形则不显示 例如:细线部分表示要去除的

代码语言:javascript
复制
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()

运行结果:

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档