static void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, const double mval[2], float output[3]) { struct InputAngle_Data *data = mi->data; float dir_prev[2], dir_curr[2], mi_center[2]; copy_v2_v2(mi_center, mi->center); sub_v2_v2v2(dir_prev, (const float[2]){UNPACK2(data->mval_prev)}, mi_center); sub_v2_v2v2(dir_curr, (const float[2]){UNPACK2(mval)}, mi_center); if (normalize_v2(dir_prev) && normalize_v2(dir_curr)) { float dphi = angle_normalized_v2v2(dir_prev, dir_curr); if (cross_v2v2(dir_prev, dir_curr) > 0.0f) { dphi = -dphi; } data->angle += ((double)dphi) * (mi->precision ? (double)mi->precision_factor : 1.0); data->mval_prev[0] = mval[0]; data->mval_prev[1] = mval[1]; } output[0] = data->angle; }每行是什么意思
时间: 2024-04-23 13:23:02 浏览: 7
这段代码是一个函数 `InputAngle` 的实现,用于处理鼠标输入对旋转角度的影响。下面是每一行的具体意思:
1. `static void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, const double mval[2], float output[3]) {`:定义函数 `InputAngle`,该函数有四个参数:`t`(未使用)、`mi`(鼠标输入信息)、`mval`(鼠标输入的值)、`output`(输出结果)。
2. `struct InputAngle_Data *data = mi->data;`:从鼠标输入信息中获取指向 `InputAngle_Data` 结构的指针 `data`,该结构体中保存了旋转角度的信息。
3. `float dir_prev[2], dir_curr[2], mi_center[2];`:定义三个长度为 2 的浮点数数组,分别表示前一次和当前鼠标指针的方向向量以及鼠标指针的中心。
4. `copy_v2_v2(mi_center, mi->center);`:将鼠标输入信息中的中心坐标拷贝到 `mi_center` 数组中。
5. `sub_v2_v2v2(dir_prev, (const float[2]){UNPACK2(data->mval_prev)}, mi_center);`:计算前一次鼠标指针的方向向量 `dir_prev`,使用了一个宏 `UNPACK2` 将 `data->mval_prev` 展开成两个参数,然后通过 `sub_v2_v2v2` 函数实现向量相减。
6. `sub_v2_v2v2(dir_curr, (const float[2]){UNPACK2(mval)}, mi_center);`:计算当前鼠标指针的方向向量 `dir_curr`。
7. `if (normalize_v2(dir_prev) && normalize_v2(dir_curr)) {`:判断前一次和当前鼠标指针的方向向量是否归一化成功,如果都成功,则继续进行下一步操作。
8. `float dphi = angle_normalized_v2v2(dir_prev, dir_curr);`:计算前一次鼠标指针和当前鼠标指针之间的夹角 `dphi`。
9. `if (cross_v2v2(dir_prev, dir_curr) > 0.0f) { dphi = -dphi; }`:如果前一次鼠标指针和当前鼠标指针之间的夹角是逆时针旋转的,则将 `dphi` 取反,以保证旋转方向正确。
10. `data->angle += ((double)dphi) * (mi->precision ? (double)mi->precision_factor : 1.0);`:根据鼠标输入的精度值 `mi->precision` 和精度因子 `mi->precision_factor` 计算旋转角度的增量,并加到旋转角度 `data->angle` 上。
11. `data->mval_prev[0] = mval[0]; data->mval_prev[1] = mval[1];`:更新前一次鼠标输入的值。
12. `output[0] = data->angle;`:将计算出的旋转角度保存到输出数组 `output` 中。