浅谈平面几何

最近做题的时候由于平面几何的问题被搞得痛不欲生,于是决定来研究一下平面几何那些事儿,反正高中迟早都得学。

向量

基本概念

定义:既有大小又有方向的量称为向量,记作 a

有向线段:有方向的线段,有起点、方向、长度三要素,用于表示向量。

:有向线段 AB 的长度,记为 |AB|

零向量:模为 0 的向量,记为 00

单位向量:模为 1 的向量记为该方向上的单位向量。

平行向量:又称共线向量,方向相同或相反的向量,记为 ab

相等向量:模相等且方向相同的向量。

相反向量:模相等且方向相反的向量。

向量的夹角:已知两个非零向量 ab,作 OA=aOB=b,则 θ=AOB 就是 ab 的夹角,记作 a,b。规定 θ[0,π]。特别的,当 θ=π2 时,这两个向量垂直,记作 ab

线性运算

加法

  • 三角形法则:若向量的头尾顺次相连,则它们的和为第一个向量的起点指向最后一个向量的终点,即 AB+BC=AC
  • 平行四边形法则:若两个向量共起点,则它们的和为以这两个向量为邻边的平行四边形的对角线,起点为共起点,方向沿对角线方向。

向量加法满足交换律与结合律。

减法

共起点向量的差向量为减向量的终点指向被减向量的终点,即 ABAC=CB

数乘

实数 λ 与向量 a 的积为一个向量 λa

  1. |λa|=|λ||a|
  2. λ>0 时,λaa 同向;当 λ=0 时,λa=0;当 λ<0 时,λaa 方向相反。

满足结合律、分配律。

当存在唯一实数 λ 使得 λa=b (a,b0) 时,ab 共线。

平面向量

平面向量基本定理:若两向量 ab 不共线,则存在唯一实数对,使得与 ab 共面的任意向量 p 满足 p=xa+yb

基底:在同一平面内不共线的两个向量。

坐标表示

若取与 xy 轴方向相同的单位向量 ij 作为基底,则根据平面向量基本定理,平面上的每一个向量都唯一对应一个有序实数对 (x,y),而有序实数对 (x,y) 与平面直角坐标系上的点一一对应,那么我们作 OP=p,那么终点 P(x,y) 也是唯一对应的。由于我们研究的都是自由向量,可以自由平移起点,这样,在平面直角坐标系里,每一个向量都可以用有序实数对唯一表示。

平面向量的坐标运算

设有两个向量 x=(α,β)y=(γ,δ),则:

  • x+y=(α+γ,β+δ)
  • xy=(αγ,βδ)
  • λx=(λα,λβ)

已知两点 A(α,β)B(γ,δ),则 AB=(γα,δβ)

ABC 三点共线,则 OB=λOA+(1λ)OC

向量的叉积

又称向量积、外积、矢积。已知两向量 xy 及它们的夹角 θ,它们的叉积为 z=x×y,则

|z|=|x||y|sinθ

z 的方向垂直于 xy 所决定的平面,并遵循右手定则。z 是一个伪向量,因为在不同的坐标系中 z 可能不同,不过一般在计算时不用管它的方向,只需要计算它的模。|z| 相当于以 ab 为邻边的平行四边形的面积。

在平面向量的计算中,若 x=(α,β)y=(γ,δ),则

|x×y|=αδβγ

向量的点积

又称数量积、内积、标积。已知两向量 xy 及它们的夹角 θ,则

xy=|x||y|cosθ

其中 |x|cosθxy 方向上的投影。点积所得到的结果是一个实数。

在平面向量的运算中,若 x=(α,β)y=(γ,δ),则

xy=αγ+βδ

点积的应用如下:

  • xyxy=0,即 cosθ=0
  • xyxy=|x||y|,即 cosθ=1
  • cosθ=xy|x||y|

顺便提一嘴,若 x=(α,β),则

|x|=α2+β2

向量的旋转

a=(x,y),倾角为 θ,长度为 l=x2+y2。则 x=lcosθy=cosθ。令其逆时针旋转 α 度角,得向量

b=(lcos(θ+α),lsin(θ+α))=(l(cosθcosαsinθsinα),l(sinθcosα+cosθsinα))=(lcosθcosαlsinθsinα,lsinθcosα+lcosθsinα)=(xcosαysinα,ycosα+xsinα)

代码实现

提了那么多,还是上代码吧。

尽管叉积所得的是一个向量,但在代码中只返回了它的模。

