用C语言实现图形动画技术

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

cleardevice () ;
setcolor (L I GHT GREEN) ;
settextstyle ( TRIPL EX- FON T , HORIZ-DIR ,i + + ) ; widt h = textwidt h (string) ; height = text height (string) ; outtextxy ( (639 - widt h) / 2 ,175 - height/ 2 ,string) ; delay (3000) ;
/ 3 左边球向左 ,右边球向右运动 ,到达边界后结束 3 / {putimage (255 - i ,170 ,buffer ,COP Y- PU T) ; putimage (315 + i ,170 ,buffer ,COP Y- PU T) ; } }while ( ! kbhit () ) ;
Your”为画面 ,在两页上用两种颜色交替写上该字 ,并在两页
间交替显示 ,每次逐渐地放大页面上的字体 ,由此使字符由小
到大 ,由远到近地出现在屏幕中间 ,好似一个特写镜头 。
# include”graphics. h”
main ()
{int gdriver = V GA ,gmode = V GAM ED ,i ,height ,widt h ; unsigned char 3 string = ”Welcome Your”; initgraph ( &gdriver , &gmode ,””) ;
计算机时代 1999 年第 3 期
程序设计
2 利用图形页面技术
一般图象存储器中可以存储多个页面 ,当某种显示模式
支持两个以上的页时 (如 V GAM ED 模式) ,则用 C 语言提供
的两个页面设置函数 (即 setactivepage ( ) 和 setvisualpage ( ) ) ,
可以设置当前编辑页和显示页 。
public static String get WorldURL () ;
get WorldU RL () 返回整个世界的根 U RL ,而不是当前场 景的 U RL 。
通过调用 loadWorld() 方法 ,可以替换整个虚拟世界 。类 似于 VRML 中的 U RL 引用 ,该方法传递一个字符串数组 ,这 些字符串是按优先顺序排列的 U RL ,当读取第一个 U RL 失 败 ,就尝试第二个 ,直至装载成功或是到达列表的末尾 。如果 装载失败就以某种浏览器指定的方式通知用户 。
所有程序均在 586 机 , Turbo C 2. 0 环境下运行通过 。 1 利用图象的存储与重放技术 C 语言 提 供 了 图 象 存 储 和 显 示 函 数 ( 即 getimage ( ) 和 putimage () ) 。实现方法是 :首先画好图形 ,再用 getimage () 函 数将屏幕图象保存到内存 ,然后用 putimage ( ) 函数将内存中 的图象重放到屏幕上 ,同时抹去了屏幕上的旧图象 ,接着又在 新坐标处用 putimage () 函数将图象重新显示 ,如此反复进行 , 出现动画效果 。 程序 DEMO1. C 就是利用这种方法 ,演示了两个小球分 别从屏幕的左右两边来回碰撞又弹回的过程 ,当按任一键时 , 则结束运行 。 # include”graphics. h” # include”malloc. h”
}
getch () ;
closegraph () ;
}
3 利用图象的异或 ( XOR) 操作技术
在图形方式下 C 语言还提供了设置画图的输出模式函
数(setwritemode( ) ) 。实现方法是 : 当设定 setwritemode ( ) 函
数的参数为 XOR- PU T 时 ,将先以异或方式画一幅图 ,然后在
除了替换整个世界 ,还有两个方法可以添加场景 。第一 个是 createVrmlFromString () 方法 ,该方法可以把返回节点加 入到场景中 。另一个更为有用的方法是调用 createVrmlFro2
14
mU RL () 。该方法的第一个参数是 VRL 列表 ,第二个参数是 一个节点实例 ,第三个参数是指向 event In 域名的字符串 。这 是一个非阻塞调用 ,它启动一个独立的线程从给定的 U RL 接 收文件 ,并转换为内部形式 ,然后将这些新创建的节点列表传 送到指定节点的 event In ,event In 类型必须为 MFNode ,节点 引用可以是任何类型的节点 。这样 ,程序员就可以直接往场 景中添加新的节点了 。注意 ,必须要把这两个方法的返回节 点加入场景中已经存在的节点中 ,不然这些新节点是看不见 的 。在创建了一组新的节点以后 ,下一步再把它们联系起来 , browser 类定义了一些方法来动态地添加或删除节点间的路 由。
Node toNode , String to Event In) t hrows InvalidRoute Exception ;
在 VRML 中 ,无法取得节点中某个域的实例指针 ,需要 采用对应于 event In/ eventOut 域名的字符串 。如果该节点或 域不存在 ,或是删除一个并不存在的路由 ,则抛出例外 。
实现方法是 : 用 setactivepage ( ) 函数设置某一页为编辑
页 ,并在该页上绘制图形 ,但该页并不显示 ,必须用 setvisual2
page () 函数设为显示页 ,然后设另一页为编辑页 ,进行画图 ,
再设该页为显示的页 ,这样在两页间反复交替地进行 ,就会产
生动画的形象 。
程序 DEMO2. C 应用图形页面技术 ,演示了以“Welcome
main ()
{int gdriver = DETECT ,gmode ,i ,size ;
void 3 buffer ; initgraph ( &gdriver , &gmode ,””) ;
cleardevice () ;
setcolor ( YELLOW) ;
setlinestyle (0 ,0 ,1) ;
public void addRoute (Node fromNode , String fromEventOut , Node toNode , String to Event In)
t hrows InvalidRoute Exception ; public void addRoute (Node fromNode , String fromEventOut ,
cleardevice () ;
setcolor (L I GHTRED) ;
settextstyle ( TRIPL EX- FON T , HORIZ-DIR ,i) ;
widt h = textwidt h (string) ;
height = text height (string) ;
do { for (i = 0 ;i < 185 ;i + + )
/ 3 左边球向右 ,右边球向左运动 ,直到相撞后结束 3 / {putimage (70 + i ,170 ,buffer ,COP Y- PU T) ; putimage (500 - i ,170 ,buffer ,COP Y- PU T) ; } for (i = 0 ;i < 185 ;i + + )
COM PU TER ERA
程序设计
用 C 语言实现图形动画技术
浙江省舟山商业学校 (316000) 韩 洁
动画的制作原理类似于电影 ,它是利用了人的视觉效应 , 使一幅图象在不同时间和位置多次出现 ,从而产生动画效果 。 利用 C 语言提供的图形处理函数设计动画程序 ,可以用于游 戏娱乐 、辅助教学 、实验模拟和仿真等计算机辅助设计 ,具有 较强的实用性 。下面介绍几种图形动画的实现技术 。
startx + = 2 ;starty + = startx 3 startx/ 2000 ;
/ 3 重新计算运动轨迹 3 / endx = startx + 10 ;endy = starty + 10 ; } closegraph () ;
}
4 利用动态开辟图视窗口技术
C 语言有两个图视窗口设置和清除函数 (setviewport () 与
public static void loadWorld ( String[ ] url) ; public static Node createVrmlFromString ( String vrmlSyntax) ; public static void createVrmlFromURL ( String [ ] url , Node node , String event InName) ;
setcolor (L I GHTRED) ; while (startx < xmax & &starty < ymax) {rectangle (startx ,starty ,endx ,endy) ; delay (200) ;
/ 3 画两次小方块 3 /
rectangle (startx ,starty ,endx ,endy) ;
outtextxy ( (639 - widt h) / 2 ,175 - height/ 2 ,string) ;
delay (3000) ;
setvisualpage (1) ;
/ 3 设第 1 页为显示页 3 /
setactivepage (0) ;
/ 3 设第 0 页为编辑页 3 /
{ int gdriver = DETECT ,gmode ;
int xmax ,ymax ,startx ,starty ,endx ,endy ; initgraph ( &gdriver , &gmode ,””) ; cleardevice () ; xmax = get maxx () ;ymax = get maxy () ; startx = 10 ;starty = 10 ; endx = 20 ;endy = 20 ; setwritemode ( XOR- PU T) ; / 3 设置异或方式输出图形 3 /
closegraph () ;
}
public static boolean get Headlight () ;
public static void set Headlight (boolean onOff) ;
一个复杂场景通常是静态和动态场景的组合 。要改变当 前场景 ,首先要知道虚拟世界的 U RL 。
settextjustify (L EFT- TEXT , TOP- TEXT) ;
cleardevice () ;
for (i = 1 ;i < 11 ;i + + )
{setvisualpage (0) ;
/ 3 设第 0 页为显示页 3 /
setactivepage (1) ;
/ 3 设第 1 页为编辑页 3 /
setfillstyle (1 ,5) ; circle (100 ,200 ,30) ;
/ 3 画洋红色小球 3 /
floodfill (100 ,200 , YELLOW) ;
ห้องสมุดไป่ตู้
size = imagesize (69 ,169 ,131 ,231) ;
buffer = malloc (size) ; getimage (69 ,169 ,131 ,231 ,buffer) ; / 3 保存圆球图到内存 3 /
clearviewport () ) 。实现方法是 :用 setviewport () 函数在不同位
置动态开辟图视窗口 ,在每个图视窗口中画出要显示图形 ,每
相同位置处以异或方式再画一次 ,该幅图即被抹掉 ,之后再在
新位置输出图象 ,每幅图均要画两次 ,即第一次显示 ,第二次
为抹掉 ,如此交替进行 ,从而产生了动画的效果 。
程序 DEMO3. C 利用该方法演示了一个以阻尼振荡轨迹 运行的小方块 。
# include”graphics. h”
main ()
相关文档
最新文档