2010-02-12 31 views
3

我創建一個CGPath在我的遊戲定義的區域是這樣的:我怎樣才能移動CGPath而無需創建一個新的

CGPathMoveToPoint (myPath, NULL, center.x, center.y); 
CGPathAddLineToPoint(myPath, NULL,center.x + 100, center.y); 
CGPathAddLineToPoint(myPath, NULL, center.x + 100, center.y + 100); 
CGPathAddLineToPoint(myPath, NULL, center.x, center.y + 100); 
CGPathCloseSubpath (myPath); 

我知道這僅僅是一個正方形,我可以只使用另一CGRect但我希望實際創建的路徑實際上不是矩形(我現在只是測試)。然後用檢測到觸摸區域簡單地:

if (CGPathContainsPoint(myPath, nil, location, YES)) 

這一切工作正常,則問題是,CGPath可以向上移動,以每秒40次。我如何移動它而不必創建一個新的?我知道我可以做這樣的事情,以「動」吧:

center.y += x; 
CGPathRelease(myPath); 
myPath = CGPathCreateMutable(); 
CGPathMoveToPoint (myPath, NULL, center.x, center.y); 
CGPathAddLineToPoint(myPath, NULL,center.x + 100, center.y); 
CGPathAddLineToPoint(myPath, NULL, center.x + 100, center.y + 100); 
CGPathAddLineToPoint(myPath, NULL, center.x, center.y + 100); 
CGPathCloseSubpath (myPath); 

但我不得不釋放,並創建一個新的路徑高達每秒40次,我認爲可能有性能損失;這是真的?

我想能夠移動它,就像我正在移動一些CGRects只需將原點設置爲不同的值,這可能與CGPath

謝謝。

編輯:我忘了提及我沒有GraphicsContext,因爲我不是在UIView上繪圖。

回答

5

將轉換應用於CGPath並針對某個點進行測試,相當於將反轉轉換爲該點。

因此,您可以使用

CGPoint adjusted_point = CGPointMake(location.x - center.x, location.y - center.y); 
if (CGPathContainsPoint(myPath, NULL, adjusted_point, YES)) 

CGPathContainsPoint已經採取CGAffineTransform參數(你NULL -ed它),所以你也可以使用

CGAffineTransform transf = CGAffineTransformMakeTranslation(-center.x, -center.y); 
if (CGPathContainsPoint(myPath, &transf, location, YES)) 

如果您正在繪製,而不是更改路徑,您可以直接在繪圖代碼中更改CTM。

CGContextSaveGState(c); 
CGContextTranslateCTM(c, center.x, center.y); 
// draw your path 
CGContextRestoreGState(c); 

如果您需要性能,請使用CAShapeLayer

+0

那不是移動整個圖形上下文,而不是人的路?此外,我忘了提及我沒有graphicscontext,因爲我沒有繪製UIView – 2010-02-12 21:16:44

+0

@OscarMk:哎呀。抱歉。查看更新。 – kennytm 2010-02-12 21:28:55

+0

謝謝,這將幫助我很多!我不需要移動所有的多邊形,我只需要翻譯我的觀點,以前我應該想到這一點。在性能上有什麼更好的創建一個新的cgpoint或使用CGAffine變換隻是一個問題嗎? – 2010-02-12 21:37:19

2

@ KennyTM的回答非常完美的OP的目的,但問題依然存在:

我如何可以移動CGPath而無需創建一個新的?

好了,兩行代碼爲我做的伎倆:

UIBezierPath* path = [UIBezierPath bezierPathWithCGPath:cgPath]; 
[path applyTransform:CGAffineTransformMakeTranslation(2.f, 0.f)]; 
+0

還有:CGPathCreateCopyByTransformingPath( CGPathRef路徑,常量CGAffineTransform *變換); – alecail 2013-06-30 21:02:45

+0

@Antoine感謝,但仍創造了新的CGPath,這是什麼OP試圖避免。如果問題更好,代碼更簡潔,那麼您的答案是完美的。 – Mazyod 2013-06-30 21:12:01

+1

是的,我知道。不幸的是,在OP一直在尋找的是OS X NSBezierPath方法'setAssociatedPoints:atIndex:'你可以用這種方法來改變與快速的路徑,並沒有重新創建路徑相關聯的點。我希望將來UIBezierPath的行爲更像一個NSBezierPath。 – alecail 2013-06-30 21:24:00

相關問題