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

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.

主站蜘蛛池模板: 奉贤区| 建始县| 龙南县| 建水县| 莆田市| 三台县| 双牌县| 聂荣县| 抚松县| 伊通| 莒南县| 鹿邑县| 丰顺县| 云和县| 迁西县| 龙里县| 邵阳市| 马尔康县| 米林县| 武夷山市| 馆陶县| 天门市| 牙克石市| 武城县| 汉源县| 晋州市| 建阳市| 宁晋县| 广州市| 陈巴尔虎旗| 汕头市| 英山县| 黄陵县| 嘉义县| 鸡东县| 福州市| 乐安县| 紫金县| 城口县| 瓮安县| 塘沽区|