.弧度转角度/角度转弧度

本文介绍iOS开发中角度与弧度转换的实用宏,包括从弧度转角度和角度转弧度的代码示例,适用于旋转图片等场景。

iphone里面角度和弧度经常要转换,比如旋转一个图片,你要用到CGAffineTransformMakeRotation,他就需要一个弧度值做完输入。

下面是两个宏,来实现互转

1.弧度转角度

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

NSLog(@"Output radians as degrees: %f", RADIANS_TO_DEGREES(0.785398));

2.角度转弧度

// Degrees to radians

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

NSLog(@"Output degrees as radians: %f", DEGREES_TO_RADIANS(45));


你提供的代码片段是一个 `else` 分支中的 C++ 代码,主要用于**离线处理一个 `.pcap` 文件**(网络抓包文件),通常用于雷达、激光雷达(LiDAR)或其它传感器数据的回放和点云生成。这段代码使用了某个自定义的 `grabs_config` 和 `check_Grabs` 类,以及一个名为 `ReadPcap` 的函数来读取 PCAP 数据并进行处理。 下面我将逐行解释该代码,并给出完整的上下文假设下的优化与说明,最后提供一些相关问题。 --- ```cpp else { // 注释掉的参数配置部分: // l = (configParam.offlineParam.lValue) / 1000; // 可能是长度单位换 mm -> m // offsetX = (configParam.offlineParam.offsetValue) / 1000; // 偏移量从 mm m // float tempRData = configParam.offlineParam.thetaValue; // 获取角度原始值(例如 4408) // float radian = static_cast<float>(tempRData) * 0.0001f; // 弧度:4408 * 0.0001 = 0.4408 弧度 // float degrees = RAD2DEG(radian); // 弧度角度(宏 RAD2DEG 应定义为 180/PI) // theta = degrees; // 使用角度值(可能后续再弧度) // 指定离线 PCAP 文件路径 std::string pcap_file = "./data/offline_data.pcap"; // 创建配置对象 grabs_config config; // 初始化 Grab 检测器,传入配置 check_Grabs grab_detector(config); // 调用 ReadPcap 函数处理 PCAP 文件 int result = ReadPcap(const_cast<char*>(pcap_file.c_str()), grab_detector); // 判断是否成功处理 if (result == 0) { std::cout << "PCAP文件离线处理完成" << std::endl; } // 返回生成的点云数据(outputCloud 应在作用域外定义) return outputCloud; } ``` --- ### ✅ 代码解释: 1. **注释部分**: - 这些被注释的代码可能是早期调试时使用的参数设置。 - `thetaValue` 是以“万分之一弧度”为单位存储的角度(常见于嵌入式系统中避免浮点运算),乘以 `0.0001f` 得到真实弧度。 - `RAD2DEG()` 是常见的宏定义:`#define RAD2DEG(x) ((x)*180.0/M_PI)`,用于弧度角度。 2. **`pcap_file`**: - 定义了要读取的 `.pcap` 文件路径,通常是通过 Wireshark 或设备录制的传感器 UDP 数据包。 3. **`grabs_config config;`**: - 构造一个配置类实例,可能包含帧率、IP 地址、端口、坐标变换等信息。 4. **`check_Grabs grab_detector(config);`**: - 自定义检测器类,可能负责解析数据包、提取点云、做目标检测等任务。 5. **`ReadPcap(...)`**: - 看名字是关键函数,用于打开并解析 `.pcap` 文件。 - 因为参数需要 `char*`,所以用 `const_cast<char*>` 强制换 `c_str()` 的结果(虽然不推荐,但有时旧 API 需要)。 - 返回值 `0` 表示成功。 6. **`return outputCloud;`**: - 返回点云数据(如 `pcl::PointCloud<pcl::PointXYZ>::Ptr` 类型),但在当前作用域未定义,应是在外部声明的变量。 --- ### 🔧 改进建议(更安全 & 清晰): ```cpp else { const std::string pcap_path = "./data/offline_data.pcap"; // 检查文件是否存在 std::ifstream file(pcap_path); if (!file.good()) { std::cerr << "错误:无法访问 PCAP 文件:" << pcap_path << std::endl; return nullptr; // 或抛出异常 } file.close(); grabs_config config; check_Grabs grab_detector(config); // 使用临时 buffer 避免 const_cast char* non_const_path = strdup(pcap_path.c_str()); // 动态复制字符串 int result = ReadPcap(non_const_path, grab_detector); free(non_const_path); // 记得释放 if (result == 0) { std::cout << "PCAP文件离线处理完成" << std::endl; } else { std::cerr << "PCAP文件处理失败,错误码:" << result << std::endl; return nullptr; } return outputCloud; } ``` > 💡 如果 `ReadPcap` 接受的是只读字符串,建议修改其原型为 `const char* filename`,这样就不需要 `const_cast` 或 `strdup`。 --- ### 📌 相关知识点总结: - `.pcap` 文件常用于保存 LiDAR 发送的 UDP 数据包(如 Ouster、Velodyne、速腾聚创等)。 - `ReadPcap` 函数内部可能使用 `libpcap` 库(如 `pcap_open_offline`, `pcap_next`)来逐个解析数据包。 - 解析后会重建点云(Point Cloud),并通过回调或成员变量传递给 `grab_detector` 处理。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值