2009-08-22 4 views

답변

0

참고 :이 질문에 대한 답변은 이전 버전의 질문과 같습니다. 문제는 경로가 닫혔는지 여부를 결정하는 것이 었습니다.

현재 시점 == 시작점 인 경우 경로가 닫힌 것으로 간주됩니다.

내가 이것을 확인하는 가장 쉬운 방법은이 두 점을 스스로 추적하고 평등을 확인하는 것입니다. CGPathGetCurrentPoint을 사용하여이 지점과 비교할 시작 지점 만 추적 할 수도 있습니다.

  • 경로
  • 저장 현재 시점
  • 전화 CGPathCloseSubpath
  • 의 복사본을 만들 : 그냥 직접 추적 할 어려운 경우 여기

    는 시작 지점을 찾을 수있는 원형 교차로의 방법
  • 현재 점이 변경되었는지 확인하십시오.

변경된 경우 원래 경로는 op en; 그렇지 않으면 닫힙니다.

+0

죄송합니다. 분명치 않았습니다 ... 시도했지만 때로는 사용자의 터치가 경로를 교차하여 닫아야합니다.경로의 모든 점을 비교해 보았지만 그 중 많은 점이 그 사이에 몇 픽셀의 거리가 있습니다. –

2

그래함 콕스 (Graham Cox)는 CGPathRef와 CGRect의 교차를 감지하는 방법에 대해 약간의 very interesting thoughts을 가지고 있습니다. 이는 귀하의 문제와 유사하며 교육적 일 수 있습니다. 근원적 ​​인 문제는 어렵고, 가장 실질적인 해결책은 근사치가 될 것입니다.

이 SO 문서를 CGPathRef intersection으로보고 싶을 수도 있습니다. 문제는이 문제와 유사하며 제안 된 솔루션 중 일부는 위의 Graham과 같은 공간에 있습니다.

+0

고맙습니다 ... 픽셀 단위의 충돌 감지를 시도했지만 너무 민감합니다. 때로는 앨리어싱 된 대각선 동작이 "충돌"을 유발합니다. –

0

하나의 연속 세그먼트로 구성된 경로가 자체 교차하는지 확인하는 방법입니다.

더 빠른 구현을 원할 경우 좋은 생각과 내부 데이터 CGPath에 대한 전체 액세스를 사용하여 얻을 수 있다고 확신합니다. 이 아이디어는 빠른 코딩에 초점을 맞추지 만 아직까지는 상당히 빠를 것으로 생각됩니다.

기본적으로 경로의 복사본 두 개를 가져 와서 두 가지 방법으로 채 웁니다. 하나의 채우기는 CGContextEOFillPath을 사용하고 다른 채우기는 CGContextFillPath을 사용합니다. 경로가 자체 교차하는 경우 결과가 달라집니다.

결과를 모두 difference blend mode에 블렌딩하고 결과 원시 이미지 데이터가 모두 0 (모두 검정색)인지 테스트하여 결과가 다른지 확인할 수 있습니다.

해키, 예. 그러나 (비교적) 코드 작성도 쉽습니다.

** 부록 ** 나는 단지 이것이 100 % 작동하지 않는다는 것을 깨달았습니다. 예를 들어 프레첼을 감지 할지라도 숫자 8은 감지하지 못합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 시도했지만 CGBitmapContext에서 별도의 경로에 CGContextFillPath/CGContextEOFillPath를 사용하는 데 어려움이 있습니다. 흰색 또는 검은 색으로 파일을 제출해야합니까? –

관련 문제