《数学计算几何》PPT课件
合集下载
计算几何PPT
β
α- β
α
/
ACM/ICPC集训队 P14
向量的运算
点积 α · β = x1×x2 + y1×y2 = |α|·|β|·cosθ 叉积 α×β = x1×y2 – x2×y1 = |α|·|β|·sinθ
β
θ
α
/
凸包的求法
卷包裹法
/
ACM/ICPC集训队 P39
凸包的求法
Graham-Scan算法
push(p1); push(p2); i = 3; while i <= n do if p1在栈顶边的左手方 向 then push(pi); 并且i++ else pop();
Q1 Q1 P2 P1 Q2 P1 P2
Q2
/
ACM/ICPC集训队 P22
向量的运算的应用
计算点到线段、直线的最近点 求点到直线的距离 求点关于直线的对称点 构造两点中垂线 ……
/
ACM/ICPC集训队 P23
ACM/ICPC集训队 P29
多边形的三角剖分
多边形的三角剖分,就是仅仅使用多边形的对角 线将多边形P拆分成多个不重叠的三角形。 通过三角剖分,我们可以将复杂的多边形转化相 对比较简单的三角形集合。
定理:对于具有n条边的多边形,不论我们使用什 么剖分方法,总是只能解剖出n-2个三角形
/ ACM/ICPC集训队 P30
/
ACM/ICPC集训队 P18
判断线段和直线是否相交
取直线上一点,连接线段的两点,如果所得的两系线段都在直线的同 一侧,则不相交。
/
ACM/ICPC集训队 P19
判断两线段是否相交
两条线段恰有惟一一个不是端点的公共点,称之 为“规范相交”。 否则称为非规范相交。
计算几何
思考如下图形:
2020/2/6
9
先看最简单的多边形——三角形
2020/2/6
10
三角形的面积:
在解析几何里, △ABC的面积可以通过 如下方法求得:
点坐标 => 边长 => 海伦公式 => 面积
2020/2/6
11
思考:此方法的缺点:
计算量大 精度损失
更好的方法?
2020/2/6
12
31
2020/2/6
32
计算几何题的特点与做题要领
1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠
。 3.要注意代码的组织,因为计算几何的题目很容易上
两百行代码,里面大部分是模板。如果代码一片混乱 ,那么会严重影响做题正确率。 4.注意精度控制。 5.能用整数的地方尽量用整数,要想到扩大数据的方 法(扩大一倍,或扩大sqrt2)。因为整数不用考虑浮 点误差,而且运算比浮点快。
2020/2/6
18
2020/2/6
19
2020/2/6
20
2020/2/6
21
2020/2/6
22
2020/2/6
23
2020/2/6
24
2020/2/6
25
2020/2/6
26
2020/2/6
27
2020/2/6
28
2020/2/6
29
2020/2/6
30
2020/2/6
形。
P3 P4
P2
P0
P1
P5 P6
设你种了很多树,想用一个篱笆把所有的
树都包在里面。出于经济考虑,这个篱笆应该是越 小越好。
几何图形(39张PPT)数学
第6章 图形的初步知识
6.1 几何图形
学习目标 1.在具体情况中认识立方体、长方体、圆柱体、圆锥体、球体,并能理解和描述它们的某些特征,进一步认识点、线、面、体,体验几何图形是怎样从实际情况中抽象出来的.2.了解几何图形、立体图形与平面图形的概念.掌握重点 认识常见几何体并能描述它们的某些特征.突破难点 体验几何图形与现实生活中图形的关系,区分立体图形与平面图形.
解
返回
解 立方体由6个面围成,它们都是平的;圆柱由3个面围成,其中有2个平的,1个曲的.解 圆柱的侧面和两个底面相交成2条线,它们都是曲的.解 立方体有8个顶点,经过每个顶点有3条线段(棱).
典例精析
例1 (教材补充例题)如图所示的图形.平面图形有_____________;立体图形有_____________.
答案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
①,②,⑥
③,④
⑤
②,③,⑤
①,④,⑥
19
13.如图是一个三棱柱,观察这个三棱柱,请回答下列问题:(1)这个三棱柱共有多少个面?(2)这个三棱柱一共有多少条棱?(3)这个三棱柱共有多少顶点?
解 这个三棱柱共有5个面.解 这个三棱柱一共有9条棱.解 这个三棱柱共有6个顶点.
C
解析 观察图形可知,其中一面、两面、三面涂色的小正方体的个数分别为x1=6,x2=12,x3=8,则x1-x2+x3=2.故选C.
1
2
3
4
5
6
7
8
9
10
11
12
计算几何优质获奖课件
0<=a<360,也能够以为是两向量旳夹角,0<=a<=180。一般用于求夹角,a = acos( (AB * CD) / (|AB| * |CD|) )。也可:|CD| * cos(a) = AB * CD / |AB|,即向 量CD在AB上旳投影。
叉积,线段相交旳鉴定
四、叉积。
叉积旳成果为一种向量。
P1
A1 P2
P6 A4
P5 A3
A2 P4
2024/9/21
P3
14
凹多边形旳面积?
依然分割成三角形 计算措施不变
注意符号,最终取绝对值
2024/9/21
15
任意点为扇心旳三角形剖分:
我们能把多边形提成N-2个三角形,为何不能提成N个三角形呢? 例如,以多边形内部旳一种点为扇心,就能够把多边形剖提成 N个三角
12
计算几何旳措施:
在计算几何里,我们懂得,△ABC旳面积就是“向量AB”和“向量 AC”两个向量叉积旳绝对值旳二分之一。其正负表达三角形顶点 是在右手系还是左手系。
B
C
A ABC成左手系,负面积
2024/9/21
C B
A ABC成右手系,正面积 13
凸多边形旳三角形剖分
很自然地,我们会想到以 P1为扇面中心,连接P1Pi就得到N-2个三角形,因为凸性,确保这 些三角形全在多边形内,那么,这个凸多边形旳有向面积: A=sigma(Ai) (i=1…N-2)
2、A在线段CD上旳充要条件:
a) 。
AC×AD = 0,几何意义,AC和AD构成旳平行四边形旳面积为0,即A、C、D三点共线
b)
A点在CD之间,A.x处于C.x和D.x之间而且A.y处于C.y和D.y之间
叉积,线段相交旳鉴定
四、叉积。
叉积旳成果为一种向量。
P1
A1 P2
P6 A4
P5 A3
A2 P4
2024/9/21
P3
14
凹多边形旳面积?
依然分割成三角形 计算措施不变
注意符号,最终取绝对值
2024/9/21
15
任意点为扇心旳三角形剖分:
我们能把多边形提成N-2个三角形,为何不能提成N个三角形呢? 例如,以多边形内部旳一种点为扇心,就能够把多边形剖提成 N个三角
12
计算几何旳措施:
在计算几何里,我们懂得,△ABC旳面积就是“向量AB”和“向量 AC”两个向量叉积旳绝对值旳二分之一。其正负表达三角形顶点 是在右手系还是左手系。
B
C
A ABC成左手系,负面积
2024/9/21
C B
A ABC成右手系,正面积 13
凸多边形旳三角形剖分
很自然地,我们会想到以 P1为扇面中心,连接P1Pi就得到N-2个三角形,因为凸性,确保这 些三角形全在多边形内,那么,这个凸多边形旳有向面积: A=sigma(Ai) (i=1…N-2)
2、A在线段CD上旳充要条件:
a) 。
AC×AD = 0,几何意义,AC和AD构成旳平行四边形旳面积为0,即A、C、D三点共线
b)
A点在CD之间,A.x处于C.x和D.x之间而且A.y处于C.y和D.y之间
《计算几何讲》课件
直角三角形任意直角边的平方等于其斜边的平方和另一直角边的平方。
2
平行线之间的距离
平行线之间的距离等于任意一点到另一平行线的垂直距离。
3
角平分线定理
角的平分线将其对边按相同比例分割。
5. 计算几何的解题策略
1 画图
将问题转化为几何图形,并标注所需信息。
2 利用定理和公式
运用已知的几何定理和公式来解题。
《计算几何讲》PPT课件
计算几何是研究几何图形的性质及其计算方法的分支学科,应用广泛于计算 机图形学、CAD、计算机辅助几何设计等领域。
1. 计算几何的定义
计算几何是研究在计算机上对几何图形及其性质进行表示、计算和处理的学 科。
2. 计算几何的应用
1 计算机图形学
用于生成和显示三维几何 图形,比如动画、游戏和 虚拟现实。
于设计和模拟工程和建 筑物,提高效率和准确性。
用于绘制几何图形、计算 测量和设计规划。
3. 计算几何的基本概念
点
几何图形的基本元素,没有大 小和方向。
线段
由两个点确定的线段,有长度 和方向。
直线
无限延伸的线段,由无数个点 确定。
4. 计算几何的相关定理
1
直角三角形的勾股定理
3 逻辑推理
通过观察几何图形的性质和关系,进行推理和解答。
6. 计算几何的实例讲解
三角形的分类
介绍三角形的分类及其特点,给 予示例演示。
内切圆和外接圆
讲解几何图形中内切圆和外接圆 的性质及应用。
平行线与角度
解释平行线与角度之间的关系及 相关定理。
7. 结论与总结
计算几何是一个有着广泛应用和丰富理论的学科,掌握计算几何的基本概念和解题策略,将有效提高问题解决 的能力。
计算几何课件
• 向量形式与解析形式的关系
•
− , − , − ⋅ , , = 0 ⟹ + + + = 0
• Dist =
− ⋅
=
+++
2 + 2 + 2
• 性质:参数表示与隐式表示;自动适用于二维
2024/3/11
• 是直线/射线上一点, 是直线/射线的方向向量
• 线段: = 1 + 2 − 1 = 1 − 1 + 2 , ∈ 0,1
• 1 , 2 分别是线段的两个端点
2024/3/11
1
Computational Geometry
2
5
点、线、面的表示
1
• 面的表示
计算几何
Computational Geometry
主讲人:x
2024 年 3 月 18 日
什么是计算几何
2024/3/11
Computational Geometry
2
什么是计算几何
• 计算几何:✗数学 ✓计算机
• 起源于 1971 年,计算机图形学 (CG) 与计算机辅助设计 (CAD) 的推动
• = + = +
2024/3/11
• =
• ≥ 0, Dist = ℎ
• 点在直线上的投影
• ⋅+
• 点 ;直线 = +
ℎ
− ⋅
2
Computational Geometry
7
线与线的位置关系 (2D)
• 共端点射线/线段的绕序
【整合】人教A版高二数学必修五三角形中的几何计算同步PPT精品课件
2.已知边角求三角形的面积: ha=bsinC=csinB hb=csinA=asinC
A
c
ha
b
hc=asinB=bsinA
B
aD C
根据以前学过的三角形面积公式SABC
=
1 2
aha
=
1 2
bhb
1 ch ,可以推导出下面的三角形面积公式: 2c
S= 1 absinC, S= 1 bcsinA,S= 1 acsinB.
另解:由正弦定理得sinAcosA=sinBcosB, 所以sin2A=sin2B, 即2A=2B, 所以A=B,
根据边的关系易得是等腰三角形. 思考:为什么两种求解方法答案不同,哪个正确? 哪个错误?为什么?
前一种解法正确. 后一种解法遗漏了一种情况;
因为sin2A=sin2B,有可能推出2A与2B两个 角互补,即2A+2B=180°,则A+B=90°.
2.三角形各种类型的判定方法. (难点)
探究点1 三角形面积公式
1.我们以前接触过的三角形的面积公式有哪些?
在ABC中,边BC,CA,AB上的高
A
分别记为ha ,hb ,hc,则有
SABC =
1 2
aha =
1 2
bhb
1 ch 2c
c
hc
b
hb
ha
B
aD C
思考:如何用已知边和角表示三角形的面积?
第3课时 三角形中的几何计算
在△ABC中,边BC,CA,AB上的高分别记为 ha,hb,hc,那么它们如何用已知边和角表示?
ha=bsinC=csinB hb=csinA=asiБайду номын сангаасC hc=asinB=bsinA
第六章计算几何学.ppt
• 设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ) 。矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 )。矢量加法的几何意义是以向量 P、Q为邻边的平行四边形的对角线
Q
P+Q Q
P O
图8-2 两个矢量
P
O
图8-3 矢量加法的几何意义
矢量减法定义为: P − Q = ( x1 − x2 , y1 − y2 )
int inside_polygon(point p,int n,point *pt){ //设多边形有n个顶点,pt是顶点数组
point p1; int i=0,count; while (i<n){ //随机取一个足够远的点p1
p1.x=rand()+offset,p1.y=rand()+offset; //以p为始点、p1为终点作射线L;
return (fabs(area)-OnEdge(n,p))/2+1; }
6.2 基本算法
1.判断线段和直线是否相交 2.判断矩形是否包含点 3.判断线段、折线、多边形是否在矩形中 4.判断矩形M1是否在矩形M2中 5.判断圆是否在矩形中 6.判断点是否在多边形中 7.判断线段是否在多边形内 8.判断折线是否在多边形内 9.判断多边形是否在多边形内 10.判断矩形是否在多边形内 11.判断圆是否在多边形内 12.判断点是否在圆内 13.判断线段、折线、矩形、多边形是否在圆内 14.判断圆是否在圆内
=0 O、A、B共线
<0 OB在OA的顺时针方向 叉积符合右手法则(通过正负号,判断两矢量的顺逆关系)
3、任意三点A、B、C组成的向量AB、AC的叉积
新人教版七年级数学上册课件:几何计算(共18张PPT)
长度.
解:(1)因为AC=6 cm,M是AC的中点, 1 所以AM=MC= AC=3(cm). 2 因为MB=10 cm,所以BC=MB-MC=10-3=7(cm), 1 1 因为N为BC的中点,所以CN= BC= ×7=3.5(cm). 2 2 所以MN=MC+CN=3+3.5=6.5(cm).
1 1 所以DC= AC= BC=4(cm), 2 2
所以DB=DC+CB=4+8=12(cm).
2. 如图3-2-4,AD= DB,E是BC的中点,BE= cm. (1)求AB的长; (2)求DE的长.1 4源自1 21 4 AC=4
解:(1)因为BE= AC=4 cm,所以AC=16(cm). 又因为E是BC的中点,所以BC=2BE=2×4=8(cm). 所以AB=AC-BC=16-8=8(cm),即AB的长为8 cm. (2)因为AD= cm,则BD=2x cm. 8 因为AD+BD=AB,所以x+2x=8,解得x= 3 . 16 所以BD= 3(cm). 28 16 所以DE=DB+BE= 3 +4= (cm). 3 28 即DE的长为 cm.
4. 已知:如图3-2-8,∠AOB是直角,ON是∠AOC的 平分线,OM是∠BOC的平分线. ∠BOM或∠COM ; (1)图中与∠AOM互余的角是_________________ (2)若∠AOC=40°,求∠MON的大小; (3)当锐角∠AOC的大小发生改变时,∠MON的大小 是否发生改变?为什么?
解:(2)因为∠AOB是直角,∠AOC=40°, 所以∠AOB+∠AOC=90°+40°=130°. 因为OM是∠BOC的平分线, ON是∠AOC的平分线, 1 1 所以∠MOC= 2 ∠BOC=65°,∠NOC= 2∠AOC=20°. 所以∠MON=∠MOC-∠NOC=65°-20°=45°. (3)当锐角∠AOC的大小发生改变时,∠MON的大小 不发生改变.理由如下: 1 1 因为∠MON=∠MOC -∠NOC= 2∠BOC- 2 ∠AOC= 1 1 (∠BOC-∠AOC)= 2 ∠AOB. 2 1 又因为∠AOB是直角,所以∠MON= 2 ∠AOB=45°.
《数学计算几何》PPT课件
7
4.折线段的拐向判断: 折线段的拐向判断方法可以直接由矢 量叉积的性质推出。对于有公共端点的线 段p0p1和p1p2,通过计算(p2 - p0) × (p1 p0)的符号便可以确定折线段的拐向: 若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1 点拐向右侧后得到p1p2。 若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1 点拐向左侧后得到p1p2。 若(p2 - p0) × (p1 - p0) = 0,则p0、p1、 p2三点共线。
13
7.判断线段和直线是否相交: 有了上面的基础,这个算法就很容易 了。如果线段P1P2和直线Q1Q2相交,则 P1P2跨立Q1Q2,即:( P1 - Q1 ) × ( Q2 Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。
14
8.判断矩形是否包含点:
只要判断。
20
13.判断线段是否在多边形内: 线段在多边形内的一个必要条件是线段的两 个端点都在多边形内,但由于多边形可能为凹, 所以这不能成为判断的充分条件。如果线段和多 边形的某条边内交(两线段内交是指两线段相交 且交点不在两线段的端点),因为多边形的边的 左右两侧分属多边形内外不同部分,所以线段一 定会有一部分在多边形外(见图a)。于是我们得到 线段在多边形内的第二个必要条件:线段和多边 形的所有边都不内交。 线段和多边形交于线段的两端点并不会影响 线段是否在多边形内;但是如果多边形的某个顶 点和线段相交,还必须判断两相邻交点之间的线 段是否包含于多边形内部。
§计算几何
1
一、引言
计算机的出现使得很多原本十分繁琐的工作 得以大幅度简化,但是也有一些在人们直观 看来很容易的问题却需要拿出一套并不简单 的通用解决方案,比如几何问题。 作为计算机科学的一个分支,计算几何主要 研究解决几何问题的算法。在现代工程和数 学领域,计算几何在图形学、机器人技术、 超大规模集成电路设计和统计等诸多领域有 着十分重要的应用。
4.折线段的拐向判断: 折线段的拐向判断方法可以直接由矢 量叉积的性质推出。对于有公共端点的线 段p0p1和p1p2,通过计算(p2 - p0) × (p1 p0)的符号便可以确定折线段的拐向: 若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1 点拐向右侧后得到p1p2。 若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1 点拐向左侧后得到p1p2。 若(p2 - p0) × (p1 - p0) = 0,则p0、p1、 p2三点共线。
13
7.判断线段和直线是否相交: 有了上面的基础,这个算法就很容易 了。如果线段P1P2和直线Q1Q2相交,则 P1P2跨立Q1Q2,即:( P1 - Q1 ) × ( Q2 Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。
14
8.判断矩形是否包含点:
只要判断。
20
13.判断线段是否在多边形内: 线段在多边形内的一个必要条件是线段的两 个端点都在多边形内,但由于多边形可能为凹, 所以这不能成为判断的充分条件。如果线段和多 边形的某条边内交(两线段内交是指两线段相交 且交点不在两线段的端点),因为多边形的边的 左右两侧分属多边形内外不同部分,所以线段一 定会有一部分在多边形外(见图a)。于是我们得到 线段在多边形内的第二个必要条件:线段和多边 形的所有边都不内交。 线段和多边形交于线段的两端点并不会影响 线段是否在多边形内;但是如果多边形的某个顶 点和线段相交,还必须判断两相邻交点之间的线 段是否包含于多边形内部。
§计算几何
1
一、引言
计算机的出现使得很多原本十分繁琐的工作 得以大幅度简化,但是也有一些在人们直观 看来很容易的问题却需要拿出一套并不简单 的通用解决方案,比如几何问题。 作为计算机科学的一个分支,计算几何主要 研究解决几何问题的算法。在现代工程和数 学领域,计算几何在图形学、机器人技术、 超大规模集成电路设计和统计等诸多领域有 着十分重要的应用。
计算几何基础1030-精品文档71页
P3 P2
P4
P0
P1
P5 P6
28 26.11.2019
前面的三角剖分显然对于多边形内 部任意一点都是合适的!
我们可以得到: A=sigma(Ai) ( i=1…N )
即 A= ∣ ∣/2 :
sigma
Xi – X0
Yi –Y0
X(i+1) – X0 Y(i+1) –Y0
( i=1…N )
29 26.11.2019
ACM 程序设计
计算机学院 刘春英周…
2 26.11.2019
每周一星(4):
06057229 许璟亮
3 26.11.2019
第五讲 计算几何初步
(Computational Geometry Basic)
4 26.11.2019
第一单元
线段属性
5 26.11.2019
37 26.11.2019
公式:
C=sigma(Ai * Ci) / A (i=1…N) Ci=Centroid(△ O Pi Pi+1)
= (O + ↑Pi +↑Pi+1 )/3
C=sigma((↑Pi +↑Pi+1)(↑Pi ×↑Pi+1) ) /(6A)
38 26.11.2019
全部搞 定!
39 26.11.2019
第三单元
凸包( Convex Hull )
40 26.11.2019
41 26.11.2019
42 26.11.2019
43 26.11.2019
44 26.11.2019
45 26.11.2019
46 26.11.2019
2019教育年秋人教版七年级数学上册课件:专题二 几何计算(共18张PPT)精品英语
【例2】 如图3-2-3,点C在线段AB上,AC=6 cm, MB=10 cm,点M,N分别为AC,BC的中点. (1)求线段BC,MN的长; (2)若点C在线段AB的延长线上,且满足ACBC=b cm,M,N分别是线段AC,BC的中点,求MN的 长度.
解:(1)因为AC=6 cm,M是AC的中点,
NC= 1
BC.因为AC-BC=b
2 cm,所以MN=MC-NC=
1
AC-
1 21
1
2
2 BC= 2(AC-BC)= 2 b(cm).
考点二:角的计算
【例3】如图3-2-5,直线AB,CD相交于点O,OA平分
∠EOC.(1)若∠EOC=70°,求∠BOD的度数;
(2)若∠EOC∶∠EOD=2∶3,求∠BOD的度数.
6.如图3-2-10,直线AB与CD相交于点O,射线OF,OD 分别是∠AOE,∠BOE的角平分线. (1)请写出∠EOF的所有余角:_∠__E_O_D_,_∠__B_O_D_,_∠__A_O_C_; (2)请写出∠DOE的所有补角:_∠__C_O_E_,_∠__C_O_B_,_∠__A_O_D_; (3)若∠AOC=16∠FOB,求∠COE的度数. 解:(3)设∠AOC=x,则∠FOB=6x. 因为∠BOD=∠AOC=x,∠BOF-∠BOD= ∠FOD=90°,所以6x-x=90°, 解得x=18°.所以∠BOF=6x=108°. 所以∠AOF=180°-108°=72°. 所以∠COE=2∠AOF+∠AOC=2×72°+18°=162°.
解:设∠BOE=x,则∠DOE= 所以∠BOD=∠BOE+∠EOD= 4
1 3
x.
x,
∠AOD=180°-∠BOD=180°3 -
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共线,但是因为已 经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。
所以判断P1P2跨立Q1Q2的依据是:( P1 Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。同理判断Q1Q2跨立P1P2的依据是: ( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 P1 ) >= 0。
9.判断线段、折线、多边形是否在矩形中:
因为矩形是个凸集,所以只要判断所有端点是 否都在矩形中就可以了。
15
10.判断矩形是否在矩形中: 只要比较左右边界和上下边界就可以 了。 11.判断圆是否在矩形中: 很容易证明,圆在矩形中的充要条件 是:圆心在矩形中且圆的半径小于等于圆 心到矩形四边的距离的最小值。
12
#include<iostream> #include<stdio.h> using namespace std; const int Max = 110; struct Point { double x, y; }; struct Segment { Point s, e; }; Segment s[Max]; double product(Point &a, Point &b, Point &c) { double x1, y1, x2, y2; x1 = a.x - c.x, y1 = a.y - c.y; x2 = b.x - c.x, y2 = b.y - c.y; return x1 * y2 - y1 * x2; }
28.三角形、多边形面积的计算 29. 凸包
4
三、算法介绍
1.矢量的概念:
如果一条线段的端点是有次序之分的,我们把 这种线段称为有向线段(directed segment)。 如果有向线段p1p2的起点p1在坐标原点,我们 可以把它称为矢量(vector)p2。
5
2.矢量加减法:
设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢 量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ); 同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P,P - Q = ( Q - P )。
18
为了统一起见,我们在计算射线L和多边形的交点的时候, 1、对于多边形的水平边不作考虑;2、对于多边形的顶点 和L相交的情况,如果该顶点是其所属的边上纵坐标较大 的顶点,则计数,否则忽略;3、对于P在多边形边上的情 形,直接可判断P属于多边行。 由此得出算法的伪代码如下:
count ← 0; 以P为端点,作从右向左的射线L; for 多边形的每条边s do if P在边s上 then return true; if s不是水平的 then if s的一个端点在L上 if 该端点是s两端点中纵坐标较大的端点 then count ← count+1 else if s和L相交 then count ← count+1; if count mod 2 = 1 then return true; else return false;
6
3.矢量叉积: 计算矢量叉积是与直线和线段相关算法的核 心部分。设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则 矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的 平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。一般在 不加说明的情况下,本文下述算法中所有的点都 看作矢量,两点的加减法就是矢量相加减,而点 的乘法则看作矢量叉积。 叉积的一个非常重要性质是可以通过它的符 号判断两矢量相互之间的顺逆时针关系: 若 P × Q > 0 , 则P在Q的顺时针方向。 若 P × Q < 0 , 则P在Q的逆时针方向。 若 P × Q = 0 , 则P与Q共线,但可能同向也可 能反向。
11
HDOJ 1086 You can Solve a Geometry Problem too 线段相交问题 两条线段相交也就意味着一个线段的两个端 点跨立另一条线段的两侧。于是向量叉积的 几何意义便得到了运用。如果两个点P1,P2 在一条线段Q1Q2两侧,那么向量 P1Q1*P1Q2必然和P2Q1*P2Q2异号,或者其 中一者为零,那么P1, P2必然在线段Q1Q2 的两侧。在判断Q1Q2是否在P1P2的两侧便 可判断两线段是否相交。
16
12.判断点是否在多边形中:
判断点P是否在多边形中是计算几何中一个非 常基本但是十分重要的算法。以点P为端点,向左 方作射线L,由于多边形是有界的,所以射线L的 左端一定在多边形外,考虑沿着L从无穷远处开始 自左向右移动,遇到和多边形的第一个交点的时 候,进入到了多边形的内部,遇到第二个交点的 时候,离开了多边形,……所以很容易看出当L和 多边形的交点数目C是奇数的时候,P在多边形内, 是偶数的话P在多边形外。
19
//杭电1756 //判断点是否在任意多边形内 //原模板适用于x y坐标为正数的情况,如需应用,需修改B点横坐标位置,使其相对无限 远 #include<iostream> using namespace std; struct point //建立point结构体,浮点型成员 x y { double x; double y; }; point p[200],A,B; //建立point 数组,和两个point 对象 A B int m,n,i; //定义三个整型变量 m n i double min_x,min_y,max_x,max_y; //定义四个浮点型变量,用于储存临时数据(如比较大小) double max(double,double); //声明取最大值函数 double min(double,double); //声明去最小值函数 double cross(point,point,point); //声明计算叉积函数 bool In_squre(); //声明计算点是否在多边形内的函数(布尔型) int main(void) { while(cin>>n) //输入 n 代表多边形顶点个数 {
8
5.判断点是否线段上: 设点为Q,线段为P1P2 ,判断点Q在该线段上的依据 是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2为对角顶 点的矩形内。前者保证Q点在直线P1P2上,后者是保证Q 点不在线段P1P2的延长线或反向延长线上,对于这一步骤 的判断可以用以下过程实现: ON-SEGMENT(pi,pj,pk) if min(xi,xj) <= xk <= max(xi,xj) and min(yi,yj) <= yk <= max(yi,yj) then return true; else return false; 特别要注意的是,由于需要考虑水平线段和垂直线段 两种特殊情况,min(xi,xj)<=xk<=max(xi,xj)和 min(yi,yj)<=yk<=max(yi,yj)两个条件必须同时满足才能返 回真值。
20
13.判断线段是否在多边形内: 线段在多边形内的一个必要条件是线段的两 个端点都在多边形内,但由于多边形可能为凹, 所以这不能成为判断的充分条件。如果线段和多 边形的某条边内交(两线段内交是指两线段相交 且交点不在两线段的端点),因为多边形的边的 左右两侧分属多边形内外不同部分,所以线段一 定会有一部分在多边形外(见图a)。于是我们得到 线段在多边形内的第二个必要条件:线段和多边 形的所有边都不内交。 线段和多边形交于线段的两端点并不会影响 线段是否在多边形内;但是如果多边形的某个顶 点和线段相交,还必须判断两相邻交点之间的线 段是否包含于多边形内部。
3
15. 判断多边形是否在多边形内 16. 判断矩形是否在多边形内 17. 判断圆是否在多边形内 18. 判断点是否在圆内 19. 判断线段、折线、矩形、多边形是否在圆内 20. 判断圆是否在圆内 21. 计算点到线段的最近点 22. 计算点到折线、矩形、多边形的最近点 23. 计算点到圆的最近距离及交点坐标 24. 计算两条共线的线段的交点 25. 计算线段或直线与线段的交点 26. 求线段或直线与折线、矩形、多边形的交点 27. 求线段或直线与圆的交点
7
4.折线段的拐向判断: 折线段的拐向判断方法可以直接由矢 量叉积的性质推出。对于有公共端点的线 段p0p1和p1p2,通过计算(p2 - p0) × (p1 p0)的符号便可以确定折线段的拐向: 若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1 点拐向右侧后得到p1p2。 若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1 点拐向左侧后得到p1p2。 若(p2 - p0) × (p1 - p0) = 0,则p0、p1、 p2三点共线。
2
二、目录
计算几何基本概念和常用算法包括如下内容: 1. 矢量的概念 2. 矢量加减法 3. 矢量叉积 4. 折线段的拐向判断 5. 判断点是否在线段上 6. 判断两线段是否相交 7. 判断线段和直线是否相交 8. 判断矩形是否包含点 9. 判断线段、折线、多边形是否在矩形中 10. 判断矩形是否在矩形中 11. 判断圆是否在矩形中 12. 判断点是否在多边形中 13. 判断线段是否在多边形内 14. 判断折线是否在多边形内
当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共线,但是因为已 经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。
所以判断P1P2跨立Q1Q2的依据是:( P1 Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。同理判断Q1Q2跨立P1P2的依据是: ( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 P1 ) >= 0。
9.判断线段、折线、多边形是否在矩形中:
因为矩形是个凸集,所以只要判断所有端点是 否都在矩形中就可以了。
15
10.判断矩形是否在矩形中: 只要比较左右边界和上下边界就可以 了。 11.判断圆是否在矩形中: 很容易证明,圆在矩形中的充要条件 是:圆心在矩形中且圆的半径小于等于圆 心到矩形四边的距离的最小值。
12
#include<iostream> #include<stdio.h> using namespace std; const int Max = 110; struct Point { double x, y; }; struct Segment { Point s, e; }; Segment s[Max]; double product(Point &a, Point &b, Point &c) { double x1, y1, x2, y2; x1 = a.x - c.x, y1 = a.y - c.y; x2 = b.x - c.x, y2 = b.y - c.y; return x1 * y2 - y1 * x2; }
28.三角形、多边形面积的计算 29. 凸包
4
三、算法介绍
1.矢量的概念:
如果一条线段的端点是有次序之分的,我们把 这种线段称为有向线段(directed segment)。 如果有向线段p1p2的起点p1在坐标原点,我们 可以把它称为矢量(vector)p2。
5
2.矢量加减法:
设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢 量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ); 同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P,P - Q = ( Q - P )。
18
为了统一起见,我们在计算射线L和多边形的交点的时候, 1、对于多边形的水平边不作考虑;2、对于多边形的顶点 和L相交的情况,如果该顶点是其所属的边上纵坐标较大 的顶点,则计数,否则忽略;3、对于P在多边形边上的情 形,直接可判断P属于多边行。 由此得出算法的伪代码如下:
count ← 0; 以P为端点,作从右向左的射线L; for 多边形的每条边s do if P在边s上 then return true; if s不是水平的 then if s的一个端点在L上 if 该端点是s两端点中纵坐标较大的端点 then count ← count+1 else if s和L相交 then count ← count+1; if count mod 2 = 1 then return true; else return false;
6
3.矢量叉积: 计算矢量叉积是与直线和线段相关算法的核 心部分。设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则 矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的 平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。一般在 不加说明的情况下,本文下述算法中所有的点都 看作矢量,两点的加减法就是矢量相加减,而点 的乘法则看作矢量叉积。 叉积的一个非常重要性质是可以通过它的符 号判断两矢量相互之间的顺逆时针关系: 若 P × Q > 0 , 则P在Q的顺时针方向。 若 P × Q < 0 , 则P在Q的逆时针方向。 若 P × Q = 0 , 则P与Q共线,但可能同向也可 能反向。
11
HDOJ 1086 You can Solve a Geometry Problem too 线段相交问题 两条线段相交也就意味着一个线段的两个端 点跨立另一条线段的两侧。于是向量叉积的 几何意义便得到了运用。如果两个点P1,P2 在一条线段Q1Q2两侧,那么向量 P1Q1*P1Q2必然和P2Q1*P2Q2异号,或者其 中一者为零,那么P1, P2必然在线段Q1Q2 的两侧。在判断Q1Q2是否在P1P2的两侧便 可判断两线段是否相交。
16
12.判断点是否在多边形中:
判断点P是否在多边形中是计算几何中一个非 常基本但是十分重要的算法。以点P为端点,向左 方作射线L,由于多边形是有界的,所以射线L的 左端一定在多边形外,考虑沿着L从无穷远处开始 自左向右移动,遇到和多边形的第一个交点的时 候,进入到了多边形的内部,遇到第二个交点的 时候,离开了多边形,……所以很容易看出当L和 多边形的交点数目C是奇数的时候,P在多边形内, 是偶数的话P在多边形外。
19
//杭电1756 //判断点是否在任意多边形内 //原模板适用于x y坐标为正数的情况,如需应用,需修改B点横坐标位置,使其相对无限 远 #include<iostream> using namespace std; struct point //建立point结构体,浮点型成员 x y { double x; double y; }; point p[200],A,B; //建立point 数组,和两个point 对象 A B int m,n,i; //定义三个整型变量 m n i double min_x,min_y,max_x,max_y; //定义四个浮点型变量,用于储存临时数据(如比较大小) double max(double,double); //声明取最大值函数 double min(double,double); //声明去最小值函数 double cross(point,point,point); //声明计算叉积函数 bool In_squre(); //声明计算点是否在多边形内的函数(布尔型) int main(void) { while(cin>>n) //输入 n 代表多边形顶点个数 {
8
5.判断点是否线段上: 设点为Q,线段为P1P2 ,判断点Q在该线段上的依据 是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2为对角顶 点的矩形内。前者保证Q点在直线P1P2上,后者是保证Q 点不在线段P1P2的延长线或反向延长线上,对于这一步骤 的判断可以用以下过程实现: ON-SEGMENT(pi,pj,pk) if min(xi,xj) <= xk <= max(xi,xj) and min(yi,yj) <= yk <= max(yi,yj) then return true; else return false; 特别要注意的是,由于需要考虑水平线段和垂直线段 两种特殊情况,min(xi,xj)<=xk<=max(xi,xj)和 min(yi,yj)<=yk<=max(yi,yj)两个条件必须同时满足才能返 回真值。
20
13.判断线段是否在多边形内: 线段在多边形内的一个必要条件是线段的两 个端点都在多边形内,但由于多边形可能为凹, 所以这不能成为判断的充分条件。如果线段和多 边形的某条边内交(两线段内交是指两线段相交 且交点不在两线段的端点),因为多边形的边的 左右两侧分属多边形内外不同部分,所以线段一 定会有一部分在多边形外(见图a)。于是我们得到 线段在多边形内的第二个必要条件:线段和多边 形的所有边都不内交。 线段和多边形交于线段的两端点并不会影响 线段是否在多边形内;但是如果多边形的某个顶 点和线段相交,还必须判断两相邻交点之间的线 段是否包含于多边形内部。
3
15. 判断多边形是否在多边形内 16. 判断矩形是否在多边形内 17. 判断圆是否在多边形内 18. 判断点是否在圆内 19. 判断线段、折线、矩形、多边形是否在圆内 20. 判断圆是否在圆内 21. 计算点到线段的最近点 22. 计算点到折线、矩形、多边形的最近点 23. 计算点到圆的最近距离及交点坐标 24. 计算两条共线的线段的交点 25. 计算线段或直线与线段的交点 26. 求线段或直线与折线、矩形、多边形的交点 27. 求线段或直线与圆的交点
7
4.折线段的拐向判断: 折线段的拐向判断方法可以直接由矢 量叉积的性质推出。对于有公共端点的线 段p0p1和p1p2,通过计算(p2 - p0) × (p1 p0)的符号便可以确定折线段的拐向: 若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1 点拐向右侧后得到p1p2。 若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1 点拐向左侧后得到p1p2。 若(p2 - p0) × (p1 - p0) = 0,则p0、p1、 p2三点共线。
2
二、目录
计算几何基本概念和常用算法包括如下内容: 1. 矢量的概念 2. 矢量加减法 3. 矢量叉积 4. 折线段的拐向判断 5. 判断点是否在线段上 6. 判断两线段是否相交 7. 判断线段和直线是否相交 8. 判断矩形是否包含点 9. 判断线段、折线、多边形是否在矩形中 10. 判断矩形是否在矩形中 11. 判断圆是否在矩形中 12. 判断点是否在多边形中 13. 判断线段是否在多边形内 14. 判断折线是否在多边形内