三角形を物理エンジンに正常に追加するために、三角形の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に渡されることはありませんでした。