计算几何初步
前置知识#
前置知识点#
-
-
余弦定理
浮点数的比较#
const double eps = 1e-8;
int sign(double x) // 符号函数
{
if (fabs(x) < eps) return 0;
if (x < 0) return -1;
return 1;
}
int cmp(double x, double y) // 比较函数
{
if (fabs(x - y) < eps) return 0;
if (x < y) return -1;
return 1;
}
向量#
向量的加减法和数乘运算
内积(点积)
-
几何意义:向量A在向量B上的投影与B的长度的乘积。
-
代码实现。
double dot(Point a, Point b)
{
return a.x * b.x + a.y * b.y;
}
外积(叉积)
-
几何意义:向量A与B张成的平行四边形的有向面积。B在A的逆时针方向为正。
-
代码实现
double cross(Point a, Point b)
{
return a.x * b.y - b.x * a.y;
}
常用函数
- 取模
double get_length(Point a)
{
return sqrt(dot(a, a));
}
- 计算向量夹角
double get_angle(Point a, Point b)
{
return acos(dot(a, b) / get_length(a) / get_length(b));
}
- 计算两个向量构成的平行四边形有向面积
double area(Point a, Point b, Point c)
{
return cross(b - a, c - a);
}
- 向量A顺时针旋转C的角度:
Point rotate(Point a, double angle)
{
return Point(a.x * cos(angle) + a.y * sin(angle), -a.x * sin(angle) + a.y * cos(angle));
}
点与线#
直线定理
- 一般式
- 点向式
- 斜截式
常用操作
-
判断点在直线上
-
两直线相交
// cross(v, w) == 0则两直线平行或者重合
Point get_line_intersection(Point p, Vector v, Point q, vector w)
{
vector u = p - q;
double t = cross(w, u) / cross(v, w);
return p + v * t;
}
- 点到直线的距离
double distance_to_line(Point p, Point a, Point b)
{
vector v1 = b - a, v2 = p - a;
return fabs(cross(v1, v2) / get_length(v1));
}
- 点到线段的距离
double distance_to_segment(Point p, Point a, Point b)
{
if (a == b) return get_length(p - a);
Vector v1 = b - a, v2 = p - a, v3 = p - b;
if (sign(dot(v1, v2)) < 0) return get_length(v2);
if (sign(dot(v1, v3)) > 0) return get_length(v3);
return distance_to_line(p, a, b);
}
- 点在直线上的投影
Point get_line_projection(Point p, Point a, Point b)
{
Vector v = b - a;
return a + v * (dot(v, p - a) / dot(v, v));
}
- 点是否在线段上
bool on_segment(Point p, Point a, Point b)
{
return sign(cross(p - a, p - b)) == 0 && sign(dot(p - a, p - b)) <= 0;
}
- 判断两线段是否相交
bool segment_intersection(Point a1, Point a2, Point b1, Point b2)
{
double c1 = cross(a2 - a1, b1 - a1), c2 = cross(a2 - a1, b2 - a1);
double c3 = cross(b2 - b1, a2 - b1), c4 = cross(b2 - b1, a1 - b1);
return sign(c1) * sign(c2) <= 0 && sign(c3) * sign(c4) <= 0;
}
多边形#
三角形
面积
-
叉积
-
海伦公式
三角形四心
-
外心:外三边中垂线交点。到三角形三个顶点的距离相等
-
内心:内角平分线交点,到三边距离相等
-
垂心:三条垂线交点
-
重心:三条中线交点(到三角形三顶点距离的平方和最小的点,三角形内到三边距离之积最大的点)
普通多边形
通常按逆时针存储所有点
- 定义
-
多边形:由在同一平面且不再同一直线上的多条线段首尾顺次连接且不相交所组成的图形叫多边形。
-
简单多边形:简单多边形是除相邻边外其它边不相交的多边形。
-
凸多边形:过多边形的任意一边做一条直线,如果其他各个顶点都在这条直线的同侧,则把这个多边形叫做凸多边形。
任意凸多边形外角和均为
。任意凸多边形内角和为
。
- 常用函数
-
求多边形面积(不一定是凸多边形)
我们可以从第一个顶点除法把凸多边形分成n − 2个三角形,然后把面积加起来。
double polygon_area(Point p[], int n)
{
double s = 0;
for (int i = 1; i + 1 < n; i ++ )
s += cross(p[i] - p[0], p[i + 1] - p[i]);
return s / 2;
}
-
判断点是否在多边形内(不一定是凸多边形)
a. 射线法,从该点任意做一条和所有边都不平行的射线。交点个数为偶数,则在多边形外,为奇数,则在多边形内。
b. 转角法
-
判断点是否在凸多边形内
只需判断点是否在所有边的左边(逆时针存储多边形)。
皮克定理
皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式该公式可以表示为:
其中
三维几何#
-
三维向量表示
。 -
向量加减法、数乘运算,与二维相同。
-
模长
。 -
点积
- 几何意义:
。 - 代数求解:
。
- 几何意义:
-
叉积
- 几何意义:
,方向:右手定则。 - 代数求解:
。
- 几何意义:
-
如何求平面法向量
任取平面上两个不共线的向量
: 。几何意义:垂直于此平面的向量。
-
判断点
是否在平面里任取平面上两个不共线的向量
:先求法向量 ,然后求平面上任意一点到 的向量 与 的点积,判断点积是否为 。 -
求点
到平面的距离任取平面上两个不共线的向量
:先求法向量 。然后求平面上任意一点到 的向量 在 上的投影长度即可。即: 。 -
多面体欧拉定理
。
作者:JiaY19
出处:https://www.cnblogs.com/JiaY19/p/16687634.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)