点击浏览该文件源文件:
点击浏览该文件UploadFile/2004-4/20044312818100.swf数据结构及数据定义(代码位于主场景第1帧)
小球,小棍分别用一个数组存储:dot[sm]和gun[sm_gun] ,sm是小球的数目,sm_gun是小棍的数目。 小球:
x,y,z(空间坐标)[初始化时提供值]
vx,vy(屏幕显示坐标)[这两个值由函数"v_xz()"计算得到]
col(颜色,实际上是帧数。小球是个含有若干关键帧的MC,显示时由col决定停在哪一帧上)[初始化时提供值]
r(半径,实际上是为了小棍的"消隐"而设计这个值的,本程序中的小球未使用r)[初始化时提供值] 小棍:
dot_s,dot_e(分别是起点和终点小球的编号)[初始化时提供值]
sx,sy,sz(实际起点的空间坐标)[由函数"gun_js()"根据起点终点小球坐标以及起点小球的半径算得] ex,ey,ez(实际终点的空间坐标)[由函数"gun_js()"根据起点终点小球坐标以及终点小球的半径算得] svx,svy(起点的屏幕显示坐标)[由函数"v_xz()"根据sx,sy,sz的值计算]
evx,evy(终点的屏幕显示坐标)[由函数"v_xz()"根据ex,ey,ez的值计算]
oy(小棍中点处的空间坐标的y值,用于比较深度)[根据起点终点小球的空间坐标y值计算] 下面以甲烷的数据为例:
// 甲烷
function get_data_2() {
// 小球初始化
// 小球数目
sm = 5;
dot = new Array(sm);
for (i=0; i
dot[i] = new Object();
dot[i].x = 0;
dot[i].y = 0;
dot[i].z = 0;
dot[i].vx = 0;
dot[i].vy = 0;
dot[i].col = 0;
dot[i].r = 5;
}
// 0
dot[0].x = 50;
dot[0].y = 50;
dot[0].z = 50;
dot[0].col = 1;
// 1
dot[1].x = -50;
dot[1].y = -50;
dot[1].z = 50;
dot[1].col = 2;
// 2
dot[2].x = -50;
dot[2].y = 50;
dot[2].z = -50;
dot[2].col = 3;
// 3
dot[3].x = 50;
dot[3].y = -50;
dot[3].z = -50;
dot[3].col = 4;
// 4
dot[4].x = 0;
dot[4].y = 0;
dot[4].z = 0;
dot[4].col = 10;
// 小球初始化完成
//
// 小棍初始化
// 小棍的数目
sm_gun = 4;
gun = new Array(sm_gun);
for (i=0; i
gun[i] = new Object();
gun[i].dot_s = 0;
gun[i].dot_e = 0;
gun[i].sx = 0;
gun[i].sy = 0;
gun[i].sz = 0;
gun[i].ex = 0;
gun[i].ey = 0;
gun[i].ez = 0;
gun[i].oy = 0;
// 屏幕坐标(起点和终点)
gun[i].svx = 0;
gun[i].svy = 0;
gun[i].evx = 0;
gun[i].evy = 0;
}
// 0
gun[0].dot_s = 0;
gun[0].dot_e = 4;
// 1
gun[1].dot_s = 1;
gun[1].dot_e = 4;
// 2
gun[2].dot_s = 2;
gun[2].dot_e = 4;
// 3
gun[3].dot_s = 3;
gun[3].dot_e = 4;
// 小棍初始化完成
}
//
自定义函数和主调程序段:(代码位于主场景第2帧)
gun_js() [为达到消隐的目的,小棍的起点和终点必须是在球的表面上,而不是球的中心。本函数就是根据起点小球和终点小球的空间坐标来计算小棍实际的起点和终点的空间坐标。另外还计算了小棍中点处的空间坐标y值,这个值用于比较深度,也是为消隐作准备]
scale(s) [整体缩放函数,本程序中未使用]
rotate(xa, ya) [旋转函数,xa是绕x轴旋转的角度值,而ya是绕z轴旋转的角度值,并不是y轴,这是变量名书写不当造成的,未做修改]
v_xz(d) [本函数将小球,小棍的空间坐标换算成屏幕显示坐标,也就是将那些坐标点投影到xz平面上,d是视点到xz平面的距离]
get_deeps() [将各小球,各小棍的深度值取出,放到一个新的数组中,并同时记录小球或小棍的编号。由于小球,小棍的编号都是从0开始,为了区分小球和小棍,特将小棍的编号加上1000后再存储。执行此函数后得到一个存有深度值和对应编号的数组"deeps[sm+sm_gun]",后面进行消隐显示时就方便了]
get_v() [消隐显示,从最深度最大者开始,逐个显示小球或小棍。从数组"deeps[sm+sm_gun]"中找出y值最小者,即深度最大者,并记录相应的编号,然后根据编号是>=1000还是<1000即可判断它是小棍还是小球,然后提取相应编号的小棍或小球的屏幕显示坐标值,对于小球而言,还须提取其颜色值和深度值,以便于显示不同颜色,不同大小,不同模糊程度。]
cl_all() [清除所有用于显示小球和小棍的MC,本函数在按钮中用到]
stop();
// 原点坐标
ox = 200;
oy = 200;
// 取得点集
get_data(3);
// 小棍的起点,终点,深度计算
function gun_js() {
var i, a, b, ar, br, dxy, dxz;
var ax, ay, az, bx, by, bz, dx, dy, dz;
for (i=0; i
a = gun[i].dot_s;
ar = dot[a].r;
ax = dot[a].x;
ay = dot[a].y;
az = dot[a].z;
//
b = gun[i].dot_e;
br = dot[b].r;
bx = dot[b].x;
by = dot[b].y;
bz = dot[b].z;
//
dx = bx-ax;
dy = by-ay;
dz = bz-az;
// dxy,dxz分别是a,b投影到xy,xz面上后的距离
dxy = Math.sqrt(dx*dx+dy*dy);
dxz = Math.sqrt(dx*dx+dz*dz);
// 绘图时的起点坐标
gun[i].sx = (dxy-br)*dx/dxy+ax;
gun[i].sy = (dxy-br)*dy/dxy+ay;
gun[i].sz = (dxz-br)*dz/dxz+az;
// 绘图时的终点坐标
gun[i].ex = -(dxy-ar)*dx/dxy+bx;
gun[i].ey = -(dxy-ar)*dy/dxy+by;
gun[i].ez = -(dxz-ar)*dz/dxz+bz;
// 小棍中点处的y值,用以比较深度
gun[i].oy = (ay+by)/2;
}
}
//
// 缩放函数,s为缩放系数
function scale(s) {
[1] [2] [3] 下一页