0

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;
};

次に、上記の 2 つの構造体をインスタンス化して、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
                )

ここで私がやろうとしているのは、各ポイントを同じ角度だけオフセットして回転させることです。私はこれを行うことで、3 つの点が三角形構造を維持することを望んでいました (移動と回転がまったく同じであるため) が、そうではなく、本当に奇妙に回転します。三角形を適切に移動および回転するにはどうすればよいですか? また、誰かが私がやっていることの理由を説明してくれたらうれしいです。私はこのようなことに慣れていません。

4

1 に答える 1

1

それは私には適切なローテーションのようには見えません。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;

もちろん、この回転は原点を中心に各ポイントを回転させることに注意してください。あなたの三角形は原点に集中していません。むしろ、三角形の 3 つのポイントの 1 つが正確​​に原点にあるため、三角形はそのポイントを中心に回転します。これは、三角形を原点の中心に置くことで修正できます。

于 2021-05-01T19:15:18.153 に答える