关于若干基础的几何问题

总结一下简单的关于点、线、圆之间的几何关系,涉及到向量、点积、叉积等之类的概念。由于很多需要公式表示,所以本文撰写起来稍显困难。

1、点与线的位置关系

问题

【模板】点线位置关系 牛客网

判断:

  1. 点 C 在向量 A B → 左侧 1. \text{点 } C \text{ 在向量 } \overrightarrow{AB} \text{ 左侧} 1.点 C 在向量 AB 左侧
  2. 点 C 在向量 A B → 右侧 2. \text{点 } C \text{ 在向量 } \overrightarrow{AB} \text{ 右侧} 2.点 C 在向量 AB 右侧

解决方法

如果 A B → × A C → > 0 \overrightarrow{AB}×\overrightarrow{AC}>0 AB ×AC >0,说明 点 C 在向量 A B → 左侧 \text{点 } C \text{ 在向量 } \overrightarrow{AB} \text{ 左侧} 点 C 在向量 AB 左侧

如果 A B → × A C → < 0 \overrightarrow{AB}×\overrightarrow{AC}<0 AB ×AC <0,说明 点 C 在向量 A B → 右侧 \text{点 } C \text{ 在向量 } \overrightarrow{AB} \text{右侧} 点 C 在向量 AB 右侧

这个时候涉及到叉积运算" × × ×",下面简单说明一下

∗ ^* ∗叉积运算

首先,叉积运算是有方向的,故 a × b a×b a×b和 b × a b×a b×a的结果是不一样的

对于二维叉积:

设 A ( x a , y a ) A(x_a,y_a) A(xa,ya), B ( x b , y b ) B(x_b,y_b) B(xb,yb), C ( x c , y c ) C(x_c,y_c) C(xc,yc)

则 A B → \overrightarrow{AB} AB = ( x b − x a , y b − y a ) (x_b-x_a,y_b-y_a) (xb−xa,yb−ya), A C → \overrightarrow{AC} AC = ( x c − x a , y c − y a ) (x_c-x_a,y_c-y_a) (xc−xa,yc−ya)

A B → × A C → = ( x b − x a ) ( y c − y a ) − ( y b − y a ) ( x c − x a ) \overrightarrow{AB}×\overrightarrow{AC}=(x_b-x_a)(y_c-y_a)-(y_b-y_a)(x_c-x_a) AB ×AC =(xb−xa)(yc−ya)−(yb−ya)(xc−xa)

对于三维叉积:
对于三维向量 a ⃗ = ( a 1 , a 2 , a 3 ) ,    b ⃗ = ( b 1 , b 2 , b 3 ) ,    叉积的行列式表示为: \text{对于三维向量 } \vec{a} = (a_1, a_2, a_3),\; \vec{b} = (b_1, b_2, b_3),\; \text{叉积的行列式表示为:} 对于三维向量 a =(a1,a2,a3),b =(b1,b2,b3),叉积的行列式表示为:

a ⃗ × b ⃗ = ∣ i ⃗ j ⃗ k ⃗ a 1 a 2 a 3 b 1 b 2 b 3 ∣ = ( a 2 b 3 − a 3 b 2 , − ( a 1 b 3 − a 3 b 1 ) , a 1 b 2 − a 2 b 1 ) \vec{a} \times \vec{b} = \begin{vmatrix} \vec{i} & \vec{j} & \vec{k} \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \end{vmatrix} =(a_2b_3-a_3b_2,-(a_1b_3-a_3b_1),a_1b_2-a_2b_1) a ×b = i a1b1j a2b2k a3b3 =(a2b3−a3b2,−(a1b3−a3b1),a1b2−a2b1)

2、点线最近距离

问题

【模板】点线最近距离_牛客网

1.点-直线最近点:输出点 C ( x c , y c ) C(x_c,y_c) C(xc,yc)到直线 A B AB AB的最近点

2.点-直线最近距离:输出点 C C C到直线 A B AB AB 的最近距离

解决方法

设有两个基础向量 A B → \overrightarrow{AB} AB , A C → \overrightarrow{AC} AC , 用这个图看一下:

点到直线/线段核心公式

1. 基础向量定义

A B → = ( x B − x A , y B − y A ) , A C → = ( x C − x A , y C − y A ) \overrightarrow{AB} = (x_B - x_A,\ y_B - y_A),\quad \overrightarrow{AC} = (x_C - x_A,\ y_C - y_A) AB =(xB−xA, yB−yA),AC =(xC−xA, yC−yA)

2. 投影比例(核心)

t = A C → ⋅ A B → ∣ A B → ∣ 2 = ( x C − x A ) ( x B − x A ) + ( y C − y A ) ( y B − y A ) ( x B − x A ) 2 + ( y B − y A ) 2 t = \frac{\overrightarrow{AC} \cdot \overrightarrow{AB}}{|\overrightarrow{AB}|^2} = \frac{(x_C-x_A)(x_B-x_A) + (y_C-y_A)(y_B-y_A)}{(x_B-x_A)^2 + (y_B-y_A)^2} t=∣AB ∣2AC ⋅AB =(xB−xA)2+(yB−yA)2(xC−xA)(xB−xA)+(yC−yA)(yB−yA)

