AS3画线,之后缩短

时间:2013-09-17 17:55:39

标签: actionscript-3 actionscript

我有一点数学/编码问题女巫我不知道我怎么能以简单的方式工作,所以问题是需要缩短一行,用15

在我的程序中我有:  http://gyazo.com/aff5ff61fb9ad3ecedde3118d9c0895e

该线取两个圆的中心坐标并从一个圆绘制到另一个,但我需要它来自圆的圆周,所以它赢得t get inside the code i m使用is:

var  line:Shape = new Shape();
    line.graphics.lineStyle(3,0xFF0000,2);
    line.graphics.moveTo(sx,sy);
    line.graphics.lineTo(fx,fy);
    this.addChild(line);
    arrow2(sx,sy,fx,fy);

    var rline:Shape = new Shape();
    rline.graphics.lineStyle(3,0xFF0000,2);
    rline.graphics.moveTo(fx,fy);
    rline.graphics.lineTo(xa,ya);
    this.addChild(rline);

    var rline2:Shape = new Shape();
    rline2.graphics.lineStyle(3,0xFF0000,2);
    rline2.graphics.moveTo(fx,fy);
    rline2.graphics.lineTo(xb,yb);
    this.addChild(rline2);

rline和rline2函数用于箭头线,现在我的问题是我如何缩短它而不依赖于它的方向因此它不会与圆重叠

1 个答案:

答案 0 :(得分:1)

您可以使用向量来解决您的问题;他们很容易掌握,对游戏开发或你想要做的事情来说几乎是不可或缺的。您可以在此处获得概述:http://www.mathsisfun.com/algebra/vectors.html或通过搜索"矢量数学"在谷歌

所以第一步是从一个圆圈到另一个圆圈(几乎就是你所做的):

var vector:Point = new Point( circle2.x - circle1.x, circle2.y - circle1.y );
var length:Number = vector.length; // store the length of the vector for later

这相当于说"如果您从circle1开始并沿着vector移动,那么您将到达circle2"

接下来我们要做的就是将其正常化;所有这一切都将长度设置为1 - 方向不变 - 这样可以更轻松地处理您正在寻找的事情。长度为1.0的向量称为单位向量

vector.normalize( 1.0 ); // you can pass any length you like, but for this example, we'll stick with 1.0

现在,要从一个圆圈到另一个圆圈画一条线,但从外面开始,我们只需找到起点和终点。起点很简单circle1vector的位置(标准化为单位长度)乘以circle1的半径:

var sx:Number = circle1.x + vector.x * circle1.radius; // or circle1.width * 0.5 if you don't store the radius
var sy:Number = circle1.y + vector.y * circle1.radius;

结束点可以从我们的起点开始,沿着vector继续,距离等于两个圆之间的距离(减去它们的半径)。我们之前创建的length值是两个圆圈之间的距离,从一个中心点到另一个中心点,因此我们可以使用它来获得距离减去半径:

var dist:Number = length - ( circle1.radius + circle2.radius ); // or circle1.width * 0.5 etc

所以结束点:

var ex:Number = sx + vector.x * dist;
var ey:Number = sy + vector.y * dist;

并在它们之间画线:

var line:Shape = new Shape;
line.graphics.lineStyle( 1.0, 0x000000 );
line.graphics.moveTo( sx, sy );
line.graphics.lineTo( ex, ey );
this.addChild( line )