私はしばらくの間、次のコードを正しく実行するように試みました。問題はsort(comp)の比較関数にあります。2つのdoubleを比較しますが、場合によっては、「Debug Assertion failed!Program:retrace.exe File:c:program files(x86)\ microsoft visual studio 10.0 \ vc \ include \ Algorithm Expression:Invalid 」というメッセージでプログラムがクラッシュします。演算子< "。プログラムがクラッシュすると、正常に実行された最後の行がソート前の行であるため、私は100%stlのソートからのものです。最初はdoubleの精度の問題だと思っていましたが、今は疑問です。ヘルプや情報をいただければ幸いです。
Vector startg;
bool comp(const std::pair<Vector, int>& p1, const std::pair<Vector, int>& p2)
{
return (p1.first-startg).lengthSqr() < (p2.first-startg).lengthSqr();
}
bool Blobs::intersect(const Ray& ray, IntersectionInfo& info) const
{
startg.set(ray.start.x, ray.start.y, ray.start.z);
std::vector<std::pair<Vector, int> > spheres_inters;
//not important stuff
for(int i=0;i<n;i++)
{
Vector H = ray.start - centres[i];
double A = ray.dir.lengthSqr();
double B = 2 * dot(H, ray.dir);
double C = H.lengthSqr() - bounding_radius*bounding_radius;
double D = B*B - 4*A*C;
if(D<=0)
continue;
double x1 = (-B + sqrt(D)) / (2*A);
double x2 = (-B - sqrt(D)) / (2*A);
Vector v1 = ray.start + x1*ray.dir;
Vector v2 = ray.start + x2*ray.dir;
spheres_inters.push_back(std::make_pair(v1, i));
spheres_inters.push_back(std::make_pair(v2, i));
}
if(spheres_inters.size()==0)
return false;
///////////////////////////////////////////////////////////////
std::sort(spheres_inters.begin(), spheres_inters.end(), comp);//THE PROBLEM IS HERE!
/* the rest of the method.....*/