2011-11-24 43 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); 
相关问题