当前位置: 首页 > news >正文

【模板】计算几何入门

来源

计算几何基本模板(二维)

目录

  • 基本设置
  • 点 + 向量
    • Point(Vector)
    • 点积(数量积、内积)
    • 向量积,叉积
    • 两点间距离
    • 向量的模
    • 单位向量
    • 两向量的夹角
    • 判断点在直线的哪边
    • 逆转角
  • 线
    • 直线表达式
    • Line
    • 判断三点共线
    • 点到直线的距离
    • 点到线段的距离
    • 判断点是否在线段上
    • 判断直线与线段是否相交
    • 判断两线段是否相交
    • 判断两直线平行
    • 求两直线交点
  • 多边形
    • 三角形面积
    • 三角形四心
    • 正弦定理 & 余弦定理
    • 正多边形性质
    • 求多边形面积
    • 判断点在多边形内
    • 判断凸多边形
    • Circle
    • 扇形面积
    • 点与圆位置关系
    • 直线与圆位置关系
    • 直线与圆交点
    • 圆与圆位置关系
    • 圆与圆交点
    • 求圆的切点
    • 三角形外接圆
    • 三角形内切圆
  • 网格
    • 线段整点个数
    • 多边形边整点个数
    • 多边形内整点个数
  • 极角排序
  • 凸包算法
  • 最小圆覆盖
  • 圆的面积并
  • 圆与多边形面积交
  • 自适应辛普森积分
  • 平面最近点对

基本设置

  • 使用long double提高精度
  • 定义常数eps=1e-8PI=acos(-1.0)
  • 实现sgn()函数处理浮点数精度判断

点 + 向量

Point(Vector)

struct Point { /*...*/ };
  • 包含坐标(x,y)和运算符重载

点积(Dot)

A ⃗ ⋅ B ⃗ = ∣ A ∣ ∣ B ∣ cos ⁡ θ \vec{A} \cdot \vec{B} = |A||B|\cos\theta A B =A∣∣Bcosθ

double operator*(Vector &A, Vector &B);

叉积(Cross)

A ⃗ × B ⃗ = ∣ A ∣ ∣ B ∣ sin ⁡ θ \vec{A} \times \vec{B} = |A||B|\sin\theta A ×B =A∣∣Bsinθ

double operator^(Vector &A, Vector &B);

两点间距离

d i s t ( A , B ) = ( A . x − B . x ) 2 + ( A . y − B . y ) 2 dist(A,B) = \sqrt{(A.x-B.x)^2 + (A.y-B.y)^2} dist(A,B)=(A.xB.x)2+(A.yB.y)2

向量模长

∣ A ∣ = A . x 2 + A . y 2 |A| = \sqrt{A.x^2 + A.y^2} A=A.x2+A.y2

单位向量

n o r m ( A ) = A ∣ A ∣ norm(A) = \frac{A}{|A|} norm(A)=AA

向量夹角

θ = arccos ⁡ ( A ⋅ B ∣ A ∣ ∣ B ∣ ) \theta = \arccos(\frac{A \cdot B}{|A||B|}) θ=arccos(A∣∣BAB)

点关于直线的位置判断

  • 使用叉积判断点在线段的左右关系

向量旋转

A ⃗ ′ = ( x cos ⁡ θ − y sin ⁡ θ , x sin ⁡ θ + y cos ⁡ θ ) \vec{A}' = (x\cos\theta - y\sin\theta, x\sin\theta + y\cos\theta) A =(xcosθysinθ,xsinθ+ycosθ)

线

直线表达式

  • 一般式: A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0
  • 点向式: P ⃗ = P 0 + t d ⃗ \vec{P} = P_0 + t\vec{d} P =P0+td

Line结构体

struct Line { Point s, e; };

三点共线判断

( B − A ) × ( C − B ) = 0 (B-A) \times (C-B) = 0 (BA)×(CB)=0

点到直线距离

d = ∣ A B ⃗ × A P ⃗ ∣ ∣ A B ∣ d = \frac{|\vec{AB} \times \vec{AP}|}{|AB|} d=ABAB ×AP

点到线段距离

  • 分三种情况:垂直投影在线段内/外

点在线段上判断

  • 通过点积和叉积综合判断

直线与线段相交判断

  • 利用叉积符号判断端点位置

线段相交判断

  1. 快速排斥试验
  2. 跨立试验

直线交点求解

t = ( C D ⃗ × C A ⃗ ) ( C D ⃗ × A B ⃗ ) t = \frac{(\vec{CD} \times \vec{CA})}{(\vec{CD} \times \vec{AB})} t=(CD ×AB )(CD ×CA )

多边形

三角形面积

  • 海伦公式
  • 叉积公式: 1 2 ∣ A B ⃗ × A C ⃗ ∣ \frac{1}{2}|\vec{AB} \times \vec{AC}| 21AB ×AC

多边形面积

  • 鞋带定理: 1 2 ∣ ∑ i = 0 n − 1 ( P i × P i + 1 ) ∣ \frac{1}{2}|\sum_{i=0}^{n-1}(P_i \times P_{i+1})| 21i=0n1(Pi×Pi+1)

点在多边形内判断

  • 射线法统计交点奇偶性
  • 凸多边形方向法

凸包求解(Andrew算法)

  1. 按坐标排序
  2. 维护上下凸壳

圆与点位置关系

  • 计算点到圆心距离与半径比较

直线与圆相交

  • 代数法解方程组求交点

圆与圆相交

  • 计算圆心距与半径关系

最小圆覆盖

  • 随机增量法逐步扩展

网格相关

线段整点计数

  • 利用GCD计算格点数

皮克定理

S = I + B 2 − 1 S = I + \frac{B}{2} - 1 S=I+2B1

高级算法

极角排序

  • 分象限处理,避免浮点误差

自适应辛普森积分

  • 自动划分区间积分

平面最近点对

  • 分治法结合归并排序

相关文章:

  • Vue 表单输入绑定,双向绑定
  • 基于 intellij-platform-plugin-template 开发IDEA插件注意事项
  • form 表单内容序列化成一个字符串
  • 大模型架构记录2 【综述-相关代码】
  • 数据服务赋能数据治理:从“One Service”到QuickAPI的演进
  • redis操作
  • 【搜索】dfs(回溯、剪枝、记忆化)
  • 【C++】类和对象(二)默认成员函数之构造函数、析构函数
  • Springboot集成Debezium监听postgresql变更
  • CQL学习
  • 游戏引擎学习第177天
  • 996引擎-接口测试:背包
  • pnpm 报错 Error: Cannot find matching keyid 解决
  • Mybatis的基础操作——03
  • 西交建筑学本科秋天毕业想转码,自学了Python+408,华为OD社招还是考研更香?
  • 第十四章:模板实例化_《C++ Templates》notes
  • 如何编写SLURM系统的GRES资源插件
  • Lustre 语言的 Rust 生成相关的工作
  • Autosar OS配置-Timing Protection配置及实现--基于ETAS工具
  • 题单:精挑细选
  • 英国传统两党受挫地方选举后反思,改革党异军突起“突破想象”
  • “名额5分钟抢完”,一场花费上万元:越野赛凭什么这么火?
  • 解放日报:硬科企业由此迈出“市场第一步”
  • 屠呦呦当选美国国家科学院外籍院士
  • 解放日报:持续拿出排头兵姿态先行者担当
  • 宋徽宗《芙蓉锦鸡图》亮相,故宫首展历代动物绘画