C++ 几何算法 – 向量点乘,叉乘及其应用

C++ 几何算法 – 向量点乘,叉乘及其应用1 向量与自身做点乘 会得到向量长度的平方 2 向量长度 为向量与自身点乘后再求平方根 3 向量投影 将 a 向量投影到向量 b 上 4 向量夹角 判断三个向量是否共面 1 2D 直线方

大家好,欢迎来到IT知识分享网。

一:点乘介绍

        1. 向量点乘:

        C++ 几何算法 - 向量点乘,叉乘及其应用

        2. 向量点乘的性质:

        C++ 几何算法 - 向量点乘,叉乘及其应用

       3. 向量点乘公式:

        C++ 几何算法 - 向量点乘,叉乘及其应用

        C++ 几何算法 - 向量点乘,叉乘及其应用

        C++ 几何算法 - 向量点乘,叉乘及其应用

      4. 向量的点乘的属性:

        (1):向量与自身做点乘,会得到向量长度的平方:C++ 几何算法 - 向量点乘,叉乘及其应用

        (2):向量长度,为向量与自身点乘后再求平方根:C++ 几何算法 - 向量点乘,叉乘及其应用

        (3):向量投影,将a向量投影到向量b上:C++ 几何算法 - 向量点乘,叉乘及其应用

        (4):向量夹角:C++ 几何算法 - 向量点乘,叉乘及其应用

二:叉乘介绍:

        1. 向量叉乘:

            C++ 几何算法 - 向量点乘,叉乘及其应用

        2. 向量叉乘公式:

          C++ 几何算法 - 向量点乘,叉乘及其应用

        3. 向量叉乘的属性:

                判断三个向量是否共面:C++ 几何算法 - 向量点乘,叉乘及其应用

三:应用1 – 求两直线的交点:

        (1)2D直线方程: C++ 几何算法 - 向量点乘,叉乘及其应用

        (2)将直线1带入直线2中: C++ 几何算法 - 向量点乘,叉乘及其应用 ,叉乘等于0,意味着两向量共线。

        (3)求交点:

                C++ 几何算法 - 向量点乘,叉乘及其应用

四:应用2 – 求三个平面的交点:

        (1):三个平面方程:

                 C++ 几何算法 - 向量点乘,叉乘及其应用

        (2):三个平面方程,三个未知数,利用克拉默法则求解即可。

三:实现

#ifndef _POINT_H_ #define _POINT_H_ #include <iostream> #include <cmath> class Point2D { public: float x, y; Point2D() {} Point2D(float x, float y) : x(x), y(y) {} Point2D &operator+=(const Point2D &t) { x += t.x; y += t.y; return *this; } Point2D &operator-=(const Point2D &t) { x -= t.x; y -= t.y; return *this; } Point2D &operator*=(float t) { x *= t; y *= t; return *this; } Point2D &operator/=(float t) { x /= t; y /= t; return *this; } Point2D operator+(const Point2D &t) const { return Point2D(*this) += t; } Point2D operator-(const Point2D &t) const { return Point2D(*this) -= t; } Point2D operator*(float t) const { return Point2D(*this) *= t; } Point2D operator/(float t) const { return Point2D(*this) /= t; } float dot(const Point2D& b) const { return x * b.x + y * b.y; } friend std::ostream &operator<<(std::ostream &out, const Point2D &t) { out << '(' << t.x << ',' << t.y << ')'; return out; } }; Point2D operator*(float a, const Point2D &b) { return b * a; } float dot(const Point2D& a, const Point2D& b) { return a.dot(b); } float norm(const Point2D& a) { return dot(a, a); } double abs(const Point2D& a) { return sqrt(norm(a)); } double proj(const Point2D& a, const Point2D& b) { return dot(a, b) / abs(b); } double angle(const Point2D& a, const Point2D& b) { return acos(dot(a, b) / abs(a) / abs(b)); } float cross(const Point2D& a, const Point2D& b) { return a.x * b.y - a.y * b.x; } Point2D intersect(const Point2D& a1, const Point2D& d1, const Point2D& a2, const Point2D& d2) { return a1 + cross(a2 - a1, d2) / cross(d1, d2) * d1; } class Point3D: public Point2D { public: float z; Point3D() {} Point3D(float x, float y, float z) : Point2D(x, y), z(z) {} Point3D &operator+=(const Point3D &t) { x += t.x; y += t.y; z += t.z; return *this; } Point3D &operator-=(const Point3D &t) { x -= t.x; y -= t.y; z -= t.z; return *this; } Point3D &operator*=(float t) { x *= t; y *= t; z *= t; return *this; } Point3D &operator/=(float t) { x /= t; y /= t; z /= t; return *this; } Point3D operator+(const Point3D &t) const { return Point3D(*this) += t; } Point3D operator-(const Point3D &t) const { return Point3D(*this) -= t; } Point3D operator*(float t) const { return Point3D(*this) *= t; } Point3D operator/(float t) const { return Point3D(*this) /= t; } float dot(const Point3D &t) const { return x * t.x + y * t.y + z * t.z; } friend std::ostream &operator<<(std::ostream &out, const Point3D &t) { out << '(' << t.x << ',' << t.y << ',' << t.z << ')'; return out; } }; Point3D operator*(float a, Point3D b) { return b * a; } float dot(const Point3D& a, const Point3D& b) { return a.dot(b); } float norm(const Point3D& a) { return dot(a, a); } double abs(const Point3D& a) { return sqrt(norm(a)); } double proj(const Point3D& a, const Point3D& b) { return dot(a, b) / abs(b); } double angle(const Point3D& a, const Point3D& b) { return acos(dot(a, b) / abs(a) / abs(b)); } Point3D cross(const Point3D& a, const Point3D& b) { return Point3D(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); } float triple(const Point3D& a, const Point3D& b, const Point3D& c) { return dot(a, cross(b, c)); } Point3D intersect(const Point3D& a1, const Point3D& n1, const Point3D& a2, const Point3D& n2, const Point3D& a3, const Point3D& n3) { Point3D x(n1.x, n2.x, n3.x); Point3D y(n1.y, n2.y, n3.y); Point3D z(n1.z, n2.z, n3.z); Point3D d(dot(a1, n1), dot(a2, n2), dot(a3, n3)); return Point3D(triple(d, y, z), triple(x, d, z), triple(x, y, d)) / triple(n1, n2, n3); } #endif 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/142509.html

(0)
上一篇 2025-05-09 21:10
下一篇 2025-05-09 21:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信