叉积,点积,线段相交。
//本身比较菜,就暂时只能参考别人的总结。
//这个知识点就是对大学里高等数学中几何知识的计算机应用。
//C++实现。
1.1简单的几何问题。
1.2 点积。
1.3 叉积
以上部分问题的代码实现不再多说,只需要回顾大学高等数学课本知识即可。
上述知识参考《算法竞赛入门经典训练指南》
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
class Vector
{
public:
double x,y;
Vector(int a=0,int b=0): x(a),y(b) {}
Vector operator +(Vector A)
{
return Vector(A.x+this->x,A.y+this->y);
}
Vector operator -(Vector A)
{
return Vector(A.x-this->x,A.y-this->y);
}
Vector operator *(double A)
{
return Vector(A*this->x,A*this->y);
}
Vector operator /(double A)
{
return Vector(this->x/A,this->y/A);
}
};
class Vector3
{
public:
double x,y,z;
Vector3(double a,double b,double c): x(a),y(b),z(c) {}
Vector3 operator +(Vector3 A)
{
return Vector3(A.x+this->x,A.y+this->y,A.z+this->z);
}
Vector3 operator -(Vector3 A)
{
return Vector3(A.x-this->x,A.y-this->y,A.z-this->z);
}
Vector3 operator *(double A)
{
return Vector3(A*this->x,A*this->y,A*this->z);
}
Vector3 operator /(double A)
{
return Vector3(this->x/A,this->y/A,this->z/A);
}
};
double Dot(Vector A,Vector B)
{
return A.x*B.x+A.y*B.y;
}
double Length(Vector A)
{
return sqrt(Dot(A,A));
}
double Angle(Vector A,Vector B)
{
return acos(Dot(A,B)/Length(A)/Length(B));
}
double Dot3(Vector3 A,Vector3 B)
{
return A.x*B.x+A.y*B.y+A.z*B.z;
}
double Length3(Vector3 A)
{
return sqrt(Dot3(A,A));
}
double Angle3(Vector3 A,Vector3 B)
{
return acos(Dot3(A,B)/Length3(A)/Length3(B));
}
double Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
}
double Area(Vector A,Vector B,Vector C)
{
return Cross(B-A,C-A);
}
Vector3 Cross3(Vector3 A,Vector3 B)
{
return Vector3(A.y*B.z-A.z*B.y,A.z*B.x-A.x*B.z,A.x*B.y-A.y*B.x);
}
double Area3(Vector3 A,Vector3 B,Vector3 C)
{
return Length3(Cross3(B-A,C-A));
}
int main()
{
return 0;
}
1.4 线段相交(二维)
百度后,发现这个博主写的不错,附链接如下:
https://blog.youkuaiyun.com/wordsin/article/details/79215342
1.5线段相交(三维)
这个有点复杂,我暂时还没搞懂…
只能…
https://blog.youkuaiyun.com/hunter_wwq/article/details/41044179