inline int sgn(double x) { if(fabs(x)<eps) return 0; if(x<0) return -1; return 1; } struct point { double x,y; point(){} point(double _x,double _y):x(_x),y(_y){} bool operator==(point b)const{return sgn(x-b.x)==0&&sgn(y-b.y)==0;} point operator+(const point& b)const{return point(x+b.x,y+b.y);}//加法 point operator-(const point& b)const{return point(x-b.x,y-b.y);}//减法 double operator^(const point& b)const{return x*b.y-y*b.x;}//叉积 double operator*(const point& b)const{return x*b.x+y*b.y;}//点积 double len(){return hypot(x,y);}//模 double len2(){return x*x+y*y;}//模的平方 point operator*(const double& k)const{return point(x*k,y*k);}//数乘 point operator/(const double& k)const{return point(x/k,y/k);}//数除 point rorate(double alpha){return point(x*cos(alpha)-y*sin(alpha),y*cos(alpha)+x*sin(alpha));} };

前方准备

正弦定理

ABC 中,若角 ABC 所对边分别为 abc,其外接圆半径为 R,则

asinA=bsinB=csinC=2R

余弦定理

ABC 中,若角 ABC 所对边分别为 abc,则

{a2=b2+c22bccosAb2=a2+c22accosBc2=a2+b22abcosC

交点

两直线交点

至少在我的世界里 (不是mc!),直线只有一种表示方法:

f(x)=kx+b

设有两直线 f1(x)=k1x+b1f2(x)=k2x+b2,则它们的交点为 (b2b1k1k2,k1b2k2b1k1k2)

判断两线段是否有交点

首先我们要判断一些特殊情况,如平行(也就是 k 相等)或重合(kb 相等且一线段的端点在另一线段内)。

规定线段区域为以该线段为对角线,四边均平行与坐标轴的矩形。若这两条线段没有公共区域,则它们一定不相交。这叫做 快速排斥实验。我们可以初步排除一些情况。

通过快速排斥试验后,我们只需要判断一条线段的两个端点是否在另一条线段的两侧,若是,则它们有交点。这叫做 跨立实验

多边形面积

线性平面上的多边形面积

将多边形上的点逆时针标记为 P1n,再作一辅助点 O,记向量 vi=piO,则该多边形的面积为

S=12i=1n|vi×vimodn+1|

平面直角坐标系上的多边形面积

将多边形上的点逆时针标记为 P1(x1,y1)P2(x2,y2)P3(x3,y3)……Pn(xn,yn),则该多边形的面积为

S=12|i=1n(xiyimodn+1ximodn+1yi)|

皮克定理

如果该多边形是在一个网格图上,且所有的顶点都在格点上,那么令多边形内部格点数目为 a,边上的格点数目为 b,则其面积为

S=a+b21

判断一点是否在多边形内

从该点引出一条射线(不与任何边共线),若与多边形有奇数个交点,则其在多边形内,否则在多边形外。这称之为 奇内偶外,因为每次与多边形相交,就改变了其与多边形的内外关系。

极坐标系

极点:在平面上选定的一点 O

极轴:自极点引出的一条射线 Ox

正方向:在极坐标系中一般为逆时针方向。

极坐标:设 A 为平面上一点,则 |OA| 称为 极径,记为 ρ;以极轴为始边,OA 为终边的角 xOA 称为 极角,记为 θ,则 A 该平面上的坐标为有序数对 (ρ,θ)。一般规定 ρ>00θ<2π

极坐标与直角坐标的转换

假设极点为原点,极轴为 x 轴的正半轴,点 A 的极坐标为 (ρ,θ),直角坐标为 (x,y),则

{x=ρcosθy=ρsinθρ=x2+y2θ=arctanyx   (x0)

距离

欧几里得距离

在平面直角坐标系中有两点 A(x1,y1)B(x2,y2),则该两点之间的欧几里得距离为

|AB|=(x1x2)2+(y1y2)2

扩展到 n 维空间中,假设有两点 A(x1n)B(y1n),则它们之间的欧几里得距离为

AB=i=1n(xiyi)2

曼哈顿距离

在平面直角坐标系中有两点 A(x1,y1)B(x2,y2),则该两点之间的曼哈顿距离为

m(A,B)=|x1x2|+|y1y2|

这就好比曼哈顿网格状的街道上,你想从 A 点到 B 点,只能沿着道路直来直往,所能达到的最短距离。

扩展到 n 维空间中,假设有两点 A(x1n)B(y1n),则它们之间的曼哈顿距离为

m(A,B)=i=1n|xiyi|

切比雪夫距离

在平面直角坐标系中有两点 A(x1,y1)B(x2,y2),则该两点之间的切比雪夫距离为

c(A,B)=max(|x1x2|,|y1y2|)

扩展到 n 维空间中,假设有两点 A(x1n)B(y1n),则它们之间的切比雪夫距离为

c(A,B)=max{|xiyi|}   (i[1,n])

曼哈顿距离与切比雪夫距离之间的转换

将一个点 (x,y) 的坐标变为 (x+y,xy) 后,原坐标系中的曼哈顿距离变成了新坐标系中的切比雪夫距离。

将一个点 (x,y) 的坐标变为 (x+y2,xy2) 后,原坐标系中的切比雪夫距离变成了新坐标系中的曼哈顿距离。

凸包

凸多边形:所有内角都在 [0,π] 范围内的简单多边形。

简单点说,凸包就是用一个绳子把简单多边形围起来,然后勒紧所得的图形。凸包满足在围住多边形所有点的情况下周长最小。

凸包的求法:

  • 将所有点按横坐标为第一关键字,纵坐标为第二关键字进行排序。

  • 排序后最小和最大的点必定都在凸包上,因此我们用这两个点将凸包分为上凸壳和下凸壳。

  • 可以发现,如果我们从一个点逆时针出发,那么凸包边必然是全程左拐,如果右拐,就说明刚刚我们走的一段不在凸包上,需要退回去。这可以用一个单调栈维护。

  • 枚举时,我们先升序枚举求出下凸壳,再降序枚举求出上凸壳。

  • 令当前栈顶为 S1,次栈顶为 S2,枚举到的点为 P,如果需要右转才能到 P(即 S2S1×S1P<0),则弹出栈顶,回到上一步,直到可以左转或是栈只剩一个元素。

  • 设凸包上的 m 个点分别为 P1m,则整个凸包的周长为

    i=1n|PiPimodm+1|

扫描线(待填坑)

半平面交(待填坑)


__EOF__

本文作者ryanright
本文链接https://www.cnblogs.com/ryanright/p/15972479.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ryanright  阅读(429)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示