2012-04-04 54 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

相关问题