2011-11-24 44 views
1

簡單的問題。將CGPoint變成GLKVector的最佳方法是什麼?在Objective-C中將CGPoint轉換爲GLKVector2

這些結構是相同的,所以它能很好地reinterpret_cast或memcpy或類似的東西。我的解決方案在下面工作,但幾乎看不出最佳。我在堆棧上創建一個GLKVector2,指定每個成員,然後將其作爲一個值分配給另一個GLKVector。

這不會破壞銀行或任何其他事情,但必須有一個更好的方法來做到這一點?

GLKVector2 Vector2FromPoint(CGPoint point) 
{ 
    GLKVector2 v; 
    v.x = point.x; 
    v.y = point.y; 
    return v; 
} 
+0

你做這件事的方式是唯一可行的辦法,我在谷歌上找到。 – Gabe

回答

1

你可以嘗試這樣的功能使用的memcpy:

bool vector2ToCGPoint(GLKVector2* s, CGPoint* d) { 
    memcpy(d, s, sizeof(*d)); 
} 

但隨後可能是更好的有:

bool copyVector2ToCGPoint(GLKVector2* s, CGPoint* d) { 
    d.x = s.x; 
    d.y = s.x; 
} 

如果你真的想優化,你可以去對於宏:

#define copyS2D(S,D) (D.x = S.x, D.y = S.y) 

所以你可以做:

CGPoint b; 
GLKVector2 a; 
vector2FromCGPoint(a, b); 
當然

,如你所知,宏不會這麼多類型安全的...

+0

(格式道歉,我不能解決,並沒有現在的時間) 謝謝你的答案。這是另一種方式:強制使ptr無效然後到GLKVector。這是危險的,因爲1.它是一個宏2.你必須是100%,這些結構是相同的。仍然應該工作。 - 大衛約翰 –

+0

對不起* a應該有: 'GLKVector2 myVec2 = *(GLKVector2 *)((void *)&myCGPoint);'或者 '#define GLKVectorMakeFromCGPoint(p)**(GLKVector2)(void *) (&p)' –

+0

你不應該在類型之間進行轉換。 GLKVector2指定8的字節對齊,這不是爲CGPoint指定的。這是爲了加速在矩陣和向量上執行的NEON指令。投射會導致NEON操作執行速度變慢。 – Tark

-1
GLKVector2 v = GLKVector2Make(point.x, point.y); 
相關問題