问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在flash中画圆?

发布网友 发布时间:2022-05-06 14:49

我来回答

3个回答

热心网友 时间:2022-07-01 01:31

在FLASH或PHOTOSHOP中能够很轻松的画出一个圆或者椭圆,怎样做一个作品,让用户可以直接在里面拖动鼠标画出一个圆或者椭圆来呢?下面是用AS实现这个效果的讲解--

一、基本定义:虽然说不说大家都清楚,但是我还是想讲一下,以免一些人忘得差不多了~~

圆:平面上到定点距离等于定长的点的轨迹。
椭圆:平面上到两定点距离和等于定长(定长大于两定点间距离)的点的轨迹。

二、问题描述:画圆和椭圆,使用AS。

三、问题分析:

1.圆
呵呵,大多数人看到后肯定想:哼~这不简单,不就是描点法嘛?知道方程就行了~嗯,使用方程进行描点,固然是不错的方法,当初我也是这么做的。但是——(First Declare:如果你是用curveTo的,另当别论)
我们可以改进那种画圆的方法:
首先,为了更好地写出简洁的代码,我们不应采用普通方程,而应采用参数方程:

x = r×cos(a) y = r×sin(a) 其中a为参数。

然后,很重要的一点,关于时间复杂度,这点不得不考虑:如果a这个参数我们进行描点的时候选用增量为0.01则要进行2PI/0.01次描点,相当大。如果每次都这样,显然不是很好(或许有些人能够接受,但是我往往习惯于无法容忍这样的时间复杂度)。于是我们可以想:圆与圆之间有什么不同?对了,半径,圆心位置而已。那么,就好办了。我们可以先用描点画一个圆存在一个mc里(当然也可以直接用鼠标画个mc),然后到时候复制并调整就OKay了。这是一个重要的思想。

2.椭圆:
圆的标准方程为x^2+y^2 = r^2,而椭圆是x^2/a^2+y^2/b^2=1。而对于圆上的一点(用参数方程表示):

(r×cos(a),r×sin(a)) 其中a为参数。

我们如果将x方向按系数kx压缩(或扩大),将y方向按系数ky压缩(或扩大),则为(kx×r×cos(a),ky×r×sin(a))。这样这个点必在x^2/(kx×r)^2+y^2/(ky×r)^2 = 1上,则这样的点的轨迹是一个椭圆!!!
这证明了压缩圆所得的图形是椭圆!!
如此,我们可以用设置复制出的圆mc的_xscale和_yscale来使它变成需要的椭圆!How nice!~
如此画圆和椭圆就快多了

四、代码解析

function circleforbase() {//用来画基础圆的mc,以后的所有圆或者椭圆都由这个圆复制得来
_root.createEmptyMovieClip("circle", 0);//创建一个空的mc
circle.lineStyle(1, 0x000000, 100);//设置线的属性
var th = 0;//这个是使用圆的参数方程画圆的那个参数~每次以step累加
var step = 0.01;//参数的步长,即每隔0.01弧度描一个点
with (circle) {
moveTo(100, 0);//移到将要画的圆最右边的那个点
do {
th += step;//参数值增加
lineTo(Math.cos(th)*100, Math.sin(th)*100);//按参数方程描点
} while (th<=Math.PI*2);//当参数等于2PI时停止,刚好一个圆周
_visible = 0;//将这个画好的圆设置为“*”
}
}
circleforbase();//画一个基础圆mc,注意这个基础圆的mc名字叫circle
n = 0;//表示圆的个数
f = 0;//表示鼠标的状态,1表示处于按下状态,0相反
stx = 0;
sty = 0;
enx = 0;
eny = 0;
//椭圆将被包涵在一个矩形内,以上的四个变量表示矩形的对角线上的两个顶点,这样可以确定这个矩形function drawoval(sx,sy,ex,ey,n){
//画 圆/椭圆 的方法,实际上前面四个参数确定了一个矩形,但要注意只是逻辑上的矩形,
//我们并不把它画出来,只是在它的范围内画那个椭圆,下面的注释会阐述这个矩形是什么样子的
_root.circle.plicateMovieClip("cir"+n,n);//复制出一个标准圆(半径为100的那个基础mc)
with(_root["cir"+n]){
_xscale = Math.abs(ex-sx)/2;//设置椭圆的平行于x轴的半轴长
_yscale = Math.abs(ey-sy)/2;//设置椭圆的平行于y轴的半轴长
_x = 0.5*(sx+ex);//它的中心的x坐标为矩形对角线中点的x坐标
_y = 0.5*(sy+ey);//它的中心的y坐标为矩形对角线中点的y坐标
}
}
_root.onMouseDown = function(){
f = 1;
stx = _root._xmouse;
sty = _root._ymouse;
n++;//每当鼠标按下,f值赋为1,矩形的一个顶点即为鼠标按下时的坐标,准备画第n个椭圆。
}
_root.onMouseUp = function(){
f=0;//鼠标松开,f赋为0,这样当鼠标移动时不会继续画椭圆
}
_root.onMouseMove = function(){
if (f){//当鼠标移动时,如果鼠标按下执行代码(即重绘第n个椭圆)
enx = _root._xmouse;
eny = _root._ymouse;//确定外切这个椭圆的矩形(边平行于坐标轴的矩形)
drawoval(stx,sty,enx,eny,n);//在参数确定的那个矩形内重绘第n个椭圆
}
}

