-1

三角形を物理エンジンに正常に追加するために、三角形の3つのポイントを並べ替えようとしています。x軸上で0.0よりも小さい位置にあるすべての三角形が正しく表示されます。ただし、その後、最初の要素(v[0])は常に{ 0.0, 0.0}に設定され、残りは問題ないように見えます。これが、並べ替えと追加を行う私の主な機能です。

void Core::addPoly(float x1, float y1, 
                   float x2, float y2, 
                   float x3, float y3) {

    std::vector<PVector> v(3);
    v.push_back(PVector(x1, y1));
    v.push_back(PVector(x2, y2));
    v.push_back(PVector(x3, y3));

    PVector center((x1+x2+x3)/3, (y1+y2+y3)/3);

    std::sort(v.begin(), v.end(), [center](PVector b, PVector a) { 
        if (a.x >= 0 && b.x < 0)
            return true;
        if (a.x == 0 && b.x == 0)
            return a.y > b.y;

        // compute the cross product of vectors (center -> a) x (center -> b)
        float det = (a.x-center.x) * (b.y-center.y) - (b.x - center.x) * (a.y - center.y);
        if (det < 0)
            return true;
        if (det > 0)
            return false;

        // points a and b are on the same line from the center
        // check which point is closer to the center
        float d1 = (a.x-center.x) * (a.x-center.x) + (a.y-center.y) * (a.y-center.y);
        float d2 = (b.x-center.x) * (b.x-center.x) + (b.y-center.y) * (b.y-center.y);
        return d1 > d2;
    });

    emap->polys.push_back(Polygon(v[0], v[1], v[2]));
}

ここで提供されている並べ替え機能を使用しています。元々、すべての三角形の最初の要素が中心を向いていました(ただし、これが正しい動作であるとは思いません)-ラムダ宣言でaとbを切り替えたところ、x軸の0.0の後にしか表示されなくなりました。

3つの三角形が渡された場合(平面上で|が0.0になり、___が0.0になると想像してください)

^     |
    ^ |   ^
______|_____________

3番目の三角形の0番目の頂点は、実際には次のようになります。

^     |
    ^ |  ___/|
______|_/______________

(これは三角形であるはずです)

ただし、0.0がaddPolyに渡されることはありませんでした。

4

1 に答える 1

1

この行:

std::vector<PVector> v(3);

ベクトルを3つの<0.0,0.0>値で初期化します。に変更する

std::vector<PVector> v;

問題を修正する必要があります。

コードは次のように機能するようです。

struct PVector 
{ 
    float x; 
    float y; 
    PVector(float x, float y) : x(x),y(y){}
    PVector() : x(0.0f), y(0.0f) {}
};


static void addPoly(float x1, float y1, 
                   float x2, float y2, 
                   float x3, float y3) {

    std::vector<PVector> v;
    v.push_back(PVector(x1, y1));
    v.push_back(PVector(x2, y2));
    v.push_back(PVector(x3, y3));

    PVector center((x1+x2+x3)/3, (y1+y2+y3)/3);

    std::sort(v.begin(), v.end(), [center](PVector b, PVector a) -> bool { 
        if (a.x >= 0 && b.x < 0)
            return true;
        if (a.x == 0 && b.x == 0)
            return a.y > b.y;

        // compute the cross product of vectors (center -> a) x (center -> b)
        float det = (a.x-center.x) * (b.y-center.y) - (b.x - center.x) * (a.y - center.y);
        if (det < 0)
            return true;
        if (det > 0)
            return false;

        // points a and b are on the same line from the center
        // check which point is closer to the center
        float d1 = (a.x-center.x) * (a.x-center.x) + (a.y-center.y) * (a.y-center.y);
        float d2 = (b.x-center.x) * (b.x-center.x) + (b.y-center.y) * (b.y-center.y);
        return d1 > d2;
    });

    //emap->polys.push_back(Polygon(v[0], v[1], v[2]));
}
于 2013-01-19T04:51:50.653 に答える