2012-04-25 8 views
1

Я вычисляю приращения от точки A (вверху справа) до точки B (внизу слева) со следующим кодом. Но по мере приближения к точке B мои приращения все больше и больше выходят из ожидаемого пути. Зеленая линия на изображении - это ожидаемый путь к белой точке.Приращение точек вдоль линии

discrepancy

public function get target():Point { return _target; } 
    public function set target(p:Point):void 
    { 
     _target = p; 
     var dist:Number = distanceTwoPoints(x, _target.x, y, _target.y); //find the linear distance 
     //double the steps to get more accurate calculations. 2 steps are calculated each frame 
     var _stepT:Number = 2 * (dist * _speed); //_speed is in frames/pixel (something like 0.2) 

     if (_stepT < 1) //Make sure there's at least 1 step 
      _stepT = 1; 
     _stepTotal = int(_stepT); //ultimately, we cannot have half a step 
     xInc = (_target.x - x)/_stepT; //calculate the xIncrement based on the number of steps (distance/time) 
     yInc = (_target.y - y)/_stepT; 
    } 

    private function distanceTwoPoints(x1:Number, x2:Number, y1:Number, y2:Number):Number 
    { 
     var dx:Number = x1-x2; 
     var dy:Number = y1-y2; 
     return Math.sqrt(dx * dx + dy * dy); 
    } 

В принципе, я из идей. Единственное, что, кажется, чтобы получить белую точку, чтобы следовать зеленым точно отрегулировать положение цели следующим образом:

distanceTwoPoints(x, _target.x + 2, y, _target.y + 1); 
//... 
xInc = (_target.x + 2 - x)/_stepT; 
yInc = (_target.y + 1 - y)/_stepT; 

Однако, это сбросит другие части моделирования, где нет угла между точками, как попадание в точку A (вверху справа). Это заставляет меня думать, что расстояние между двумя точками должно быть рассчитано как короче, чем оно есть на самом деле. Есть идеи?

ответ

9

Flash имеет отличную функцию, которая действительно удобна для этого. Point.interpolate(pointA, pointB, number) Он возвращает точку между точками A и B. Третий вход (число) - это то, как близко к точке A или точке B результирующая точка должна быть от 0 до 1. Вам нужно будет вычислить ее значение.

Что такое интерполяция, это в основном средневзвешенное значение двух входных точек, причем число является весом по отношению к одной точке. Если число равно 0,5, вы получите точку на полпути между двумя входными точками. 1 возвращает PointA, 0 возвращает PointB.

flash.geom.Point.interpolate() для деталей.

Для других языков или математики в целом вы можете сделать это таким образом, нет необходимости в Trig: point1, происхождение и point2 конечная точка. point3 - точка между point1 и point2. loc - отношение от point1 до point2, как далеко вниз по линии. loc = .25 будет в четверть пути от point1 по направлению к point2. point3.x = point1.x * (1 - loc) + point2.x * loc и point3.y = point1.y * (1 - loc) + point2.y * loc. Это будет работать даже для значений за пределами 0-1, например, на линии, соединяющей point1 и point2, но не между ними.

+0

Это работает! Большое спасибо! Вы смягчили мою головную боль :) – chris

Смежные вопросы