你好我正在做一个小动画,它将一个物体从a点移动到b点或角度/弧度。
我现在拥有的是这个
Point CalcMove(Point pt, double angle, int speed)
{
Point ret = pt;
ret.X = (int)(ret.X + speed * Math.Sin(DegToRad(angle)));
ret.Y = (int)(ret.Y + speed * Math.Cos(DegToRad(angle)));
return ret;
}
但它看起来不像我的预期。
请帮帮忙?
更新:
哦,我正在使用 NETCF
CalcMove(Point pt,double angle,int speed)
“Point pt”是当前对象的位置。 “角度”是物体应该去的地方。 “速度”是迈出的一步。
答案 0 :(得分:1)
使用旋转矩阵。此代码将从点(x,y)移动θ弧度到新点(px,px)
Point Rotate(x, y, theta)
int px = (x * Math.Cos(theta)) - (y * Math.Sin(theta));
int py = (y * Math.Cos(theta)) + (x * Math.Sin(theta));
return new Point(px, py);
end
上面使用的矩阵,
[cosθ - sinθ][x]
[cosθ + sinθ][y]
使用图形坐标时,将顺时针绕圆圈移动一个点。
我上周完成了同样的事情。您可以通过查找要移动的总theta然后将其除以帧数(或步数)来对此进行动画处理。现在,在某个任意点开始每次移动(例如,(0,半径))并递增一些计数器totalSteps并移动始终从该初始点开始。如果你只是每帧移动一个点,你将累积一些错误,但如果你总是从初始点移动当前的增量,当增量= = totalTheta时停止,它将是完美的。如果这是有道理的,请告诉我。
也许我应该多说一点。假设你有一个方法“BeginMove”:
double totalTheta = 0;
double increment = 0;
double currentTheta = 0;
bool moving = false;
void BeginMove()
{
totalTheta = (2 * Math.PI) / numObjects;
increment = totalTheta / steps;
currentTheta = 0;
moving = true;
}
现在你有一个方法可以每帧更新一次移动:
void Update
{
if (!moving) return;
// do a min/max to ensure that you never pass totalTheta when incrementing.
// there will be more error handling, but this is the basic idea.
currentTheta += increment;
SomeObject.Location = Rotate(0, radius, currentTheta);
moving = (currentTheta < totalTheta);
}
根据你的具体情况,这里显然会有更多的逻辑,但这个想法是:
答案 1 :(得分:0)
要计算我们需要的新坐标:
sin(α+β)=cosβsinα+sinβcosα
cos(α+β)=cosαcosβ - sinαsinβ
cosα= x / d sinα= y / d
新的coords将是: x = sin(α+β)* d y = cos(α+β)* d
所有在一起:
double d = Math.Sqrt(x*x + y*y);
double sina = pt.Y / d;
double cosa = pt.X / d;
double sinb = Math.Sin(DegToRad(angle));
double cosb = Math.Cos(DegToRad(angle));
ret.X = (int)(cosb*sina + sinb*cosa);
ret.Y = (int)(cosa*cosb - sina*sinb);
答案 2 :(得分:0)
在这些建议代码的每次测试失败后(对我来说都很羞耻)。我刚刚提出了一个非常古老的解决方案。
每个xypixel画一个圆圈,这是我在回到TurboBasic(dos)之前做的一种方式
x = xcenter + radius * Cos(radian)<br/>
y = ycenter + radius * Sin(radian)
我通过将xy center作为对象位置来应用相同的想法,radius只是一个增量(每步)的值,而弧度是从最后一个xy对象位置和目标xy计算的
现在我的对象从A点移动到B点