官术网_书友最值得收藏!

Comparison operations

Comparing two quaternions can be done component-wise. Two quaternions can represent the same rotation even if they are not identical on a component level. This happens because a quaternion and its inverse rotate to the same spot but they take different routes:

  1. Overload the == and != operators in quat.cpp. Add the declaration for these functions to quat.h:

    bool operator==(const quat& left, const quat& right) {

        return (fabsf(left.x - right.x) <= QUAT_EPSILON &&

                fabsf(left.y - right.y) <= QUAT_EPSILON &&

                fabsf(left.z - right.z) <= QUAT_EPSILON &&

                fabsf(left.w - right.w) <= QUAT_EPSILON);

    }

    bool operator!=(const quat& a, const quat& b) {

        return !(a == b);

    }

  2. To test whether two quaternions represent the same rotation, the absolute difference between the two needs to be tested. Implement the sameOrientation function in quat.cpp. Add the function declaration to quat.h:

    bool sameOrientation(const quat&l, const quat&r) {

        return (fabsf(l.x - r.x) <= QUAT_EPSILON  &&

                fabsf(l.y - r.y) <= QUAT_EPSILON  &&

                fabsf(l.z - r.z) <= QUAT_EPSILON  &&

                fabsf(l.w - r.w) <= QUAT_EPSILON) ||

               (fabsf(l.x + r.x) <= QUAT_EPSILON  &&

                fabsf(l.y + r.y) <= QUAT_EPSILON  &&

                fabsf(l.z + r.z) <= QUAT_EPSILON  &&

                fabsf(l.w + r.w) <= QUAT_EPSILON);

    }

Most of the time, you will want to use the equality operator to compare quaternions. The sameOrientation function is not as useful because the rotation that a quaternion takes can be changed if the quaternion is inverted.

In the next section, you will learn how to implement a quaternion dot product.

主站蜘蛛池模板: 天柱县| 政和县| 河北区| 历史| 如皋市| 壤塘县| 车险| 朝阳县| 孟州市| 化州市| 南投县| 乌恰县| 高淳县| 汕头市| 资阳市| 长治市| 合肥市| 盐城市| 额济纳旗| 正宁县| 米林县| 秦安县| 筠连县| 安顺市| 湘潭县| 宜兴市| 沿河| 洛川县| 南漳县| 锦州市| 北京市| 绥江县| 榆中县| 潮安县| 怀来县| 乐山市| 蕉岭县| 化德县| 阜宁县| 宣汉县| 永和县|