2013-09-17 4 views
0

У меня есть небольшая проблема с математикой/кодированием. У меня нет идеи, как я могу сделать это, работая простым способом, поэтому проблема заключается в том, чтобы сделать линию короче, с 15AS3 линии рисования, делая короче после этого

в моей программе у меня есть: 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 для линий стрелок, теперь мой вопрос заключается в том, как сделать ее короче, не завися от ее направления, чтобы она не перекрывала круг

ответ

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) 
Смежные вопросы