3. 线段场景的投影修正

t ′ = max ⁡ ( 0 , min ⁡ ( 1 , t ) ) t' = \max\left(0,\ \min\left(1,\ t\right)\right) t′=max(0, min(1, t))

4. 最近点 P 坐标

P = ( x A + t ′ ⋅ ( x B − x A ) , y A + t ′ ⋅ ( y B − y A ) ) P = \left(x_A + t' \cdot (x_B-x_A),\ y_A + t' \cdot (y_B-y_A)\right) P=(xA+t′⋅(xB−xA), yA+t′⋅(yB−yA))

5. 点到直线的距离

距离直线 = ∣ ( x B − x A ) ( y C − y A ) − ( y B − y A ) ( x C − x A ) ∣ ( x B − x A ) 2 + ( y B − y A ) 2 \text{距离直线} = \frac{|(x_B-x_A)(y_C-y_A) - (y_B-y_A)(x_C-x_A)|}{\sqrt{(x_B-x_A)^2 + (y_B-y_A)^2}} 距离直线=(xB−xA)2+(yB−yA)2 ∣(xB−xA)(yC−yA)−(yB−yA)(xC−xA)∣

6. 点到线段的距离

距离线段 = ( x P − x C ) 2 + ( y P − y C ) 2 \text{距离线段} = \sqrt{(x_P - x_C)^2 + (y_P - y_C)^2} 距离线段=(xP−xC)2+(yP−yC)2


点到圆的切点问题

问题

【模板】点圆位置关系_牛客网

判断:

  • 点与圆的位置关系
  • 如果点在圆的外面,求点到圆的两个切点

位置关系判断

计算点 A 到圆心 O 的距离平方 d i s t = ( x A − x O ) 2 + ( y A − y O ) 2 dist=(x_A−x_O)^2+(y_A−y_O)^2 dist=(xA−xO)2+(yA−yO)2,与半径平方 r 2 r^2 r2比较:

  • 若 d i s t < r 2 dist<r2 dist<r2:点在圆内,输出 1
  • 若 d i s t = r 2 dist=r^2 dist=r2:点在圆上,输出 2
  • 若 d i s t > r 2 dist>r^2 dist>r2:点在圆外,计算并输出两个切点。

切点坐标推导

设 O A = ( d x , d y ) = ( x A − x O , y A − y O ) OA=(dx,dy)=(x_A−x_O,y_A−y_O) OA=(dx,dy)=(xA−xO,yA−yO),点 A 到圆心的距离为 d = d i s t d=dist d=dist。

利用几何关系(切点与圆心的连线垂直于切点与点 A 的连线),推导得切点公式:

  • k = r 2 dist k = \dfrac{r^2}{\text{dist}} k=distr2(向量 O A → \overrightarrow{OA} OA 向圆内缩放的比例);

  • t = r ⋅ dist − r 2 dist t = \dfrac{r \cdot \sqrt{\text{dist} - r^2}}{\text{dist}} t=distr⋅dist−r2 (垂直方向的偏移比例); -

  • 切点 P 1 = ( x O + d x ⋅ k − d y ⋅ t , y O + d y ⋅ k + d x ⋅ t ) P_1 = \left(x_O + dx \cdot k - dy \cdot t,\ y_O + dy \cdot k + dx \cdot t\right) P1=(xO+dx⋅k−dy⋅t, yO+dy⋅k+dx⋅t)

    • 切点 P 2 = ( x O + d x ⋅ k + d y ⋅ t , y O + d y ⋅ k − d x ⋅ t ) P_2 = \left(x_O + dx \cdot k + dy \cdot t,\ y_O + dy \cdot k - dx \cdot t\right) P2=(xO+dx⋅k+dy⋅t, yO+dy⋅k−dx⋅t)。

最开始看到这些题的时候都以为很简单,但其实都涉及到一些简单但没见过的计算几何的,这里一并总结。

相关推荐
毅炼2 小时前
Netty 常见问题总结
java·网络·数据结构·算法·哈希算法
Anastasiozzzz2 小时前
leetcodehot100--最小栈 MinStack
java·javascript·算法
曦月逸霜2 小时前
深入理解计算机系统——学习笔记(持续更新~)
笔记·学习·计算机系统
历程里程碑2 小时前
双指针2--盛水最多的容器
大数据·数据结构·算法·leetcode·elasticsearch·搜索引擎·散列表
hetao17338372 小时前
2026-01-22~23 hetao1733837 的刷题笔记
c++·笔记·算法
我的xiaodoujiao2 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 43--添加allure测试报告显示信息和其他封装方法
python·学习·测试工具·allure
风筝在晴天搁浅2 小时前
hot100 230.二叉搜索树中第K小的元素
数据结构·算法
curry____3032 小时前
数据结构学习笔记
数据结构·笔记·学习
宫瑾2 小时前
【C语言】嵌入式C加强学习
java·c语言·学习