环境准备:
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]