這是一個相當快速和乾淨的解決方案。 它也可以測試多個路徑與一個,這很好,不是嗎?
它適用於CGBezier(iOS和MacOS的兼容)
•1 - 創建必需品上下文
具有相同的尺寸比創建一個16位,一個部件(無alpha)圖形端口查看。
- 不要在每次測試中重新創建此上下文,這很耗時。 僅在視圖大小調整時重新創建它。
- 讓我們稱此上下文computeContext
創建16個比特,一個部件1個像素的寬度和高度的(無alpha)圖形端口。
•2 - 當你需要測試的路徑交集:
我們工作computeContext以下操作:
- 清除上下文(這將是全黑)
- 剪輯的背景下,你想測試
- 填寫所有與你想測試 與白色的路徑的路徑
- (從現在開始,你不需要在computeContext中。 )獲取圖像和類似的東西畫出來的的TestContext:
CGImageRef clippedPathsImage = CGBitmapContextCreateImage(computeContext);
CGRect onePixSquare = CGRectMake(0,0,1,1);
CGContextDrawImage(testContext, onePixSquare, clippedPathsImage);
(別擔心,影像創建功能是快速它不malloc的,因爲任何記憶。位分配在bitmapContext中)
我們完成了!
long* data = CGBitmapContextGetData(testContext);
BOOL intersects = (*data!=0);
然而,如果你想更加快,並能負擔得起精度要求不高, 您可以創建一個較小的computeContext,對於爲例視圖大小的25%,並呈現所有分的路徑變換矩陣。
然後,1像素上下文中的傳輸速度會更快,但是您不能確定檢測到大小小於4像素的交點(使用25%縮放比例邏輯)。
不要使用8位灰色。我認爲它不會加快處理速度,並且在縮小到1像素時會失去很多精確度。足以失敗。
不要忘記,使用困難的方式之前要做的第一個測試是測試邊界框交集!
這是所有
開了GitHub上與庫;) https://github.com/moosefactory
希望這有助於,乾杯!;)
這是創建16位灰色上下文的代碼。 它可以更簡潔,但我聲明變量來說清楚。你不需要任何bitmapInfo(最後一個參數),因爲沒有alphaValue,所以我們不使用float格式。
-(CGContextRef)createComputeContext
{
size_t w = (size_t)self.bounds.size.width;
size_t h = (size_t)self.bounds.size.height;
size_t nComps = 1;
size_t bits = 16;
size_t bitsPerPix = bits*nComps;
size_t bytesPerRow = bitsPerPix*w;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bmContext = CGBitmapContextCreate(NULL, w, h, bits, bytesPerRow, cs, 0);
return bmContext;
}
如果你只對矩形感興趣,那麼CGRectIsEmpty(CGRectIntersection(r1,r2))將返回YES,否則它們不相交。 – verec 2013-03-22 19:33:17
噢抱歉...我完全忘了提及我也有橢圓...我會更新我的問題 – 2013-03-22 19:59:44
如果您對近似解決方案感興趣,會給您誤報(即:如果答案爲否,那麼肯定不會相交,如果答案是YES,那麼它們大部分時間相交,但並不總是),使用eclipse邊界框作爲矩形來計算與另一個矩形/月蝕邊界框的交點... – verec 2013-03-22 20:53:12