0

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

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

这条线取两个圆的中心坐标并从一个到另一个绘制,但我需要它来自圆的圆周,所以它赢得了t get inside the code im 使用 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 函数用于箭头线,现在我的问题是如何使它更短而不取决于它的方向,这样它就不会与圆圈重叠

4

1 回答 1

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

现在,要从一个圆到另一个圆画一条线,但从外部开始,我们只需找到起点和终点。起点很简单,circle1加的位置vector(归一化为单位长度)乘以 的半径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 )
于 2013-09-17T20:28:11.237 回答