Ios 在Objective-C中将CGPoint转换为GLKVector2

Ios 在Objective-C中将CGPoint转换为GLKVector2,ios,xcode,Ios,Xcode,简单的问题。将CGPoint转换为GLKVector的最佳方式是什么 这些结构是相同的,所以能够重新解释_cast或memcpy之类的东西会很好。我下面的解决方案有效,但似乎并不理想。我在堆栈上创建一个GLKVector2,分配每个成员,然后将其作为一个值返回,然后分配给另一个GLKVector 这不会让银行破产,但一定有更整洁的方法 GLKVector2 Vector2FromPoint(CGPoint point) { GLKVector2 v; v.x = point.x;

简单的问题。将CGPoint转换为GLKVector的最佳方式是什么

这些结构是相同的,所以能够重新解释_cast或memcpy之类的东西会很好。我下面的解决方案有效,但似乎并不理想。我在堆栈上创建一个GLKVector2,分配每个成员,然后将其作为一个值返回,然后分配给另一个GLKVector

这不会让银行破产,但一定有更整洁的方法

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

您可以尝试在如下函数中使用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);

当然,正如你所知,宏不会有那么多的类型安全性…

你这样做的方式是我在谷歌上找到的唯一可能的方式。(为格式问题道歉,我现在无法解决,也没有时间)谢谢你的回答。还有另一种方法:先将ptr转换为void,然后再转换为GLKVector#定义GLKVectorMakeFromCGPoint(p)(GLKVector2)(void*)(&p)“”这很危险,因为1。这是一个宏2。你必须100%确认这些结构是相同的。仍然应该有效David JohnSorry遗漏了一个*应该是:
glkvecto2 myVec2=*(glkvecto2*)((void*)和myCGPoint)或“#定义GLKVectorMakeFromCGPoint(p)*(GLKVector2)(void)(&p)”不应在类型之间强制转换。GLKVector2指定字节对齐方式为8,而不是为CGPoint指定。这是为了加速对矩阵和向量执行的指令。投射将导致霓虹灯操作执行较慢。
GLKVector2 v = GLKVector2Make(point.x, point.y);