Для работы с невыпуклыми полигонами мне помогало пронумеровать рёбра, и добавить номер ребра к параметру u в формуле для ребра p1 + u * (p2 - p1), т.е. задать в параметрическом виде весь полигон, а не одно ребро. Тогда u от 0 до 1 -- пересечение на первом ребре, от 1 до 2 -- на втором ребре и т.д., и можно собирать все точки (и исходные вершины, и пересечения) в один список (точнее, два списка -- для первого полигона и для второго), сортировать по u и, собирать в правильном порядке. Причём, при разном "правильном порядке" получался и OR, и AND, а если постараться -- то и A-B и B-A. Но вот на ошибках вычисления с плавающей точкой я заломался, там даже f64 не хватало.
Для работы с невыпуклыми полигонами мне помогало пронумеровать рёбра, и добавить номер ребра к параметру u в формуле для ребра p1 + u * (p2 - p1), т.е. задать в параметрическом виде весь полигон, а не одно ребро. Тогда u от 0 до 1 -- пересечение на первом ребре, от 1 до 2 -- на втором ребре и т.д., и можно собирать все точки (и исходные вершины, и пересечения) в один список (точнее, два списка -- для первого полигона и для второго), сортировать по u и, собирать в правильном порядке. Причём, при разном "правильном порядке" получался и OR, и AND, а если постараться -- то и A-B и B-A.
Но вот на ошибках вычисления с плавающей точкой я заломался, там даже f64 не хватало.