如何在C中将3d矢量表示为数组和单个组件?

时间:2014-11-18 07:40:18

标签: c

有时将3d矢量视为3个值的数组更为简单。但是,当您能够编写vec.y来访问单个组件时,它会使代码更清晰。如何编码我的矢量结构以允许两种表示?

期望的结果:能够像这样编码

y_component = 3.0 * myvec.y

for (i = 0; i < 2; i++) {
    printf("%f", myvec.v[i])
}

目前我有这个

struct vector3 {
    double v[3];
    double *x, *y, *z;
};

// then inside an init function it already gets a little bit strange
myvec.v = (double [3]) {1.0, 3.0, -5.0};
myvec.x = &vector3.v[0];
myvec.y = &vector3.v[1];

// And accessing individual component can be confusing 
y_component = 3.0 * (*myvec.y);

// Its also strange when given a pointer to a vector3
y_component = 3.0 * (*ptr_myvec->y);

不幸的是,在查看各种实现后,这是我能想到的最好的。但也许有人有办法吗?

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

只需使用联盟。它使您能够使用不同的命名法访问相同的存储单元:

typedef union {
  double v[3];

  struct
  {
    double x;
    double y;
    double z;
  };
} vector3;

vector3 vec;
static_assert(sizeof(vec) == sizeof(vec.v), "Err: padding detected!");

vec.v[0] = 1.0;
printf("%f", vec.x); // prints 1.0

注意:如果您使用的是较旧的编译器,则必须执行以下操作:

typedef union {
  double v[3];

  struct
  {
    double x;
    double y;
    double z;
  } s;
} vector3;

vector3 vec;

vec.v[0] = 1.0;
printf("%f", vec.s.x); // prints 1.0