尝试通过对所有三个点应用相同的变换来制作一个可以旋转和移动的三角形

Trying to make a triangle that can rotate and move by applying the same transformations to all three points

我正在尝试制作 boids 模拟,为此我需要移动和旋转的三角形。

我制作了一个 Triangle 和一个 Boid 结构。

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和一个triangle

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;

请记住,这种旋转当然会围绕原点旋转每个点。您的三角形不以原点为中心;相反,三角形的三个点之一恰好位于原点,因此您的三角形将简单地围绕该点旋转。这可以通过将三角形置于原点的中心来解决。