大家好,欢迎来到IT知识分享网。
一:点乘介绍
1. 向量点乘:
2. 向量点乘的性质:
3. 向量点乘公式:
4. 向量的点乘的属性:
(1):向量与自身做点乘,会得到向量长度的平方:
(2):向量长度,为向量与自身点乘后再求平方根:
(3):向量投影,将a向量投影到向量b上:
(4):向量夹角:
二:叉乘介绍:
1. 向量叉乘:
2. 向量叉乘公式:
3. 向量叉乘的属性:
判断三个向量是否共面:
三:应用1 – 求两直线的交点:
(1)2D直线方程:
(2)将直线1带入直线2中: ,叉乘等于0,意味着两向量共线。
(3)求交点:
四:应用2 – 求三个平面的交点:
(1):三个平面方程:
(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