快速业务通道

一个菜鸟是如何用curveTo画出双曲线的

作者 佚名技术 来源 服务器技术 浏览 发布时间 2012-07-13



点击浏览该文件
http://www.Flash8.net/bbs/UploadFile/2005-4/2005413201042730.swf
我以前画曲线都是用lineTo画很短很短的直线连接的,这样机子跑起来有点慢,于是很想知道怎么用curveTo画曲线,在论坛上搜了一下(版主说问问题前先搜索的,呵呵),正好搜到egg61620048月贴的一个帖子,上面详细的阐述了怎么用curveTo画圆、抛物线的方法,呵呵,帖子太长,我没看完(其实我看下去也看不懂),于是我自己想。 curveTo画出来的是一条二次贝赛尔曲线,curveTo里面的4个参数就是那个贝赛尔曲线的控制点和一个端点的xy坐标,这样,只要我们知道端点和控制点的坐标是什么,用curveTo画曲线就很容易了。 例如:已知一段线的端点是a(axay)b(bxby),控制点是c(bxby),那么只要: _root.createEmptyMovieClip(“aaa”,1);
aaa.lineStyle(1,0x000000,100);
aaa.moveTo(ax,ay);
aaa.curveTo(cx,cy,bx,by);
就画出了一条二次贝赛尔曲线了。那么,要用curveTo画曲线关键就是获得相应的端点和控制点了。 端点坐标很容易得到的,在你要画的曲线(圆、双曲线、指数函数曲线、对数函数曲线等等)上任取一点Pxy),x自己选,y可以根据方程式算出来,这就是端点了,然后只要知道控制点的坐标值,就可以利用curveTo画线了。 其实以一条二次贝赛尔曲线的两个端点为切点作切线,其交点就是那个控制点(自己算一下8条贝赛尔曲线画圆的里面那些点的坐标就能得出这个结论的)。那么我们需要先得到切线,双曲线的切线方程是这样的: 已知双曲线 上有一点Px1y1),那么过P作的切线方程就是: ,换算一下就是: (看看有没有错,我很粗心的,最好大家自己也算一下啊)。 这样,如果取两点P1P2就会得到两个切线方程了,然后根据这两个方程算出交点(直线交点大家都会求的哦),这个交点就是控制点了,然后,多取几个端点,算出交点,哈哈,^_^,就可以写代码,画双曲线了。 我的思路是这样的(这里声明一下,我不是程序员,我学flash之前学过的最深奥的关于编程的东东就是c语言里的数组,高手们不要鄙视我啊):我们要用到用xy坐标表示的点,于是我写一个Point()类,这些点有端点和控制点,端点都是在双曲线上的,所以我们需要一个函数sqxfz(双曲线赋值的缩写,哈哈)来根据点的x坐标按照双曲线方程算y坐标,然后,我们需要计算切线方程,所以我写了个函数sqxqx(双曲线切线的缩写),有了直线,要求交点,于是,再写一个函数qxjd(切线交点),然后,写一个类Shuangquxian(),里面有一些属性,都是画线需要的,最后,这些都准备好了,那么,可以画线了,我的代码是这样的(我好紧张!怕被鄙视啊!各位大侠贴下留情啊!可以跳过不看的,最重要的是自己写出代码): var mousedown = false;//用于判断鼠标是否被按下
function Point(x, y) {//创建Point类
this.x = x;
this.y = y;
}
function Shuangquxian(a, b) {//创建双曲线类
this.a = a;
this.b = b;//a、b就是双曲线的a、b咯
//下面的dd是贝赛尔曲线的端点,jd是贝赛尔曲线的控制点(即通过dd作切线后切线的 交点)
this.dd = [];
this.jd = [];
for (var i = 0; i<=3; i++) {
this.dd[i] = new Point(0, 0);
this.jd[i] = new Point(0, 0);
}
with (this) {//给各端点的x坐标赋值
c = 320-a;//这里减去320是因为场景是640×480的
dd[0].x = a;
dd[1].x = a+c/12;
dd[2].x = a+c/6;

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号