Это способ проверить, является ли путь, состоящий из одного непрерывного сегмента, самопересекающимся.
Я уверен, что если вы хотите более быструю реализацию, вы можете получить ее, если подумать и получить полный доступ к внутренним данным CGPath
. Эта идея направлена на быстрое кодирование, хотя я подозреваю, что оно все еще будет достаточно быстрым:
В принципе, возьмите две копии пути и заполните его двумя разными способами. Одна заливка использует CGContextEOFillPath
, а другая - CGContextFillPath
. Результаты будут другими, если путь самопересекающийся.
Вы можете проверить, отличается ли результат, смешав результаты вместе в режиме разностного смешивания и проверив, все ли полученные исходные данные изображения равны 0 (все черные).
Хаки, да. Но также (относительно) легко кодировать.
** Приложение ** Я только что понял, что это не будет работать в 100% случаев - например, он не обнаружит восьмерку, хотя обнаружит крендель.