我已经实现了 Graham 扫描,但我发现我的程序的瓶颈是排序(80% 的时间)。我想改进它,现在我正在做以下事情:
std::sort(intersections.begin() + 1, intersections.end(), [&minElement](Point const& a, Point const& b)
{return angle (minElement - a, XAxis) < angle (minElement - b,XAxis);});
这给了我确切的角度,但它并不便宜,因为我的角度函数如下所示:
float angle (const Point& v1, const Point& v2) {
return dot (v1, v2) / (v1.Length () * v2.Length ());
}
在 Length 函数中,我必须做一个平方根,这是最昂贵的操作之一。但这样我得到了一个很好的订购。
我尝试按 Slope、dot、ccw 对数组进行排序,甚至只从比较中删除 sqrt,但这些都没有为我提供相同的排序。你能给我什么建议吗?