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

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.

主站蜘蛛池模板: 渭源县| 岐山县| 大理市| 镇雄县| 崇明县| 佛坪县| 明水县| 屏东市| 郴州市| 宽城| 湖口县| 浑源县| 濮阳市| 保定市| 洛阳市| 兰州市| 峡江县| 双柏县| 巩留县| 朔州市| 中阳县| 临夏县| 孟连| 鸡西市| 芜湖县| 汉川市| 桂阳县| 大港区| 江城| 泾阳县| 阳江市| 汾阳市| 沙田区| 耿马| 京山县| 济南市| 淮安市| 寿阳县| 雷州市| 常州市| 民丰县|