flash as3.0 怎么在两个随机点之间画弧线,想做一个随机出现角的课件,就是角的标记那个圆弧不会
1个回答
展开全部
这个问题由我来回答吧:
import flash.geom.Point;
import flash.display.Sprite;
//创建一个绘制函数,声明一下,正式应用的时候,最好写成一个应用类,这样用起来方便,在此不写了,只写成一个函数。
//说说这几个参数吧,point1和point2是任意的两个点,dis是决定弧度大小的距离,距离越大,弧也越大,这个bol嘛,因为弧线有两个,这个决定是内弧还是外弧,用一个布尔值。
function drawArc(point1:Point,point2:Point,dis:Number=5,bol:Boolean=true):Point
{
//这是一个比较复杂的几何问题,下面我们来解决一下,先声明四个点,p,p1,p2,p0,分别代表绘制曲线点,任意的两个点及p1,p2的中心点p0。
var p:Point,p1,p2,p0;
//声明变量用以存储计算结果,分别是p1,p2的x坐标的差和y坐标的差及p,p0的x坐标差,y坐标差
var dx:Number,dy;
//让我们来赋值一下,运用一下最基本的坐标计算
dx = point2.x - point1.x;
dy = point2.y - point1.y;
//以下结果是通过线性方程计算而来。初中学过的哟。
p0=new Point();
p0.x =(point2.x+point1.x) * 0.5,p0.y = (point2.y+point1.y) * 0.5;
//这个p点,就是我们要计算的结果,有了这个点,就能绘制这个弧线了。
p=new Point();
//我们来定义两个变量,分别代表p的x方向的坐标及y方向的坐标
var px:Number,py;
//根据勾股定理(px-p0.x)*(px-p0.x)+(py-p0.y)*(py-p0.y)=dis*dis
var k:Number = dx / dy,bb = p0.x * k + p0.y;
var a:Number = 1 + k * k;
var b:Number = -2*(p0.x+k*bb-k*p0.y);
var c:Number = p0.x * p0.x + p0.y * p0.y + bb * bb - 2 * bb * p0.y - dis * dis;
//上面的a,b,c是二次方程中的a,b,c常数项,就是我们常说的ax^2+bx+c=0;
if (bol)
{
px=(-b+Math.sqrt(b*b-4*a*c))/(2*a);
py = - k * px + bb;
}
else
{
px=(-b-Math.sqrt(b*b-4*a*c))/(2*a);
py = - k * px + bb;
}
p.x = px,p.y = py;
return p;
}
//我们先来绘制一条直线,先确定两个点
var p1:Point = new Point(150,150),p2 = new Point(100,70);
//改变这里的第四个参数,弧线方向会改变的。不信你试试,分别用true及false试试?
var p:Point = drawArc(p1,p2,25,true);
var s:Sprite=new Sprite();
with (s.graphics)
{
lineStyle(3,0xFF0000)
moveTo(p1.x,p1.y);
curveTo(p.x,p.y,p2.x,p2.y)
lineStyle(1,0x0000FF)
moveTo(p1.x,p1.y)
lineTo(p2.x,p2.y)
}
addChild(s)
这里绘制的是这两个点的垂直平分线上的弧线那个dis参数是弧线的距离。一般来说任意两点垂直平分线应该有两条弧线,所以我分别用一个参数来解决。你可以多换几个点来试试,还是很好用的。最后希望你能看明白 。
import flash.geom.Point;
import flash.display.Sprite;
//创建一个绘制函数,声明一下,正式应用的时候,最好写成一个应用类,这样用起来方便,在此不写了,只写成一个函数。
//说说这几个参数吧,point1和point2是任意的两个点,dis是决定弧度大小的距离,距离越大,弧也越大,这个bol嘛,因为弧线有两个,这个决定是内弧还是外弧,用一个布尔值。
function drawArc(point1:Point,point2:Point,dis:Number=5,bol:Boolean=true):Point
{
//这是一个比较复杂的几何问题,下面我们来解决一下,先声明四个点,p,p1,p2,p0,分别代表绘制曲线点,任意的两个点及p1,p2的中心点p0。
var p:Point,p1,p2,p0;
//声明变量用以存储计算结果,分别是p1,p2的x坐标的差和y坐标的差及p,p0的x坐标差,y坐标差
var dx:Number,dy;
//让我们来赋值一下,运用一下最基本的坐标计算
dx = point2.x - point1.x;
dy = point2.y - point1.y;
//以下结果是通过线性方程计算而来。初中学过的哟。
p0=new Point();
p0.x =(point2.x+point1.x) * 0.5,p0.y = (point2.y+point1.y) * 0.5;
//这个p点,就是我们要计算的结果,有了这个点,就能绘制这个弧线了。
p=new Point();
//我们来定义两个变量,分别代表p的x方向的坐标及y方向的坐标
var px:Number,py;
//根据勾股定理(px-p0.x)*(px-p0.x)+(py-p0.y)*(py-p0.y)=dis*dis
var k:Number = dx / dy,bb = p0.x * k + p0.y;
var a:Number = 1 + k * k;
var b:Number = -2*(p0.x+k*bb-k*p0.y);
var c:Number = p0.x * p0.x + p0.y * p0.y + bb * bb - 2 * bb * p0.y - dis * dis;
//上面的a,b,c是二次方程中的a,b,c常数项,就是我们常说的ax^2+bx+c=0;
if (bol)
{
px=(-b+Math.sqrt(b*b-4*a*c))/(2*a);
py = - k * px + bb;
}
else
{
px=(-b-Math.sqrt(b*b-4*a*c))/(2*a);
py = - k * px + bb;
}
p.x = px,p.y = py;
return p;
}
//我们先来绘制一条直线,先确定两个点
var p1:Point = new Point(150,150),p2 = new Point(100,70);
//改变这里的第四个参数,弧线方向会改变的。不信你试试,分别用true及false试试?
var p:Point = drawArc(p1,p2,25,true);
var s:Sprite=new Sprite();
with (s.graphics)
{
lineStyle(3,0xFF0000)
moveTo(p1.x,p1.y);
curveTo(p.x,p.y,p2.x,p2.y)
lineStyle(1,0x0000FF)
moveTo(p1.x,p1.y)
lineTo(p2.x,p2.y)
}
addChild(s)
这里绘制的是这两个点的垂直平分线上的弧线那个dis参数是弧线的距离。一般来说任意两点垂直平分线应该有两条弧线,所以我分别用一个参数来解决。你可以多换几个点来试试,还是很好用的。最后希望你能看明白 。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询