向量的减法: A ? ? B ? = C ? \vec A-\vec B=\vec C A?B=C(按照加法的定义并通过平移旋转即可得到)
内积(点积): A ? ? B ? = ∣ A ? ∣ ∣ B ? ∣ cos ? θ \vec A\cdot \vec B=|\vec A||\vec B|\cos_{\theta} A?B=∣A∣∣B∣cosθ?
几何意义:向量 A ? \vec A A 在向量 B ? \vec B B 上的投影与 B ? \vec B B 的长度的乘积
Code:(证明略)
double dot (Point A, Point B) { return A.x * B.x + A.y * B.y }
外积(叉积): A ? × B ? = ∣ A ? ∣ ∣ B ? ∣ sin ? θ \vec A\times \vec B=|\vec A||\vec B|\sin_{\theta} A×B=∣A∣∣B∣sinθ?
几何意义:向量 A ? \vec A A 与向量 B ? \vec B B 组成的平行四边形的面积( B ? \vec B B 在 A ? \vec A A 的逆时针方向为正)
Code:(证明略)
double cross(Point A, Point B) { return A.x * B.y - B.x * A.y }
向量取模(向量的长度)
向量的长度为 d o t a ? , a ? \sqrt{\mathrm{dot_{\vec a,\vec a}}} dota,a??,即 x 2 + y 2 \sqrt{x^2+y^2} x2+y2?
注意:前面包括后面的所有向量都默认起点为平面直角坐标系原点
Code:
double Length(Point A) { return sqrt(dot(a, a)); }
计算向量夹角
已知向量的点积为 ∣ A ? ∣ ∣ B ? ∣ cos ? θ |\vec A||\vec B|\cos_{\theta} ∣A∣∣B∣cosθ?,现在要求 θ \theta θ,就是 KaTeX parse error: Undefined control sequence: \acos at position 1: \?a?c?o?s?_\frac{\vec A \…
Code:
double Angle(Point A, Point B) { return acos(dot(A, B)) / Length(A) / Length(B)}
向量 A ? \vec A A 顺时针旋转 θ \theta θ 角度
( x , y ) [ cos ? θ ? sin ? θ sin ? θ cos ? θ ] (x,y) \begin{bmatrix} \cos_{\theta} &-\sin_{\theta}\\ \sin_{\theta} &\cos_{\theta} \end{bmatrix} (x,y)[cosθ?sinθ???sinθ?cosθ??]
其中 ( x , y ) (x,y) (x,y) 表示向量 A ? \vec A A,证明略。
Code:
Point Rotate(Point A, int Theta)
{
return Point(A.x * cos(Theta) + A.y * sin(Theta), -A.x * sin(Theta) + A.y * cos(Theta))
}
直线点向式表示方式: P + t V ? P+t\vec V P+tV
判断点在直线上: A ? × B ? = 0 \vec A \times \vec B=0 A×B=0, B ? \vec B B 是表示该直线的向量, A ? \vec A A 是该点与 B ? \vec B B 的起点所组成的向量
判断 2 2 2 条直线的位置关系,交点的位置(如果有)
cross(v, w) = 0
,则两直线平行或重合。
两条直线: P + t V ? P+t\vec V P+tV, Q + t W ? Q+t\vec W Q+tW
V ? ′ \vec V ' V′ 为 V ? \vec V V 的平移,红线为两个三角形的高,此时必有 2 2 2 个三角形相似
即, 2 2 2 个紫色三角形是相似的,因为 V ? ′ \vec V' V′ 是 V ? \vec V V 的平移,所以内错角相等,即 KaTeX parse error: Undefined control sequence: \ang at position 1: \?a?n?g? ?FMJ=\ang HLM,且都是直角三角形,所以相似。那么, F J M H = F K L H \frac{FJ}{MH}=\frac{FK}{LH} MHFJ?=LHFK?,因为 L H = ∣ V ? ∣ LH=|\vec V| LH=∣V∣,所以 F J M H = F K ∣ V ? ∣ \frac{FJ}{MH}=\frac{FK}{|\vec V|} MHFJ?=∣V∣FK?,而 K K K 的坐标为 P + V ? F K ∣ V ? ∣ P+\vec V \frac{FK}{|\vec V|} P+V∣V∣FK?。所以只需要求出 F J M H \frac{FJ}{MH} MHFJ? 即可,而 F J M H \frac{FJ}{MH} MHFJ? 恰好等于 W ? × u ? V ? × W ? \frac{\vec W\times \vec u}{\vec V\times \vec W} V×WW×u?。
故, K K K 点的坐标为 P + V ? W ? × u ? V ? × W ? P+\vec V \frac{\vec W\times \vec u}{\vec V\times \vec W} P+VV×WW×u?
Point Line_Intersection(Point P, Vector V, Point Q, Vector W)
{
Vector u = P - Q;
return P + V * cross(W, u) / cross(V, W);
}
点到直线的距离
设向量 V ? \vec V V 为 B ? A B-A B?A, W ? \vec W W 为 P ? A P-A P?A。
则有, V ? × W ? L e n g t h V ? \frac{\vec V\times \vec W}{\mathrm{Length_{\vec V}}} LengthV?V×W? 为点 P P P 到 A B AB AB 的距离。
点到线段的距离
与 14 14 14 略有不同,边界情况:如果线段为 1 1 1 个点,则就是 P P P 与线段端点所组成的向量的模长。
如果
V
1
?
?
V
2
?
<
0
\vec{V_1}\cdot \vec{V_2}<0
V1???V2??<0,则为
∣
V
2
?
∣
|\vec {V_2}|
∣V2??∣。解释:
V
?
1
?
V
?
2
\vec V_1 \cdot \vec V_2
V1??V2? 的符号正负取决于
cos
?
θ
\cos_\theta
cosθ?,当
θ
>
90
°
\theta>90\degree
θ>90° 时,
cos
?
θ
<
0
\cos_\theta<0
cosθ?<0,恰好是到线段左端点的距离为点
P
P
P 到线段的距离。
如果 V ? 3 ? V ? 1 > 0 \vec V_3\cdot \vec V_1>0 V3??V1?>0,则为 ∣ V ? 3 ∣ |\vec V_3| ∣V3?∣,证明类似。
反之,则为点到直线的距离。
点在直线上的投影
用点积来求, A + V ? ( d o t V ? , p ? a ? d o t V ? , V ? ) A+\vec V (\mathrm{\frac{dot_{\vec V,\vec {p-a}}}{dot_{\vec V,\vec V}}}) A+V(dotV,V?dotV,p?a???)
与上面类似
点 P P P 是否在线段 A B AB AB 上
首先, c r o s s P ? A , P ? B = 0 \mathrm{cross_{P-A,P-B}}=0 crossP?A,P?B?=0,这样保证了 P , A , B P,A,B P,A,B 三点共线。
其次, d o t P ? A , P ? B ≤ 0 \mathrm{dot_{P-A,P-B}}\le0 dotP?A,P?B?≤0,即 cos ? θ ≤ 0 \cos_{\theta}\le0 cosθ?≤0,当 P P P 在线段上, 2 2 2 个向量相向, θ \theta θ 为 180 ° 180\degree 180°, cos ? \cos cos 为负。
判断
2
2
2 条 线段 是否相交
即判断 A 2 , B 2 A_2,B_2 A2?,B2? 是否在 A 1 B 1 A_1B_1 A1?B1? 的 2 2 2 侧,且 A 1 , B 1 A_1,B_1 A1?,B1? 在 A 2 , B 2 A_2,B_2 A2?,B2? 的 2 2 2 侧。
用叉积做即可。