问题描述
我正在尝试进行群体模拟,为此我需要移动和旋转的三角形。
struct Triangle
{
olc::vf2d p1 = { 0.0f,0.0f };
olc::vf2d p2 = { -5.0f,10.0f };
olc::vf2d p3 = { 5.0f,10.0f };
};
struct Boid
{
Boid()
{
}
Boid(olc::vf2d _position,float _angle) : position(_position),angle(_angle)
{
};
olc::vf2d position = { 0.0f,0.0f };
float angle = 0.0f;
};
然后我通过实例化上述两个结构体制作了一个 boid 和一个三角形。
Boid boid = Boid(olc::vf2d(300,150),0.0f)
Triangle triangle;
现在这里有一点不起作用。
//Everything here is in a while loop
boid.angle += 0.005f;
//rotation and offset
float x1 = triangle.p1.x * cosf(boid.angle) + boid.position.x;
float y1 = triangle.p1.y * sinf(boid.angle) + boid.position.y;
float x2 = triangle.p2.x * cosf(boid.angle) + boid.position.x;
float y2 = triangle.p2.y * sinf(boid.angle) + boid.position.y;
float x3 = triangle.p3.x * cosf(boid.angle) + boid.position.x;
float y3 = triangle.p3.y * sinf(boid.angle) + boid.position.y;
FillTriangle(
(int)x1,(int)y1,(int)x2,(int)y2,(int)x3,(int)y3,olc::BLUE
)
这里我试图做的是以相同的角度偏移和旋转每个点。我希望通过这样做,三个点仍将保持三角形结构(因为它们的移动和旋转完全相同)但它没有,而且旋转非常奇怪。如何正确移动和旋转三角形?如果有人解释为什么我正在做的事情不起作用,那也很好。我是这方面的新手。
解决方法
这对我来说似乎不是一个适当的轮换。快速搜索 2D 旋转矩阵会产生更像这样的结果:
x' = cos(theta) * x - sin(theta) * y
y' = sin(theta) * x + cos(theta) * y
即
float x1 = triangle.p1.x * cosf(boid.angle) - triangle.p1.y * sinf(boid.angle) + boid.position.x;
float y1 = triangle.p1.x * sinf(boid.angle) + triangle.p1.y * cosf(boid.angle) + boid.position.y;
请记住,这种旋转当然会围绕原点旋转每个点。你的三角形不以原点为中心;相反,三角形的三个点之一正好位于原点,因此您的三角形将简单地围绕该点旋转。这可以通过将三角形以原点为中心来解决。