2012-04-04 74 views
0

我想創建一個結構是像一個CGPoint,但與3個座標,而不是2如何爲這個結構創建一個自己的結構和常量?

我在下面的方式來創建它:

typedef struct {CGFloat x;CGFloat y;CGFloat z;} CG3Vector; 

CG_INLINE CG3Vector CG3VectorMake(CGFloat x, CGFloat y, CGFloat z) 
{ 
    CG3Vector p; p.x = x; p.y = y; p.z = z; return p; 
} 

它工作正常。但是我現在想要改進這個結構,使它具有像CGPoint一樣的常量:CGPointZero

另外什麼方法來引入結構的特定組件的限制,比如它是CGSize,其中組件低於0?

謝謝。

+0

不爲浮點,但你有沒有聽說過無符號類型? – 2012-04-04 16:15:06

+1

請勿在自己的類型上使用'CG'前綴;它屬於Core Graphics。 – 2012-04-04 16:18:31

回答

2

你可以這樣創建常量:

const CG3Vector CG3VectorZero = { 0, 0, 0 }; 

如果你想限制,我想你可以做一些檢查是這樣的:

CG_INLINE CG3Vector CG3VectorMake(CGFloat x, CGFloat y, CGFloat z) 
{ 
    // normalize the values 
    x = fmod(x, 360); 
    y = fmod(y, 360); 
    z = fmod(z, 360); 

    x = (x < 0) ? 360 + x : x; 
    y = (y < 0) ? 360 + y : y; 
    z = (z < 0) ? 360 + z : z; 

    return (CG3Vector) { x, y, z }; 
} 
+1

可能值得把'const'放在零結構體上。 – 2012-04-04 16:54:58

+0

謝謝,聽起來很合乎邏輯。不明白爲什麼我自己沒有提出這個想法。其實我可以在大括號之間加任何代碼,對嗎?例如,如果超出限制,則更改爲某個默認值。但我還有另一個問題。如果我想要一個表示一個向量的結構,這個向量表示x =(0; 360)的三個角度,我可以將角度值的變換放到一個新的角度值內。但是,如何爲單個組件的setter完成此類示例: CG3Vector a = CG3VectorMake(120,70,80); a.z = -20; //應該轉換爲360-20 = 340 – BartoNaz 2012-04-04 18:58:30

+0

@BartoNaz更新了我的答案。 – 2012-04-04 19:18:07