将位图从(x,y)移动到(x2,y2)如何计算开始和目标之间的x,y值

时间:2014-07-24 19:21:16

标签: java android

有没有办法使用角度将位图从point1移动到第2点?

x += speed * Math.sin(getAngle(pointDestination));
y += speed * Math.cos(getAngle(pointDestination));

编辑:

public double getAngle(Point target) {
    double angle =  (Math.atan2(target.y - y, target.x - x));
    double angledeg = angle*0.0174532925;

    return angledeg;
}

getAngle()应该在每次迭代时执行还是在开始时执行一次? 不幸的是,精灵向错误的方向移动。

2 个答案:

答案 0 :(得分:0)

您最好定义一个计算位置(x,y)随时间变化的(数学)函数,而不是对位图位置进行增量更新。优点是,这将导致非常精确和可预测的移动,与CPU速度/每秒帧数无关。

假设位图应在(x1, y1)毫秒内以(x2, y2)time的恒定速度移动,因此您的(时间相关的)位置函数如下:

x(t) := x1 + (x2 - x1) * t / time // t in range [0, time]
y(t) := y1 + (y2 - y1) * t / time // t in range [0, time]

(注意:通过做一些物理/数学,你可以定义更复杂的函数,导致更复杂的运动)。

然后可以在动画线程中使用这两个函数来更新位图的位置:

bitmap.setX(x(currentTime - animationStartTime));
bitmap.setY(y(currentTime - animationStartTime));

看看Trident animation library。它支持多个UI框架,似乎正是您正在寻找的东西!


更新:如果您确实想要进行增量更新,例如根据你当前的帧速率,你根本不需要三角函数(sin,cos,tan,...),只需要矢量:

// x, y is the current position of the bitmap
// calculate vector (dx, dy) to target:
double dx = x2 - x;
double dy = y2 - y;

// calculate length of this vector:
double l = Math.hypot(dx, dy); // calculates sqrt(dx² + dy²)

// calculate unit vector of (dx, dy):
double vx = dx / l;
double vy = dy / l;

// update bitmap position:
// distance is the number of pixels to travel in this iteration (frame)
x += distance * vx;
y += distance * vy;

请注意,所有值都应为double类型。否则,如果int用于xy且增量低于1(例如由于移动缓慢,即distance非常低),则位图获胜由于四舍五入错误,根本不会移动!

另请注意,在此方法中,您必须测量帧速率以相应地调整distance以补偿偏差。公式可能是这样的:

double distance = (time elapsed since last frame in sec) * (distance to travel per sec)

答案 1 :(得分:0)

你的问题是你增加了x值,当你去增加y时你也使用刚增加的新x来计算角度。 将其更改为:

float angle=getAngle(pointDestination);
x += speed * Math.cos(angle);
y += speed * Math.sin(angle);

public double getAngle(Point target) {
    return Math.atan2(target.y - y, target.x - x);
}