矩形裁剪算法_python3最终版

本文介绍了一个使用Python3和PyOpenGL实现的矩形裁剪算法,包括四个裁剪函数leftClip、topClip、rightClip和bottomClip,用于处理图形在矩形裁剪区域内的边界情况。此外,还提供了鼠标点击和键盘交互功能,允许用户输入矩形裁剪区域和被裁剪图形的坐标。
摘要由CSDN通过智能技术生成
环境准备:
Python版本是3.5.1。使用pip命令:pip install pyopengl 安装pyopengl模块
另外注意需要将opengl文件(打开文件链接,也可自行百度)复制到系统盘System32(32位系统)或SysWOW64(64位系统)目录下,不然可能或报错。我今天在学校实验室碰到了此问题,错误信息好像是glutInit函数不能使用之类的。
说明:
老师的要求是实现键盘输入和鼠标点击两种交互方式,没法子,只好封装一下函数,方便调用了。
代码:
#encoding='utf-8'
#python3.5.1
#author by 张政伟 2016/6/21
#矩形裁剪算法
from OpenGL.GLUT import *
from OpenGL.GL import *
import sys
blue=(0.0,0.0,1.0)
green=(0.0,1.0,0.0)
red=(1.0,0.0,0.0)
color=blue
winx=400 #窗口宽度
winy=400 #窗口高度
l1=[];#存储坐标
class point:
    x=0 #x坐标
    y=0 #y坐标
    pl=0 #相对于矩形裁剪区域左边,此点的位置,0为内,1为外
    pt=0 #相对于矩形裁剪区域上边,此点的位置,0为内,1为外
    pr=0 #相对于矩形裁剪区域右边,此点的位置,0为内,1为外
    pb=0 #相对于矩形裁剪区域下边,此点的位置,0为内,1为外
    def __init__(self,x,y,pl,pt,pr,pb):
        self.x=x
        self.y=y
        self.pl=pl
        self.pt=pt
        self.pr=pr
        self.pb=pb
i=point(0,0,0,0,0,0)
#函数:得到被裁剪区域顶点坐标相对于裁剪区域四条边的位置
def judgePositon(i,prt,plb):
    #判断左边
    if(i.x<plb.x):
        i.pl=1
    else:
        i.pl=0
    #判断上边
    if(i.y<prt.y):
        i.pt=0
    else:
        i.pt=1
    #判断右边
    if(i.x<prt.x):
        i.pr=0
    else:
        i.pr=1
    #判断下边   
    if(i.y<plb.y):
        i.pb=1
    else:
        i.pb=0
def leftClip(prt,plb,*l):
    l=l[0]
    l2=[]
    #左边裁剪
    print(l[0].x)
    for i in range(0,len(l)):
        if(i==len(l)-1):
            if(l[i].pl==0):
                #都在内部,保留第二个顶点
                if(l[0].pl==0):
                    l2.append(l[0])
                #一内一外,保留交点
                else:
                    k=(l[i].y-l[0].y)/(l[i].x-l[0].x)
                    b=l[i].y-k*l[i].x
                    x=plb.x
                    y=x*k+b
                    temp=point(x,y,0,0,0,0)
                    l2.append(temp)
            else:
                #一外一内,保留交点与内
                if(l[0].pl==0):
                    k=(l[i].y-l[0].y)/(l[i].x-l[0].x)
                    b=l[i].y-k*l[i].x
                    x=plb.x
                    y=x*k+b
                    temp=point(x,y,0,0,0,0)
                    l2.append(temp)
                    l2.append(l[0])
                #都在外部,全部舍弃
                else:
                    pass

        else:
            if(l[i].pl==0):
                #都在内部,保留第二个顶点
                if(l[i+1].pl==0):
                    l2.append(l[i+1])
                #一内一外,保留交点
                else:
                    k=(l[i].y-l[i+1].y)/(l[i].x-l[i+1].x)
                    b=l[i].y-k*l[i].x
                    x=plb.x
                    y=x*k+b
                    temp=point(x,y,0,0,0,0)
                    l2.append(temp)
            else:
                #一外一内,保留交点与内
                if(l[i+1].pl==0):
                    k=(l[i].y-l[i+1].y)/(l[i].x-l[i+1].x)
                    b=l[i].y-k*l[i].x
                    x=plb.x
                    y=x*k+b
                    temp=point(x,y,0,0,0,0)
                    l2.append(temp)
                    l2.append(l[i+1])
                #都在外部,全部舍弃
                else:
                     pass
    return l2
def topClip(prt,plb,*l):
    l2=l[0]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值