Если вы про эту строку: _k = (_k + tan(angle))/(1 - _k*tan(angle));
То тут деления на ноль нет, иначе бы программа не смогла посчитать _k, а она и ее считает правильно (_k = 2). Проблема возникает в следующей строке. _b *= _k/temp;
хотя temp равен двум в данном примере и если его заменить просто двойкой, то программа уже не ругается.
В программе используется именно list. Про сортировку не совсем понял. У нас же не числа, а абстрактные объекты. Допустим, полигоны. Как их сортировать и зачем?
В комментарии, судя по всему, подразумевается обрезающий(clipping) полигон (в данном примере, прямоугольник). Он действительно должен быть выпуклым, тогда как предметный(subject) полигон, согласно алгоритму Ходжмана-Сазерленда, по которому работает программа, предполагает в т. ч. и невыпуклые многоугольники. https://en.wikipedia.org/wiki/Sutherland%E2%80%93H...
Конкретно, в приведенном примере (и в других, которые я проверял), программа выдает верный набор точек и правильном порядке. Вопрос, как их разделить в случае несвязного множества.
P. S. Конечно, это не единственный алгоритм поиска пересечения пересечения двух полигонов. Есть и другие. Например, Уайлера — Атертона или Ватти.
Rsa97, ой, да, len, что-то меня переклинило) Ну, насколько я понял, эта функция добавляет только одну вершину в полигон, на что указывает, например, p->len++.
Спасибо. Если я правильно понял, то alloc - это объем памяти для заданного полигона, а size - количество его вершин. Нельзя ли было ограничиться одной size для выделения памяти?