环境准备:
Python版本是3.5.1。使用pip命令:pip install pyopengl 安装pyopengl模块。
图形学期末设计,不知道用opengl或webgl做什么炫酷的效果,只好做算法了,悲剧的写了500多行,缺点是裁剪算法未封装成函数。
另外注意需要将opengl文件复制到系统盘System32(32位系统)或SysWOW64(64位系统)目录下,不然可能或报错。我在学校实验室碰到了此问题,错误信息好像是glutInit函数不能使用之类的。
代码如下:
#encoding='utf-8'
#python3.5.1
#author by 张政伟 2016/6/16
#矩形裁剪算法
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
#窗口左上角为(0,0),而PyOpengl画图以窗口中心为(0,0)且最大x坐标与y坐标都是100。
#因此需要将鼠标获取的坐标转换成PyOpengl画图坐标。
def translate(point):
a=winx/2
b=winy/2
if point.x < a and point.y < b:
point.x=(point.x/a)*100-100
point.y=100-(point.y/b)*100
elif point.x > a and point.y < b:
point.x=((point.x-a)/a)*100
point.y=100-(point.y/b)*100
elif point.x < a and point.y > b:
point.x=(point.x/a)*100-100
point.y=((point.y-b)/b)*100*(-1)
else:
point.x=((point.x-a)/a)*100
point.y=((point.y-b)/b)*100*(-1)
def display():
glClearColor(0.0,0.0,0.0,0.0) #背景色=黑色,RGBA全为0
glClear(GL_COLOR_BUFFER_BIT) #清除颜色缓冲区
glColor3fv(color) #设置下面绘制物体的颜色
#f表示参数类型为浮点类型,v表示接受的参数为数组形式
#glRectf(-10.0,-20.0,20.0,10.0)
#绘制坐标系
glColor3f(1.0, 1.0, 1.0)
glBegin(GL_LINES)
glVertex2f(0.0, 0.0)
glVertex2f(0.0, 95.0)
glVertex2f(0.0, 95.0)
glVertex2f(4.0, 92.0)
glVertex2f(0.0, 95.0)
glVertex2f(-4.0, 92.0)
glVertex2f(0.0, 0.0)
glVertex2f(0.0, -95.0)
glVertex2f(0.0, 0.0)
glVertex2f(95.0,0.0)
glVertex2f(95.0,0.0)
glVertex2f(92.0,4.0)
glVertex2f(95.0,0.0)
glVertex2f(92.0,-4.0)
glVertex2f(0.0, 0.0)
glVertex2f(-95.0,0.0)
glEnd()
glColor3f(0.0,0.0,1.0)
glBegin(GL_POINTS);
glVertex2i(0,0);
glEnd();
glFlush()
def reshape(winx,winy):
glViewport(0,0,winx,winy) #定义相对视窗大小(像素范围)
glMatrixMode(GL_PROJECTION) #选择投影矩阵
glLoadIdentity() #读取规范化的单位矩阵
glOrtho(-100.0,100.0, -100.0,100.0, 0.0,100.0)
#定义空间坐标系范围
glMatrixMode(GL_MODELVIEW) #选择模型视图矩阵
glLoadIdentity()
def key(key,mousex,mousey):
global color
if (key==b'q'): #按下q按键时
print('退出')
glutDestroyWindow(winid) #根据ID结束窗口
sys.exit()
elif (key==b'e'):
l1.clear()
print('初始化界面')
glutPostRedisplay() #重绘,将调用display
elif (key==b'g'):
#以绿线画裁剪后图形并输出裁剪后坐标
if l1[0].x<l1[1].x:
#矩形裁剪区域:左下点的坐标
plb=point(l1[0].x,l1[0].y,0,0,0,0)
#矩形裁剪区域:右上点的坐标
prt=point(l1[1].x,l1[1].y,0,0,0,0)
else:
#矩形裁剪区域:左下点的坐标
plb=point(l1[1].x,l1[1].y,0,0,0,0)
#矩形裁剪区域:右上点的坐标
prt=point(l1[0].x,l1[0].y,0,0,0,0)
#输出
print