以下均在二维平面中
∗
与
×
*与\times
∗与×运算非向量都表示乘法
1.向量
假设
A
⃗
(
x
1
,
y
1
)
,
\vec A(x_1,y_1),
A(x1,y1),
B
⃗
(
x
2
,
y
2
)
;
z
\vec B(x_2,y_2);z
B(x2,y2);z为任意实数
A
⃗
+
B
⃗
=
(
x
1
+
x
2
,
y
1
+
y
2
)
\vec A +\vec B=(x_1+x_2,y_1+y_2)
A+B=(x1+x2,y1+y2)
A
⃗
−
B
⃗
=
(
x
1
−
x
2
,
y
1
−
y
2
)
\vec A-\vec B=(x_1-x_2,y_1-y_2)
A−B=(x1−x2,y1−y2)
A
⃗
∗
x
=
(
x
1
∗
z
,
x
2
∗
z
)
\vec A*x=(x_1*z,x_2*z)
A∗x=(x1∗z,x2∗z)
A
⃗
/
x
=
(
x
1
/
z
,
x
2
/
z
)
\vec A / x=(x_1/z,x_2/z)
A/x=(x1/z,x2/z)
A
⃗
∗
B
⃗
=
x
1
∗
x
2
+
y
1
∗
y
2
=
∣
A
⃗
∣
×
∣
B
⃗
∣
×
c
o
s
(
r
a
d
)
\vec A * \vec B=x_1*x_2+y_1*y_2=|\vec A| \times|\vec B| \times cos(rad)
A∗B=x1∗x2+y1∗y2=∣A∣×∣B∣×cos(rad)
(其中rad为向量A与向量B的夹角)
A
⃗
×
B
⃗
=
x
1
×
y
2
−
x
2
×
y
1
=
∣
A
⃗
∣
×
∣
B
⃗
∣
×
s
i
n
(
r
a
d
)
\vec A \times \vec B=x_1 \times y_2-x_2\times y_1=|\vec A| \times|\vec B| \times sin(rad)
A×B=x1×y2−x2×y1=∣A∣×∣B∣×sin(rad)
(其中rad为向量A与向量B的夹角)
其中点积满足交换律和结合律,但叉积只满足结合律
点积几何意义:向量在另一向量投影的长度 乘 另一向量的长度
叉积几何意义:两向量所围成的有向平行四边形面积(可以为负)
LRJ模板好
定义向量
struct Point{
double x,y;
Point (double xx=0,double yy=0){x=xx,y=yy;}
};
typedef Point Vector;
向量的运算
inline Vector operator + (const Vector &A,const Vector &B){return Vector(A.x+B.x,A.y+B.y);}
inline Vector operator - (const Point &A,const Point &B){return Vector(A.x-B.x,A.y-B.y);} //点-点=向量
inline Vector operator * (const Vector &A,const double x){return Vector(A.x*x,A.y*x);} //向量的数乘
inline Vector operator / (const Vector &A,const double x){return Vector(A.x/x,A.y/x);}
向量的点积与叉积
inline double Dot(const Vector &A,const Vector &B){return A.x*B.x+A.y*B.y;}//点积
inline double Cross(const Vector &A,const Vector &B){return A.x*B.y-A.y*B.x;}//叉积
向量的模长
将点积公式代入入两个相同的向量即可(或直接使用两点间距离公式)
inline double length(const Vector &X){return sqrt(Dot(X,X));}
求两直线交点
每一条直线都可以表示为
P
+
v
⃗
t
P+\vec vt
P+vt
其中
P
P
P为直线经过的一点,
v
⃗
\vec v
v为直线方向的向量
inline Point GLI(Point P,Vector v,Point Q,Vector w){
Vector u=P-Q;
double t=(w^u) / (v^w);
u=v*t;
return u+A;
}
证明提示:根据代码画图,联系叉积几何意义,可发现两个同底的平行四边形
点到直线的距离
直线上任取两点
A
,
B
A,B
A,B,设该点为
P
P
P
将叉积公式变形:
s
i
n
(
r
a
d
)
=
A
P
→
×
A
B
→
∣
A
∣
∗
∣
B
∣
sin(rad)=\frac{\overrightarrow{AP} \times \overrightarrow{AB}}{|A|*|B|}
sin(rad)=∣A∣∗∣B∣AP×AB
则距离为:
s
i
n
(
r
a
d
)
∗
∣
A
∣
sin(rad)*|A|
sin(rad)∗∣A∣
double Disline(Point A,Point B,Point x){
Vector v1=x-A,v2=B-A;
return fabs(Cross(v1,v2))/length(v2);
}
点到线段的距离
设该点为 P P P,线段两端点分别为 A , B A,B A,B
- 点在该线段左方,则有 A P → ∗ A B → < 0 \overrightarrow{AP} * \overrightarrow{AB}<0 AP∗AB<0 (点积几何意义)
- 点在该线段右上方类比可得
- 不属于上述情况则与点到直线距离相同
double Dis(Point l,Point r,Point x){
if (l==r) return length(x-l);
Vector v1=x-l,v2=r-l,v3=x-r;
if (dcmp(Dot(v1,v2))<0) return length(v1);
else if (dcmp(Dot(v2,v3))>0) length(v3);
else return fabs(Cross(v1,v2))/length(v2);
}