我有3个粒子,其中一个是中心粒子。我想相对于中心粒子旋转其他两个粒子(存储在粒子列表中),公式为q'=Θq+ p其中q'是旋转粒子的新位置,Θ是方位角,p是位置中心粒子。其他两个粒子的初始位置存储在initialParticlePosition列表中。问题是我认为我计算的角度是错误的,因为范围。我应该把范围作为[-pi,pi)或类似的东西。在某些部分,它计算正确,但有时它是错误的。有人可以帮我这个代码或给我另一种旋转方法。
{
angle = Math.Acos(Vector2.Dot(heading,new Vector2(0,-1) ));
for (int i = 0; i < 2; i++)
{
tempX = (double)initialParticlePositions[i].X * Math.Cos(angle) - (double)initialParticlePositions[i].Y * Math.Sin(angle) + centerParticle.position.x;
tempY = (double)initialParticlePositions[i].X * Math.Sin(angle) + (double)initialParticlePositions[i].Y * Math.Cos(angle) + centerParticle.position.y;
particles[i].position.x = tempX;
particles[i].position.y = tempY;
}
}
答案 0 :(得分:2)
一些可能有用的方法(角度总是以度数,而不是rad):
public static double GetAngle(Vector v)
{
return Math.Atan2(v.X, -v.Y) * 180.0 / Math.PI;
}
public static Vector SetAngle(Vector v, double angle)
{
var angleInRads = angle * (Math.PI / 180.0);
var distance = v.Length;
v.X = (Math.Sin(angleInRads) * distance);
v.Y = -(Math.Cos(angleInRads) * distance);
return v;
}
static public Point RotatePointAroundCenter(Point point, Point center, double rotationChange)
{
Vector centerToPoint = point - center;
double angle = GetAngle(centerToPoint);
Vector centerToNewPoint = SetAngle(centerToPoint, angle + rotationChange);
return center + centerToNewPoint;
}
(您应该开始标记答案作为答案,点击左侧投票下面的复选标记,例如您可以接受this answer)
编辑:稍微优化了方法。
答案 1 :(得分:1)
可以使用单行代码设置绕轨道运行的粒子位置:
假设p1,p2和&amp; p3是Vector2s和p2&amp; p3正在轨道运行p1。
p2 = Vector2.Transform(p2 - p1, Matrix.CreateRotationZ(rotationChangeP2)) + p1;
p3 = Vector2.Transform(p3 - p1, Matrix.CreateRotationZ(rotationChangeP3)) + p1;
Matrix.Create ...()方法将为您调用两个trig函数。
修改。矩阵&amp; Vector2结构&amp;方法是XNA特定的,但包括在这里,因为这是OP标记他的Q.
答案 2 :(得分:0)
angle = Math.Acos(Vector2.Dot(heading,new Vector2(0,-1)));
正如您所怀疑的那样,您的点积和Acos的组合只能为您提供180度的角度 学位范围。
相反,在单位矢量上使用Atan2可以获得从-pi到pi的全范围角度。
angle = (float)Math.Atan2((double)heading.Y, (double)heading.X);
如果你的Y轴向下是正的,你可能需要否定Y项。