Я уже реализовал сканирование Грэма, но вижу, что узким местом моей программы является сортировка (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 ());
}
В функции длины я должен извлечь квадратный корень, что является одной из самых затратных операций. Но таким образом я получаю хороший заказ.
Я попытался упорядочить массив по наклону, точке, против часовой стрелки и даже удалить только sqrt из моего сравнения, но ни один из них не дает мне такой же порядок. Можете ли вы дать мне какой-нибудь совет?