蒋寅军+邹良浩
摘 要:Processing软件是一个自由、开源的视觉艺术及视觉化呈现的程序设计平台,是专为艺术家设计的程序语言,尤其适合于由程序控制的动画开发。将Processing软件用于機构运动仿真,辅助《理论力学》课程中运动学部分的教学,比传统运动学仿真程序更简洁高效。该软件对学习其它程序设计语言也有帮助。
关键词关键词:Processing;计算机辅助教学;运动学;机构运动仿真;动画
DOIDOI:10.11907/rjdk.161228
中图分类号:G434
文献标识码:A 文章编号:1672-7800(2016)008-0189-03
作者简介作者简介:蒋寅军(1973-),男,湖南长沙人,武汉大学土木建筑工程学院讲师,研究方向为理论力学、结构力学。
0 引言
Processing语言是由美国MIT(麻省理工学院)的Medialab研究室美学与计算机研究小组于2001年发布使用的用于视觉艺术及视觉化呈现的程序设计平台,其设计初衷是作为一种简单的编程教学语言替代Basic、Logo等编程语言,在电子艺术的环境下介绍程序语言,并将电子艺术的概念介绍给程序设计师[1-2]。
Processing为艺术家和设计师所设计,具有以下特点:①简单:用户可以专注于图形与交互程序的设计,而不需要考虑诸如编译参数、路径、图形环境等任务;②友好:Processing有非常活跃的社区和用户群,容易得到支持,版本更新也很快;③基础性:只考虑静态图案;④活动性:直接形成动画。
Processing源于Java,因此其代码遵守Java语言规范。Processing是绿色、开源的自由软件, Windows系统使用的下载包只有108.32M,解压即可使用,运行界面如图1所示。
《理论力学》课程由静力学、运动学与动力学3部分组成,其中最难掌握的是运动学部分,对机构运动分析不清楚直接导致速度、加速度分析的困难,进而影响动力学基本原理的应用。运动学部分的教学需要直观生动的工具演示机构的运动情况,传统的方法是教师运用C/C++、Fortran、Matlab、Flash等语言或软件编制CAI教学程序,或运用UG、Solidworks等大型机械设计软件进行机构运动仿真,这两种方法的缺点是:自编软件数据结构及算法复杂,动画难以实现;大型机械设计软件操作复杂,价格昂贵;制作的CAI课件很难扩展与改动。笔者在接触到Processing后,认为该软件非常适于辅助理论力学运动学部分教学,简单的几十行代码就可以构造一个机构并使之运动,而且代码的可重用性很好,稍加扩展就可构成诸多常见机构并生成动画,值得推荐给理论力学任课教师使用。
下面以《理论力学》课程中常见的曲柄摇杆机构为例,说明利用processing软件进行机构运动仿真的应用过程,见图2。
1 曲柄摇杆机构运动仿真
一个典型的Processing程序主要由setup()和draw()两个函数组成:在setup()函数中完成图像、动画的设置(如屏幕尺寸、刷新频率等),在draw()函数中实现动画。可以定义其它子程序进行一些必须的参数计算和图形绘制。
1.1 物理模型分析
Processing绘制动画的策略是在屏幕上逐时刻绘制图形图像,因此首先分析机构的物理构成:图2所示曲柄摇杆机构由4类元件构成:杆件(2根——OA、O1B)、基础(在固定铰支座中绘制)、固定铰支座(2个——O、O1)、套筒(1个——A)。理论力学中的平面机构基本都包含这些元件[3],也是机构运动动画图形绘制的元素。
1.2 元件绘制——可重用代码
绘制每个元件的子程序只需两类参数:位置参数(屏幕坐标x、y,方位角angle)、尺寸参数(长、宽、高等)。对于本例涉及的4类元件,其子程序详见程序1。元件的不同组合可以构成不同的机构,因此元件绘制代码是可重用的。
绘制元件有多种方式实现,如杆件可以用两点间的直线表示,但这无助于学生理解刚体的平面运动,若转换为通过端点坐标和杆件与x轴的夹角来绘制,则更便于表示杆件随基点的平动和绕基点的转动。
各子程序中使用了部分绝对尺寸,如固定铰支座及套筒。也可以将这些物理量定义为子程序的参数,由用户在使用时指定,但这无疑会带来程序编制和使用上的复杂性。
程序1:components.pde——元件库
void bar(float x,float y,float leng,float angle){ //绘制杆件
pushMatrix(); translate(x,y); rotate(radians(angle));
line(0,0,leng,0);
popMatrix();}
void baseSupport(float x,float y,float leng,float angle){ //绘制基础
pushMatrix(); translate(x,y); rotate(radians(angle));
line(-leng/2,0,leng/2,0);
int n=int(leng/10);
for (int i=0;i line(-leng/2+(i+1)*10,0,-leng/2+i*10,10); } popMatrix();} void fixHingeSupport(float x,float y,float angle){ //绘制固定铰支座 pushMatrix(); translate(x,y); rotate(radians(angle));
this.baseSupport(0,20,40,0); //调用基础绘制函数
line(10,20,0,0);
line(-10,20,0,0);
ellipseMode(CENTER);
ellipse(0,0,10,10);
popMatrix(); }
void sleeve(float x,float y,float angle){ //繪制套筒
pushMatrix(); translate(x,y); rotate(radians(angle));
rectMode(CENTER);
rect(0,0,20,15);
ellipseMode(CENTER);
ellipse(0,0,10,10);
popMatrix(); }
1.3 整体机构绘制——几何约束条件
一个机构事实上是一系列受约束的点和刚体的集合,各元件必须满足几何约束条件(也可称为几何相容条件、几何协调条件)。
对于图2所示的曲柄摇杆机构,根据几何关系及已知条件可知:
xO = const,yO = const,xO1 = const,yO1 = constxA = lOA cosθOA ,yA = lOA sinθOA ωOA = f(t),θOA = θOA t = 0 + ∫t0f(t)dtθO1 B = arctanlOA cosθOA dOO1 -lOA sinθOA -π2
其中:xO、yO、xO1、yO1、xA、yA分别为O、O1、A点的x、y坐标;lOA为OA杆的长度;θOA、θO1B分别为OA、O1B杆与x轴的夹角;ωOA为OA杆的角速度,其随时间变化的规律f(t)通常是已知的;θOA t = 0 为OA杆在t=0时刻与x轴的夹角;dOO1为O、O1两支座间的距离。
考虑上述几何约束条件,利用之前构建的可重用元件代码,即可写出绘制整个曲柄摇杆机构的子程序crank_rocker()(见程序2)。该子程序主要包含3个部分:①已知参数赋值,如各杆长度、支座间距等;②与时间有关的参数计算,如摇杆角度、套筒位置等,其中摇杆角度ang1的计算是实现几何相容的关键;③绘制元件;④更新位置,如在曲柄的转角上叠加一个增量。
程序2:crank_rocker.pde——绘制曲柄摇杆机构
void crank_rocker (float x0,float y0,float angle){ //绘制曲柄摇杆机构
pushMatrix(); translate(x0,y0); rotate(radians(angle));
float len0=100; //已知参数赋值
float len1=300;
float dis12=150;
float ang1=-90+degrees(atan(len0*(cos(radians(ang0)))/(dis12-len0*sin(radians(ang0)))));
//参数计算
float xs=len0*cos(radians(ang0));
float ys=len0*sin(radians(ang0));
fixHingeSupport(0,0,0); //绘制元件
fixHingeSupport(0,dis12,0);
bar(0,0,len0,ang0);
bar(0,dis12,len1,ang1);
sleeve(xs,ys,ang1);
ang0=ang0+omega0; //更新位置
popMatrix(); }
1.4 动画实现
在draw()函数中调用函数crank_rocker()即可产生动画(见程序3)。曲柄初始角度(ang0)、屏幕刷新率(framerate)以及曲柄的角速度(omega0)则作为全局变量指定。需要将main.pde、crank_rocker.pde、main.pde置于同一文件夹下,或者将它们合并为一个文件。
程序3:main.pde——主程序
float ang0=0; //曲柄初始角度
int framerate=30; //屏幕刷新率(Hz)
float omega0=30./float(framerate); //角速度(度/秒)/屏幕刷新率
void setup() {
size(800,600); //屏幕尺寸
frameRate(framerate); /*屏幕刷新率(Hz)*/ }
void draw() {
background(255); //背景颜色
crank_rocker (400,350,0); /*绘制机构*/ }
2 Processing程序简洁性
整个机构运动过程的模拟,只需要定义setup()、draw()和5个构件绘制子程序(其中4个为可重用元件代码,在编制其它机构仿真程序时还可以使用),思路明确、代码结构清晰。元件库代码由教师给出,学生练习时把重点放在具体的机构绘制子程序上,代码量小,可即学即用。各元件运动学参数的几何相容是实现机构运动仿真的关键,对于学生理解和掌握点和刚体的运动尤其重要。在掌握Processing程序的基本结构和语法后,几个小时就可以写出一个运行良好的机构运动仿真程序,非常高效。
用Processing进行平面机构运动仿真简洁高效的原因是其封装了坐标变换函数,能方便地實现动画。《理论力学》课程的运动学部分主要包括点的运动学和刚体的运动学,其中刚体的运动包含了点的运动,刚体的平面运动是其中最复杂、最难以理解和想象的内容。刚体的平面运动可以分解为随基点的平动和绕基点定轴转动的合成,Processing中的translate()函数和rotate()函数对应着这两种运动。配对使用pushMatrix()和popMatrix()函数则构造了一个局部坐标系,利用pushMatrix()和popMatrix()函数可以在屏幕任意区域绘图而不用考虑坐标系的转换。在使用C/C++、Fortran、Matlab、Flash等语言编程时,坐标变换和对时间积分是最繁琐的部分,Processing通过封装函数非常巧妙而简单地实现了这两个功能,本文中的子程序都是利用这4个函数实现的。
需要注意的是:①Processing默认的坐标原点在屏幕左上角,x轴以向右为正,y轴以向下为正,转角以顺时针方向为正,参见图2,需要注意编程时选取的元件绘图参数是否适当;②各元件的位置直接由运动方程显式给出。当运动方程复杂时,可能需要编写求解程序或引入数学工具包进行求解,这时就必须引入MATLAB等数学软件[4];③要给出各元件位置变化的迭代公式(如crank_rocker()函数中的ang0=ang0+omega0),否则无法实现动画;④程序中角度值默认使用弧度为单位,如果需要按度计算,可通过degrees()和radians()这两个函数进行转换;⑤为了展示简洁性,本文中的代码对绘图没有进行任何美化。实际应用中,通过控制色彩、画笔和渲染引擎,可将机构绘制得更美观,甚至实现三维动画仿真。
3 结语
运动学是理论力学课程的重点与难点,机构运动学仿真是实现理论力学CAI教学的关键。开源、自由软件Processing的使用,可快速实现机构运动学仿真与可视化,简单高效。Processing简单、形象、有趣,一些基本的编程训练对于力学、机械、土木类各专业后续计算机语言的学习和编程能力的提高都大有裨益。结合Processing和一些物理函数库,还可扩展到理论力学课程教学各环节。
参考文献:
[1] 苗彬,候燕.基于Moodle云的C语言辅助教学平台设计[J].软件导刊,2014(5):7-9.
[2] 列阿斯.爱上Processing[M].第2版.北京:人民邮电出版社,2014.
[3] 王铎.理论力学 [M].第7版.北京:高等教育出版社,2009.
[4] 敖文刚,李勤,王歆.基于Matlab的理论力学计算机辅助教学[J].力学与实践,2013,35(1):83-86.
(责任编辑:杜能钢)