我正在使用以下代码计算从A点(右上角)到B点(左下角)的增量.但随着我们越来越接近B点,我的增量越来越远离预期的路径.图中的绿线是白点的预期路径.
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);
}
Run Code Online (Sandbox Code Playgroud)
基本上,我没有想法.唯一似乎让白点完全跟随绿线的是调整目标的位置,如下所示:
distanceTwoPoints(x, _target.x + 2, y, _target.y + 1);
//...
xInc = (_target.x + 2 - x) / _stepT;
yInc = (_target.y + 1 - y) / _stepT;
Run Code Online (Sandbox Code Playgroud)
然而,这会抛出模拟的其他部分,其中点之间没有角度,例如进入A点(右上角).这让我觉得两点之间的距离需要计算得比实际更短.有任何想法吗?
Flash具有很好的功能,非常方便.Point.interpolate(pointA, pointB, number)
它返回A点和B点之间的点.第三个输入(Number)是得到的点应该是多少接近pointA或pointB,从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
而不是它们之间.