나는 사용자가 여전히 만질 수있을 정도로 화면 경계 내에있는 CGPath의 양을 볼 수 있어야하는 iOS 응용 프로그램에서 작업하고 있습니다. 문제는 코너가 모퉁이에있을 때 경로가 구석에있을 때 일반적으로 사용하는 모든 방법 (그리고 내가 시도 할 수있는 모든 방법)이 실패한다는 것입니다. 여기 CGPath가 교차하는 영역 찾기 CGRect
은 그림이다 : 내가 화면에 얼마나 많은 그 모양이다 계산할 수있는 방법?
나는 사용자가 여전히 만질 수있을 정도로 화면 경계 내에있는 CGPath의 양을 볼 수 있어야하는 iOS 응용 프로그램에서 작업하고 있습니다. 문제는 코너가 모퉁이에있을 때 경로가 구석에있을 때 일반적으로 사용하는 모든 방법 (그리고 내가 시도 할 수있는 모든 방법)이 실패한다는 것입니다. 여기 CGPath가 교차하는 영역 찾기 CGRect
은 그림이다 : 내가 화면에 얼마나 많은 그 모양이다 계산할 수있는 방법?
명백한 대답은 픽셀 페인팅에 의해 경험적으로 또는 폴리곤 클리핑에 의해 분석적으로 수행됩니다.
경험적으로 진행하려면 뷰포트의 크기를 CGBitmapContext
으로 만들고 (0, 0, 0)과 같은 알려진 색상으로 지우고, 다른 알려진 색상 인 폴리곤 (예 : 1, 1, 1) 그러면 비트 맵 컨텍스트의 모든 픽셀을 실행하고 찾은 총 수를 더합니다. 아마도 꽤 비싸지 만 저해상도 컨텍스트를 사용하면 도움이되는 경우보다 근사한 결과를 얻을 수 있습니다.
분석을 계속 진행하려면 described here과 같은 다각형 클리핑 알고리즘을 실행하여 원본에서 새 폴리곤 (실제로는 화면에있는 부분)을 파생시킵니다. 그런 다음 일반 수식 중 하나를 사용하여 그 영역을 얻습니다.
그것은 오목 아닌 볼록 다각형 클립 실제로 훨씬 쉽게, 그래서 당신의 폴리곤은 고정 된 형태의 경우 다음과 같은 ear clipping 또는 decomposition to monotone edges를 삼각 측량 알고리즘을 사용하고 클리핑 및 면적 계산을 수행하는 것이 좋습니다 원본보다는 오히려.
당신은이 방법을 사용하여 근사치를 얻을 수 :
을 추정 할 수있다 좋은 좋은 빠른 근사치를 얻으려면
정확히 무엇을 찾으십니까? 오버랩의 면적 (정사각형 포인트)을 측정 하시겠습니까? 또는 겹치는 부분 만 포함하고있는 경로 나 마스크를 원하십니까? 또는 다른 것? –
CGPath가 완전히 일반화되어 있습니까? 아니면 다이어그램에 표시된 것처럼 다각형으로 보장됩니까? – Tommy
@robmayoff 가능한 경우, 면적을 정사각형으로 측정하고 싶습니다. – daveMac