绘制三维曲线-网站制作-3P代码网
繁体中文
设为首页
加入收藏
当前位置:网站制作首页 >> Flash教程 >> 绘制三维曲线

绘制三维曲线

2007-10-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介:上次“极坐标应用”的贴里边,有人要画曲面,我翻了些书。但愿可以做好。今天的这个是准备活动。趁着还没有上课,我尽量把最终的效果做好发上来吧。 因为i没有编译器,不能上穿效果了。大家只好来看代码。 Flash...
关键字:三维 曲线

上次“极坐标应用”的贴里边,有人要画曲面,我翻了些书。但愿可以做好。今天的这个是准备活动。趁着还没有上课,我尽量把最终的效果做好发上来吧。

因为i没有编译器,不能上穿效果了。大家只好来看代码。

Flash是不能靠原有的APIs绘制3D曲线的,所以我要在2D平面得到3D的投影来表示,可是不能是平凡的投影,还要考虑透视效果。

我的基本想法是“截面”,就是对Z轴不同的点 n 建立一个平面坐标XznY,这个新的坐标有自己的一套参X0,Y0,和单位长度。然后我们根据空间原始的x,y,z得到坐标XznY的一点,在对应的转化到XZ0Y,就是真正划线的那个平面。

这个是坐标XznY的代码,

class ZC {

var scale;//坐标的缩放系数

var x0, y0; //坐标原点

static var zc:Array = new Array; //储存实例

private var ID; //坐标编号

static var mapping; //映射参数,还没有实现

private static var Max = 550;//影射常数参数

//构造函数,我要使用应用singleton

private function ZC(z) {

this.ID = z;

scale = 1-z/Max;

var oo1 = z*Math.tan(Math.PI/8);

x0 = oo1*Math.cos(Math.PI/6);

y0 = oo1*Math.sin(Math.PI/6);

}

//创造坐标实例

public static function getZC(z) {

if(z >= Max||z<=-Max)

return ;

if (zc.length != 0)

for (var i = 0; i

if (zc[i].ID == z) //bug

return zc[i];

zc.push(new ZC(z));

return zc[zc.length-1];

}

//坐标实例的ID

function getID() {

return this.ID;

}

}

在代码中有算法意义的也就是构造函数那部分了,他原则上对空间曲线的每一个点都建立一个坐标,储存准备转化到XZ0Y的信息。scale是一个XznY单位长度和XZ0Y单位长度的比

转化函数

function transfer(x, y, z) {

if (z == undefined || z == null) {

z = 0;

}

var aZC = ZC.getZC(z);

var point = new Object();

point.x = aZC.x0+x*aZC.scale;

point.y = aZC.y0+y*aZC.scale;

return point;

}

测试我画了一个圆在XY0Z平面:

import ZC;

#include "transfer.as"

var rad = 0;

onEnterFrame = function () {

var x = 150*Math.cos(rad);

var z = 150*Math.sin(rad);

var point = transfer(x, 0, z);

if (rad == 0) {

_root.moveTo(point.x, point.y);

}

_root.lineTo(point.x, point.y);

rad += .1;

_root.lineStyle(1, 0, 50);

};

_root._x = _root._y=200;

_root._yscale = -100;

【内容导航】

第1页:绘制三维曲线

第2页:使用singleton提高效率

我本来不喜欢效率问题的,但是面对这个问题不得不考虑的。

我的想法就是要为你画的每一个点都要新建一个坐标。但是真的这样做我保证画了几条曲线就死机了:一个曲面要包含那么多的曲线,记录每一个点的坐标就要创造一个ZC对象,创造了超级大量的对象,内存就不够了。

但是同样在一个XZnY的点有很多,怎么样利用已经创造的ZC对象呢?这里使用了singleton模式。

singleton是一种创建模式。目的在于创建一个共享的实例。保证某个类仅有一个实例,并提供一个访问它的全局访问点。

实现的方法好像很定势啊,如下:

1,在类里边声明一个本类类型的静态变量。

2,使用private的构造函数,禁止外部通过构造函数产生实例。

3,用一个静态的共有函数提供产生实例。

classSingletonDemo{

staticvardemo;

privatefunctionSingletonDemo(){

}

staticfunctiongetInstance(){

if(demo!=null||demo!=undefined)

returndemo=newSingletonDemo();

returndemo;

}

}

我那个在此基础上改了一下,储存了一个静态的数组,数组里边放的实例,只要你做到了只读就可以了。

这样只要是在同一个坐标里的点都应用同一个ZC对象,最多建立1000个,加上对象规模较小,这对AS来说不会构成内存耗尽的危险,执行的速度也不是很慢。

有点像pool技术呢,得意一下。

第一帖的红色部分是一个严重的bug,因为当时没有做曲面的调试,请改正为

if(Math.abs(zc[i].ID-z)<=aNumber)

这个aNumber是一个划线的精确程度,试着给他一个较大的值能画出折线,

现在调试了椭圆面,文件我也穿上来了。

点击浏览该文件

请大家帮忙调试

效果

点击浏览该文件

调试的结果有点叫人失望,储存200个左右的ZC对象的时候,画图就变得很慢了,我的机器还是1G内存的呢。

【内容导航】

第1页:绘制三维曲线

第2页:使用singleton提高效率

责任编辑:admin
相关文章