Проверьте, пересекается ли нарисованный путь / CGPath в игре для iPhone - PullRequest
4 голосов
/ 22 августа 2009

У меня есть путь, нарисованный в OpenGL ES. Я могу преобразовать его в CGPath, если это необходимо.

Как мне проверить, пересекается ли она сама (если пользователь создал полный цикл)?

Ответы [ 3 ]

2 голосов
/ 22 августа 2009

У Грэма Кокса есть очень интересные мысли о том, как обнаружить пересечение CGPathRef и CGRect, что похоже на вашу проблему и может быть образовательным. Основная проблема сложна, и большинство практических решений будут приближенными.

Возможно, вы также захотите взглянуть на эту статью SO по адресу CGPathRef пересечение , которая также похожа на вашу проблему, и некоторые из предложенных решений находятся в том же пространстве, что и Грэм выше.

0 голосов
/ 22 августа 2009

Это способ проверить, является ли путь, состоящий из одного непрерывного сегмента, самопересекающимся.

Я уверен, что если вы хотите более быструю реализацию, вы можете получить ее, если подумать и получить полный доступ к внутренним данным CGPath. Эта идея направлена ​​на быстрое кодирование, хотя я подозреваю, что оно все еще будет достаточно быстрым:

В принципе, возьмите две копии пути и заполните его двумя разными способами. Одна заливка использует CGContextEOFillPath, а другая - CGContextFillPath. Результаты будут другими, если путь самопересекающийся.

Вы можете проверить, отличается ли результат, смешав результаты вместе в режиме разностного смешивания и проверив, все ли полученные исходные данные изображения равны 0 (все черные).

Хаки, да. Но также (относительно) легко кодировать.

** Приложение ** Я только что понял, что это не будет работать в 100% случаев - например, он не обнаружит восьмерку, хотя обнаружит крендель.

0 голосов
/ 22 августа 2009

Примечание : Этот ответ относится к более ранней версии вопроса, в которой я думал, что проблема заключается в том, чтобы определить, был ли путь закрыт или нет.

Я думаю, что путь считается закрытым, если текущая точка == начальная точка.

Самый простой способ проверить это - самостоятельно отследить эти два момента и проверить на равенство. Вы также можете использовать CGPathGetCurrentPoint и отслеживать только начальную точку для сравнения с этим.

Вот окольный способ найти отправную точку, если трудно просто отследить ее напрямую:

  • сделать копию пути
  • сохранить свою текущую точку
  • звоните CGPathCloseSubpath
  • проверьте, не изменилась ли текущая точка

Если оно изменилось, исходный путь был открыт; в противном случае закрыто.

...