EP2嵌入式宏空间坐标数量

1、题目:

我们经常使用的点类Point结构体,其中包含两个int变量x与y,这是属于二维平面上点类。现假设我们的点类Point是属于多维空间中的点,其中包含多个相同类型(类型未知)的变量(第一个一定是x)表示坐标,你能否使用宏定义的方式,从使用空间的角度算出这个点类有多少个变量?

2、思路:

题目展示了二维的int型点类结构体如下:

struct Point {

 int x;

 int y;

 };

现用来测试的点类结构体不知道是几维的,但第一个变量一定是x,且x是什么类型的变量剩下的维度也是这种类型。题目要求要使用宏定义的方式来算出这个点类结构体有多少个变量(即有几维)

3、代码

#define length(point)  (sizeof(point) / sizeof(int))

int define_count(struct Point point ) {

    return length(point);

}

sizeof(point) / sizeof(int) 取结构体变量名的长度/int的长度 可得到该结构体的变量个数

但是前提是这些变量都是int型,而题上说变量的类型未知,所以做如下改变:

#define length(point) (sizeof(point) / sizeof(typeof(point.x)))

int define_count(struct Point point ) {

    return length(point);

}

先判断第一个变量x的类型 再去取长度。

总结: typeof(point.x)   point.x是结构体变量名引用结构体内的变量

typeof关键字能取变量的类型

struct Point point 是结构体名+结构体变量名的形式

后记:种一棵树最好的时间是十年前 其次是现在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一种基于WGS84椭球模型的大地坐标空间直角坐标系之间的相互转换方法,使用C语言实现。 1. 定义常量 首先需要定义一些常量,包括椭球体长半轴a、短半轴b、第一偏心率e、第二偏心率e'等,以及一些常量的计算结果。 ```c #define PI 3.14159265358979323846 #define a 6378137.0 // 椭球体长半轴 #define b 6356752.314245 // 椭球体短半轴 #define f (a - b) / a // 扁率 #define e2 (2 * f - f * f) // 第一偏心率的平方 #define ep2 (e2 / (1 - e2)) // 第二偏心率的平方 ``` 2. 大地坐标转换为空间坐标 给定一个大地坐标(经度、纬度、高程),需要将其转换为空间坐标(X、Y、Z)。计算方法如下: ```c void geodetic2ecef(double lon, double lat, double h, double *x, double *y, double *z) { double N = a / sqrt(1 - e2 * sin(lat) * sin(lat)); // 卯酉圈曲率半径 *x = (N + h) * cos(lat) * cos(lon); *y = (N + h) * cos(lat) * sin(lon); *z = (N * (1 - e2) + h) * sin(lat); } ``` 3. 空间坐标转换为大地坐标 给定一个空间坐标(X、Y、Z),需要将其转换为大地坐标(经度、纬度、高程)。计算方法如下: ```c void ecef2geodetic(double x, double y, double z, double *lon, double *lat, double *h) { double p = sqrt(x * x + y * y); // 投影距离 double theta = atan2(z * a, p * b); // 纬度角 double sintheta = sin(theta); double costheta = cos(theta); *lon = atan2(y, x); double N = a / sqrt(1 - e2 * sintheta * sintheta); // 卯酉圈曲率半径 *lat = atan2(z + ep2 * N * sintheta * sintheta, p - e2 * N * costheta * costheta); double sinlat = sin(*lat); N = a / sqrt(1 - e2 * sinlat * sinlat); *h = p / cos(*lat) - N; } ``` 使用示例: ```c int main() { double lon = 116.3975; // 经度 double lat = 39.9086; // 纬度 double h = 50.0; // 高程 double x, y, z; geodetic2ecef(lon * PI / 180, lat * PI / 180, h, &x, &y, &z); printf("x = %lf, y = %lf, z = %lf\n", x, y, z); double lon1, lat1, h1; ecef2geodetic(x, y, z, &lon1, &lat1, &h1); printf("lon = %lf, lat = %lf, h = %lf\n", lon1 * 180 / PI, lat1 * 180 / PI, h1); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值