0

私は数学/コーディングの問題を少し抱えています。簡単な方法でそれを機能させる方法がわかりません。問題は、15で1行を短くする必要があることです。

私のプログラムで私が持っている: http://gyazo.com/aff5ff61fb9ad3ecedde3118d9c0895e

線は両方の円の中心座標を取り、一方から他方へと描画しますが、円の円周からのものである必要があるため、t get inside the code i次を使用して m を獲得しました:

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または、Google で「ベクトル数学」を検索してください。

したがって、最初のステップは、ある円から別の円へのベクトルを取得することです (これまでに行ったこととほとんど同じです)。

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、2 つの円の間の距離 (半径を差し引いた距離) に等しい距離だけ、私たちに沿って続けることで見つけることができます。前に作成したlength値は、ある中心点から別の中心点までの 2 つの円の間の距離であるため、それを使用して距離から半径を引いた値を取得できます。

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 に答える