2011-11-24 3 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

그 일의 당신의 방법은 유일하게 가능한 방법이 될하지 않을 것이다 I google에서 찾았습니다. – Gabe

답변

1

당신은이 같은 함수에서 방어 적이기를 사용하여 시도 할 수 :

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; 
} 

것은, 당신이 갈 수 a 매크로 :

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

그래서 당신은 할 수 있습니다 : 물론

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

여러분이 알다시피, 매크로 ... 형태 보증 훨씬

+0

(형식화에 대한 사과, 지금은 해결할 수 없으며 지금은 시간이 없습니다.) 해답입니다. 다른 방법은 다음과 같습니다 : GLKVector에 void ptr로 전송하십시오. #define GLKVectorMakeFromCGPoint (p) (GLKVector2) (void *) (& p) ' 이것은 매크로 1이기 때문에 위험합니다. 이러한 구조가 동일해야 100 %가되어야합니다. 아직도 일해야합니다. - 데이비드 존 –

+0

죄송가 있어야 할 *을 놓친 : 'GLKVector2 myVec2 = * (GLKVector2 *) ((무효 *) myCGPoint) '또는 '#DEFINE GLKVectorMakeFromCGPoint (P) ** (GLKVector2) (무효 *) (& p) ' –

+0

형식간에 변환하지 않아야합니다. GLKVector2는 CGPoint에 대해 지정되지 않은 8의 바이트 정렬을 지정합니다. 이는 행렬 및 벡터에서 수행되는 NEON 명령어의 속도를 높이기위한 것입니다. 주조하면 NEON 작업이 느리게 수행됩니다. – Tark

-1
GLKVector2 v = GLKVector2Make(point.x, point.y); 
관련 문제