参考资料:http://www.brownsky.com/study/1/5/1999.html

热心网友 时间:2022-07-01 01:31

没画圆工具啊?笨!

热心网友 时间:2022-07-01 01:32

按住shift拖动

猜你不是在问怎么用AS画
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
黄山门户网主要栏目 壹家居品牌简介 湖南乐享生活家居有限公司一站式毛坯房解决方案 服务器出租 电脑上的时间日期不同步怎么办 台式电脑时间不同步怎么解决? 关于清明节的小学作文400字 微信怎么查询自己名下的微信 如何查看微信实名认证了几个账号 轿车120时速撞击力有多大? 乐视电视如何取消开机广告 联想b590 20206 朱千华的《散文》作品 零跑汽车充电别的充电桩怎么充不进电? 机电职称能用工程师职称代替使用吗 中级机电一体化证书有什么用?? 爸爸吃饭吧唧嘴 补充句子爸爸正在什么? 变形计高泽文爸爸在吃饭,王源误入,请问那时正在播了多少时间 我的爸爸在吃东西的时候很自私,一直以来他都一样自私,他吃肉吃鱼都要放辣椒的,他不喜欢吃清淡的, 形容爸爸吃饭的样子 我爸爸中午在饭厅吃饭翻译成英语my father()his()in the dining hal 爸爸吃饭的动作描写作文 爸爸在吃饭的小练笔雕像描写100字 爸爸在吃饭时突然说家里有300亿,你会怎么办? 修改病句,爸爸正在吃完饭,我已经等他下棋呢? 属猪的金牛座女生的性格是怎样的? QQ群成员等级是怎么分??? QQ群里面的成员是按什么规则排序的? 年纪轻轻,白发越长越多,为什么会有这样的情况出现? 武汉景点有哪些好玩的地方 武汉有什么好玩的地方景点推荐 现代挖掘机225LC-7和230型的价格(全新) 现代挖掘机225——7还生产吗?陕西的售价是多少?最新型号的200系列现代挖机是什么?陕西的售价? 现代225一7挖掘机大壁多少钱 邯郸往东南走都是什么城市 抚州是邯郸的南偏东方向还是南偏西方向 南京在邯郸的地理位置 邯郸大名在哪 位于河北以南的城市都有哪里? 河北省邯郸市位于山东省的什么位方向 邯郸位于太原哪个方向 邯郸市南北大街从北至南依次是哪些 邯郸市有哪几个县 我的电脑在打开文件的时候左侧总是显示文件夹列表 文件夹的列表怎么都跑到左边了啊?怎么调啊? 为什么我家打开“我的电脑”左边总是会出现一个文件夹??? 电脑打开计算机为什么优盘里的文件显示在左边,怎样把文件设置在右边? 我的电脑里左面的文件夹一直显示,怎样才能关闭 怎样去掉电脑屏幕左边显示的文件夹任务!!