(lecture_05)计算几何基础_20090316
计算几何学

x1,x2 另一种定义: op1 × op2 =det y1,y2
= x1y2 – x2y1 x2,x1 = -det y2,y1 = - op2 × op1
p2(x2,y2) p(x1+x2,y1+y2)
α
O(0,0) p1(x1,y1)
3
右手法则可快速判断两个平面向量叉积的方向,继而判断两 个向量的相对位置关系。
计算几何学
朱成名 2014/4/18
大纲
计算几何的基本工具 叉积
点积
线段方面的问题
计算几何的常见问题
凸包方面的问题 最远/近点对问题
总结
2
计算几何的基本工具
叉积(向量积) 已知有向线段 op1 =(x1,y1),op2 =(x2,y2). op1 和 op2 的叉积为: op1 × op2 = op1 × op2 ×sin(α)。 几何意义:是以 op1和 op2为边的平行四边形的有向面积。
e d c b
设一序列T,当线段的左端点遇到 扫除线时,线段就按交点的y值递减 的插入到序列T中, 当其右端点遇 到扫除线时离开序列T。
11
对每条线段端点按x坐标从小到大排序,若x相同,左端点 放在右端点前,同属左或者右,按y值递增排序。 算法只能判断是否相交,不能求交点个数! for每个 3 c O(nlogn) 端点p
1
a
7 4
b
6
8
左端点
右端点 判断它的上下 相邻元素是否 相交
2 a y a c b a b 不 不 相 相 交 交 c a b 不 相 交
5 c b d 不 相 交
d
将线段插入T中
T 序 列
c b d 相 交
判断是否与其 相邻元素相交
计算几何初步

矢量的叉乘
矢量积的一般含义:两个矢量a 和b的矢量积是一 个矢量,记作a×b,其模等于由a 和b作成的平 行四边形的面积,方向与平行四边形所在平面垂 直,当站在这个方向观察时,a 逆时针转过一个 小于π的角到达 b 的方向。这个方向也可以用物 理上的右手螺旋定则判断:右手四指弯向由 A 转 到B 的方向(转过的角小于π),拇指指向的就 是矢量积的方向。
给定两个矢量: 和 ,对它们的公共端点P0 来说,判断 是否在 的顺时针方向。
如图,把 P0作为原点,得出向量P1’=P1-P0和 P2’=P2-P0,因此,这两个向量的叉积为(p1p0)×(p2-p0)= (x1-x0)(y2-y0)-(x2-x0)(y1-y0),如果该 叉积为正,则 在 的顺时针方向,如果为 负,则 在 的逆时针方向。如果等于 0, 则 P0,P1,P2三点共线。
探讨另一个重要问题
给定两个矢量 和 ,确定它们在点P1是向 左转还是向右转,即∠P0P1P2的转向。也就是说 确定连续线段是向左转还是向右转。
矢量的旋转
矢量的旋转:实际应用中,经常需要从一个矢量 转到另一个矢量,这个过程称为矢量的旋转,旋 转的方向由叉积判定。很多例子都用到矢量的旋 转这个方法和相应特性。
计算几何的内容及特点
矢量 基本算法 二维凸包 半平面交 最小圆覆盖 三维凸包 旋转卡壳 …..
代码量大 特殊情况多 精度问题难以控制 ……
需要注意的问题
不可直接判断相等(即使是那些看起来似乎“显 然”没有精度问题的值)
尽量只用加/减法和乘法,避免除法,尤其避免除 以一个很小的数
a的长度或模。记作a|。
夹角:两个非0矢量a、b,在空间任取一点O,
计算几何与图形学的数学基础

计算几何与图形学的数学基础计算几何与图形学是数学领域中涉及几何形状、图形和其它与空间相关概念的分支。
它们提供了许多重要的数学基础和理论,对于解决实际问题、工程应用以及计算机图形学的发展都具有重要意义。
本文将介绍计算几何与图形学的一些数学基础。
一、点、线、面的几何性质计算几何与图形学研究的对象主要是点、线、面以及它们之间的关系和性质。
在几何学中,点是没有大小和形状的,用来描述位置;线是由无数点构成,是长度无限延伸的物体;面是由无数线构成的,是二维的,有面积的物体。
这些基本的几何要素有着特定的性质和运算规则,在计算几何与图形学中扮演着重要的角色。
二、向量和坐标系向量是计算几何与图形学中的重要概念,它可以表示空间中的方向和大小。
向量常用于描述点之间的位置关系和线段的方向。
在计算几何中,向量可以进行加法、减法和数乘等运算,这些运算有助于解决几何问题。
坐标系是用来标定点的位置的一种方法。
二维空间中常使用直角坐标系,通过横纵坐标来确定点的位置;三维空间则使用三维直角坐标系,通过三个坐标轴来确定点在空间中的位置,坐标轴互相垂直。
三、曲线和曲面在计算几何与图形学中,曲线和曲面是常见的几何对象。
曲线可以由参数方程或者隐式方程来描述,比如常见的直线、圆形、椭圆等;曲面是由参数方程或隐式方程描述的,如球面、圆柱面、锥面等。
曲线和曲面的性质和形状可以通过不同的数学工具和方法进行分析和计算。
四、投影与变换投影是计算几何中重要的概念之一,它描述了物体在不同角度和位置下在平面上的映射。
常见的投影包括平行投影和透视投影。
平行投影是指物体投影到平行于观察方向的平面上,透视投影则考虑了物体与观察者之间的距离和角度。
变换是计算几何与图形学中的关键技术之一,它包括平移、旋转、缩放和扭曲等操作,可以改变几何对象的形状和位置。
五、计算几何与图形学的应用计算几何与图形学的数学基础被广泛应用于众多领域。
在工程领域,它们被用于建筑设计、机械制造和飞行器设计等方面,帮助人们解决实际问题。
计算几何优质获奖课件

叉积,线段相交旳鉴定
四、叉积。
叉积旳成果为一种向量。
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.1 判断线段相交和求交点坐 标
判断线段相交和求线段交点是解决 几何问题的基础和基本手段
这两个操作在几何问题中大量应用
而判断线段是否相交是更常见的问 题,在很多情况下只是判断线段是否 相交,而不是求其交点
2.3.2 线段的规范相交和非规范 相交
(1)
(2)
(3)
(4)
(5)
(1)是规范相交,其它是非规范相交。非规范相交 的情况还有很多。通常只考虑规范相交
第11章 计算几何
1. 计算几何概述 2. 计算几何的基本问题 3. 凸包及其应用 4. 求线段集的两两交点
1. 计算几何概述
在计算机图形学、图形用户接口、可视化技术、计算机辅 助设计、模式识别等领域,需要快速的几何算法
解析几何是一个选择。解析几何把所有的几何问题转换成 纯粹的代数问题,而代数问题是可以用计算机解决的
2.6.1 多边形面积的计算公式
N 2
S S p1 pi1 pi2
P1 P6
i 1
N2 1
xi1 x1
i1 2 xi2 x1
yi1 y1 yi2 y1
N2 1 i1 2
x1 xi1 xi2
y1 1 yi1 1 yi2 1
P2 P3
2.4.2 多边形分类
如果多边形任意两条不相邻的边没有公共交点,则称这个多边 形为简单多边形;否则称为复杂多边形
但一类特殊的复杂多边形称为临界多边形,在性质上更接近于 简单多边形
P1
P7
P6
P2 P5
P4
P3
简单多边形
P4 P1
P3
P2
复杂多边形
P4 P2
P3
计算几何初步

三角函数相关
三角函数大家都知道,这些在C++(C)语言里面是怎么实现的呢? 这些函数都在cmath(math.h)头文件里面,原型如下: sin(ang),cos(ang),tan(ang):三角函数,返回三角函数值;(ang是 double型,代表角的弧度;); asin(double d):反正弦,返回值为角度,范围[-PI/2, PI/2]; acos(double d):范围[0,PI]; atan(double d)范围[-PI/2,PI/2]; atan2(y,x):返回向量(x,y)的极角,也就是与x轴正方向的夹角,范 围是[-PI,PI]; PI的表示:const double PI = acos(-1);
点到直线的距离: 用叉积求非常简单(就
是求三角形的高)
点到线段的距离: 如果投影点在线段内部
则是到投影点的距离(也就是点到直线的距 离),否则就是到两端点中较近的一点的距 离。怎么判断投影点是否在线段内部呢,利 用神奇的点积。。。
点到直线的投影点: 怎么求投影点呢,
利用点积的几何意义就很容易得到了,还 记得点积的几何意义吗?利用几何意义可 以得到直线上一点到已知点的向量在直线 上投影,然后就能找到投影点啦!非常简 单吧!!
三角形面积:a×b/2,是有方向的,三角形面积是求多边形面积的基础
旋转:一个向量或者点(x,y)围绕原点逆时针旋转rad弧度角,得到的点是 (x*cos(rad)-y*sin(rad), x*sin(rad)+y*cos(rad))(转化极坐标去推导);
相关模板见最后
点、直线、线段相关的操作
线段规范相交: 先给出线段规范相交的
计算几何课件

• 向量形式与解析形式的关系
•
− , − , − ⋅ , , = 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)
• 共端点射线/线段的绕序
计算几何

【转】常用几何算法概论常用几何算法概论一引言计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法在现代工程和数学领域,计算几何在图形学机器人技术超大规模集成电路设计和统计等诸多领域有着十分重要的应用在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助二目录本文整理的计算几何基本概念和常用算法包括如下内容:矢量的概念矢量加减法矢量叉积折线段的拐向判断判断点是否在线段上判断两线段是否相交判断线段和直线是否相交判断矩形是否包含点判断线段折线多边形是否在矩形中判断矩形是否在矩形中判断圆是否在矩形中判断点是否在多边形中判断线段是否在多边形内判断折线是否在多边形内判断多边形是否在多边形内判断矩形是否在多边形内判断圆是否在多边形内判断点是否在圆内判断线段折线矩形多边形是否在圆内判断圆是否在圆内计算点到线段的最近点计算点到折线矩形多边形的最近点计算点到圆的最近距离及交点坐标计算两条共线的线段的交点计算线段或直线与线段的交点求线段或直线与折线矩形多边形的交点求线段或直线与圆的交点凸包的概念凸包的求法三算法介绍矢量的概念:如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2矢量叉积:计算矢量叉积是与直线和线段相关算法的核心部分设矢量P = (x1,y1) ,Q = (x2,y2),则矢量叉积定义为由(0,0)p1p2和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共线,但可能同向也可能反向折线段的拐向判断:折线段的拐向判断方法可以直接由矢量叉积的性质推出对于有公共端点的线段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,则p0p1p2三点共线具体情况可参照下图:判断点是否在线段上:设点为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)两个条件必须同时满足才能返回真值判断两线段是否相交:我们分两步确定两条线段是否相交:(1)快速排斥试验设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交(2)跨立试验如果两线段相交,则两线段必然相互跨立对方若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0上式可改写成( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0当( 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具体情况如下图所示:在相同的原理下,对此算法的具体的实现细节可能会与此有所不同,除了这种过程外,大家也可以参考算法导论上的实现判断线段和直线是否相交:有了上面的基础,这个算法就很容易了如果线段P1P2和直线Q1Q2相交,则P1P2跨立Q1Q2,即:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0判断矩形是否包含点:只要判断该点的横坐标和纵坐标是否夹在矩形的左右边和上下边之间判断线段折线多边形是否在矩形中:因为矩形是个凸集,所以只要判断所有端点是否都在矩形中就可以了判断矩形是否在矩形中:只要比较左右边界和上下边界就可以了判断圆是否在矩形中:很容易证明,圆在矩形中的充要条件是:圆心在矩形中且圆的半径小于等于圆心到矩形四边的距离的最小值判断点是否在多边形中:判断点P是否在多边形中是计算几何中一个非常基本但是十分重要的算法以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外,考虑沿着L从无穷远处开始自左向右移动,遇到和多边形的第一个交点的时候,进入到了多边形的内部,遇到第二个交点的时候,离开了多边形,所以很容易看出当L和多边形的交点数目C是奇数的时候,P在多边形内,是偶数的话P在多边形外但是有些特殊情况要加以考虑如图下图(a)(b)(c)(d)所示在图(a)中,L和多边形的顶点相交,这时候交点只能计算一个;在图(b)中,L和多边形顶点的交点不应被计算;在图(c)和(d) 中,L和多边形的一条边重合,这条边应该被忽略不计如果L和多边形的一条边重合,这条边应该被忽略不计为了统一起见,我们在计算射线L和多边形的交点的时候,1对于多边形的水平边不作考虑;2对于多边形的顶点和L相交的情况,如果该顶点是其所属的边上纵坐标较大的顶点,则计数,否则忽略;3对于P 在多边形边上的情形,直接可判断P属于多边行由此得出算法的伪代码如下:count 0;以P为端点,作从右向左的射线L;for 多边形的每条边sdo if P在边s上then return true;if s不是水平的then if s的一个端点在L上if 该端点是s两端点中纵坐标较大的端点then count count+1else if s和L相交then count count+1;if count mod 2 = 1then return true;else return false;其中做射线L的方法是:设P'的纵坐标和P相同,横坐标为正无穷大(很大的一个正数),则P和P'就确定了射线L判断点是否在多边形中的这个算法的时间复杂度为O(n)另外还有一种算法是用带符号的三角形面积之和与多边形面积进行比较,这种算法由于使用浮点数运算所以会带来一定误差,不推荐大家使用判断线段是否在多边形内:线段在多边形内的一个必要条件是线段的两个端点都在多边形内,但由于多边形可能为凹,所以这不能成为判断的充分条件如果线段和多边形的某条边内交(两线段内交是指两线段相交且交点不在两线段的端点),因为多边形的边的左右两侧分属多边形内外不同部分,所以线段一定会有一部分在多边形外(见图a)于是我们得到线段在多边形内的第二个必要条件:线段和多边形的所有边都不内交线段和多边形交于线段的两端点并不会影响线段是否在多边形内;但是如果多边形的某个顶点和线段相交,还必须判断两相邻交点之间的线段是否包含于多边形内部(反例见图b)因此我们可以先求出所有和线段相交的多边形的顶点,然后按照X-Y坐标排序(X坐标小的排在前面,对于X坐标相同的点,Y坐标小的排在前面,这种排序准则也是为了保证水平和垂直情况的判断正确),这样相邻的两个点就是在线段上相邻的两交点,如果任意相邻两点的中点也在多边形内,则该线段一定在多边形内证明如下:命题1:如果线段和多边形的两相邻交点P1 ,P2的中点P' 也在多边形内,则P1, P2之间的所有点都在多边形内证明:假设P1,P2之间含有不在多边形内的点,不妨设该点为Q,在P1, P'之间,因为多边形是闭合曲线,所以其内外部之间有界,而P1属于多边行内部,Q属于多边性外部,P'属于多边性内部,P1-Q-P'完全连续,所以P1Q和QP'一定跨越多边形的边界,因此在P1,P'之间至少还有两个该线段和多边形的交点,这和P1P2是相邻两交点矛盾,故命题成立证毕由命题1直接可得出推论:推论2:设多边形和线段PQ的交点依次为P1,P2,Pn,其中Pi和Pi+1是相邻两交点,线段PQ在多边形内的充要条件是:P,Q在多边形内且对于i =1, 2,, n-1,Pi ,Pi+1的中点也在多边形内在实际编程中,没有必要计算所有的交点,首先应判断线段和多边形的边是否内交,倘若线段和多边形的某条边内交则线段一定在多边形外;如果线段和多边形的每一条边都不内交,则线段和多边形的交点一定是线段的端点或者多边形的顶点,只要判断点是否在线段上就可以了至此我们得出算法如下:if 线端PQ的端点不都在多边形内then return false;点集pointSet初始化为空;for 多边形的每条边sdo if 线段的某个端点在s上then 将该端点加入pointSet;else if s的某个端点在线段PQ上then 将该端点加入pointSet;else if s和线段PQ相交 // 这时候已经可以肯定是内交了then return false;将pointSet中的点按照X-Y坐标排序;for pointSet中每两个相邻点 pointSet[i] , pointSet[ i+1]do if pointSet[i] , pointSet[ i+1] 的中点不在多边形中then return false;return true;这个过程中的排序因为交点数目肯定远小于多边形的顶点数目n,所以最多是常数级的复杂度,几乎可以忽略不计因此算法的时间复杂度也是O(n)判断折线是否在多边形内:只要判断折线的每条线段是否都在多边形内即可设折线有m条线段,多边形有n个顶点,则该算法的时间复杂度为O(m*n)判断多边形是否在多边形内:只要判断多边形的每条边是否都在多边形内即可判断一个有m个顶点的多边形是否在一个有n个顶点的多边形内复杂度为O(m*n)判断矩形是否在多边形内:将矩形转化为多边形,然后再判断是否在多边形内判断圆是否在多边形内:只要计算圆心到多边形的每条边的最短距离,如果该距离大于等于圆半径则该圆在多边形内计算圆心到多边形每条边最短距离的算法在后文阐述判断点是否在圆内:计算圆心到该点的距离,如果小于等于半径则该点在圆内判断线段折线矩形多边形是否在圆内:因为圆是凸集,所以只要判断是否每个顶点都在圆内即可判断圆是否在圆内:设两圆为O1,O2,半径分别为r1, r2,要判断O2是否在O1内先比较r1,r2的大小,如果r1<r2则O2不可能在O1内;否则如果两圆心的距离大于r1 - r2 ,则O2不在O1内;否则O2在O1内计算点到线段的最近点:如果该线段平行于X轴(Y轴),则过点point作该线段所在直线的垂线,垂足很容易求得,然后计算出垂足,如果垂足在线段上则返回垂足,否则返回离垂足近的端点;如果该线段不平行于X轴也不平行于Y轴,则斜率存在且不为0设线段的两端点为pt1和pt2,斜率为:k = ( pt2.y - pt1. y ) / (pt2.x -pt1.x );该直线方程为:y = k* ( x - pt1.x) + pt1.y其垂线的斜率为 - 1 / k,垂线方程为:y = (-1/k) * (x - point.x) + point.y联立两直线方程解得:x = ( k^2 * pt1.x + k * (point.y - pt1.y ) + point.x ) / ( k^2 + 1) ,y = k * ( x - pt1.x) + pt1.y;然后再判断垂足是否在线段上,如果在线段上则返回垂足;如果不在则计算两端点到垂足的距离,选择距离垂足较近的端点返回计算点到折线矩形多边形的最近点:只要分别计算点到每条线段的最近点,记录最近距离,取其中最近距离最小的点即可计算点到圆的最近距离及交点坐标:如果该点在圆心,因为圆心到圆周任一点的距离相等,返回UNDEFINED连接点P和圆心O,如果PO平行于X轴,则根据P在O的左边还是右边计算出最近点的横坐标为centerPoint.x - radius 或 centerPoint.x + radius如果PO平行于Y轴,则根据P在O的上边还是下边计算出最近点的纵坐标为 centerPoint.y -+radius或 centerPoint.y - radius如果PO不平行于X轴和Y 轴,则PO的斜率存在且不为0,这时直线PO斜率为k = ( P.y - O.y )/ ( P.x - O.x )直线PO的方程为:y = k * ( x - P.x) + P.y设圆方程为:(x - O.x ) ^2 + ( y - O.y ) ^2 = r ^2,联立两方程组可以解出直线PO和圆的交点,取其中离P点较近的交点即可计算两条共线的线段的交点:对于两条共线的线段,它们之间的位置关系有下图所示的几种情况图(a)中两条线段没有交点;图 (b) 和 (d) 中两条线段有无穷焦点;图 (c) 中两条线段有一个交点设line1是两条线段中较长的一条,line2是较短的一条,如果line1包含了line2的两个端点,则是图(d)的情况,两线段有无穷交点;如果line1只包含line2的一个端点,那么如果line1的某个端点等于被line1包含的line2的那个端点,则是图(c)的情况,这时两线段只有一个交点,否则就是图(b)的情况,两线段也是有无穷的交点;如果line1不包含line2的任何端点,则是图(a)的情况,这时两线段没有交点计算线段或直线与线段的交点:设一条线段为L0 = P1P2,另一条线段或直线为L1 = Q1Q2 ,要计算的就是L0和L1的交点1.首先判断L0和L1是否相交(方法已在前文讨论过),如果不相交则没有交点,否则说明L0和L1一定有交点,下面就将L0和L1都看作直线来考虑2. 如果P1和P2横坐标相同,即L0平行于Y轴a) 若L1也平行于Y轴,i. 若P1的纵坐标和Q1的纵坐标相同,说明L0和L1共线,假如L1是直线的话他们有无穷的交点,假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);ii. 否则说明L0和L1平行,他们没有交点;b) 若L1不平行于Y轴,则交点横坐标为P1的横坐标,代入到L1的直线方程中可以计算出交点纵坐标;3. 如果P1和P2横坐标不同,但是Q1和Q2横坐标相同,即L1平行于Y轴,则交点横坐标为Q1的横坐标,代入到L0的直线方程中可以计算出交点纵坐标;4. 如果P1和P2纵坐标相同,即L0平行于X轴a) 若L1也平行于X轴,i. 若P1的横坐标和Q1的横坐标相同,说明L0和L1共线,假如L1是直线的话他们有无穷的交点,假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);ii. 否则说明L0和L1平行,他们没有交点;b) 若L1不平行于X轴,则交点纵坐标为P1的纵坐标,代入到L1的直线方程中可以计算出交点横坐标;5. 如果P1和P2纵坐标不同,但是Q1和Q2纵坐标相同,即L1平行于X轴,则交点纵坐标为Q1的纵坐标,代入到L0的直线方程中可以计算出交点横坐标;6.剩下的情况就是L1和L0的斜率均存在且不为0的情况a) 计算出L0的斜率K0,L1的斜率K1 ;b) 如果K1 = K2i. 如果Q1在L0上,则说明L0和L1共线,假如L1是直线的话有无穷交点,假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);ii. 如果Q1不在L0上,则说明L0和L1平行,他们没有交点c) 联立两直线的方程组可以解出交点来这个算法并不复杂,但是要分情况讨论清楚,尤其是当两条线段共线的情况需要单独考虑,所以在前文将求两条共线线段的算法单独写出来另外,一开始就先利用矢量叉乘判断线段与线段(或直线)是否相交,如果结果是相交,那么在后面就可以将线段全部看作直线来考虑需要注意的是,我们可以将直线或线段方程改写为ax+by+c=0的形式,这样一来上述过程的部分步骤可以合并,缩短了代码长度,但是由于先要求出参数,这种算法将花费更多的时间求线段或直线与折线矩形多边形的交点:分别求与每条边的交点即可求线段或直线与圆的交点:设圆心为O,圆半径为r,直线(或线段)L上的两点为P1,P21. 如果L是线段且P1,P2都包含在圆O内,则没有交点;否则进行下一步2. 如果L平行于Y轴,a) 计算圆心到L的距离dis;b) 如果dis > r 则L和圆没有交点;c) 利用勾股定理,可以求出两交点坐标,但要注意考虑L和圆的相切情况3. 如果L平行于X轴,做法与L平行于Y轴的情况类似;4. 如果L既不平行X轴也不平行Y轴,可以求出L的斜率K,然后列出L的点斜式方程,和圆方程联立即可求解出L和圆的两个交点;5. 如果L是线段,对于2,3,4中求出的交点还要分别判断是否属于该线段的范围内凸包的概念:点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内下图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包凸包的求法:现在已经证明了凸包算法的时间复杂度下界是O(n*logn),但是当凸包的顶点数h也被考虑进去的话,Krikpatrick和Seidel的剪枝搜索算法可以达到O(n*logh),在渐进意义下达到最优最常用的凸包算法是Graham扫描法和Jarvis步进法本文只简单介绍一下Graham扫描法,其正确性的证明和Jarvis步进法的过程大家可以参考算法导论对于一个有三个或以上点的点集Q,Graham扫描法的过程如下:令p0为Q中Y-X坐标排序下最小的点设<p1,p2,...pm>为对其余点按以p0为中心的极角逆时针排序所得的点集(如果有多个点有相同的极角,除了距p0最远的点外全部移除压p0进栈S压p1进栈S压p2进栈Sfor i 3 to mdo while 由S的栈顶元素的下一个元素S的栈顶元素以及pi构成的折线段不拐向左侧对S弹栈压pi进栈Sreturn S;此过程执行后,栈S由底至顶的元素就是Q的凸包顶点按逆时针排列的点序列需要注意的是,我们对点按极角逆时针排序时,并不需要真正求出极角,只需要求出任意两点的次序就可以了而这个步骤可以用前述的矢量叉积性质实现四结语尽管人类对几何学的研究从古代起便没有中断过,但是具体到借助计算机来解决几何问题的研究,还只是停留在一个初级阶段,无论从应用领域还是发展前景来看,计算几何学都值得我们认真学习加以运用,希望这篇文章能带你走进这个丰富多彩的世界。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五讲
计算几何初步
(Computational Geometry Basic)
2011-5-2
2
第一单元
线段属性
2011-5-2 3
P0p1是否在p0p2的顺时针方向上?
P0p1和p1p2在p1点向是向左转还是向右转?
P1p2和p3p4是否相交?
2011-5-2
4
叉积——线段算法的中心 可把叉积定义为以下行列式
凸多边形的三角形剖分
很自然地,我们会想到以 P1为扇面中心, 连接P1Pi就得到N-2个三角形,由于凸性, 保证这些三角形全在多边形内,那么, 这个凸多边形的有向面积: A=sigma(Ai) (i=1…N-2)
P6 P1 A4 P5 A3 A1 P2
2011-5-2
A2 P3
P4
23
凹多边形的面积? 凹多边形的面积?
∣/2
27
( i=1…N )
能否把扇心移到多边形以外呢? 能否把扇心移到多边形以外呢?
P3 P4
P2
P1
P0
2011-5-2
28
既然内外都可以,为什么不设 既然内外都可以,为什么不设P0 为坐标原点呢? 为坐标原点呢?
P3 P4
P2
P1
现在的公式?
O
2011-5-2 29
简化的公式: 简化的公式:
面积问题 搞定! 搞定!
Yi
A=
sigma
∣
Xi
X(i+1) Y(i+1)
∣/2
( i=1…N )
2011-5-2
30
基本问题( ): 基本问题(2):
给定一个简单多边形,求其重心。 给定一个简单多边形,求其重心。 输入:多边形( 输入:多边形(顶点按逆时针顺 序排列) 序排列) 输出:重心点C 输出:重心点C
2011-5-2
31
从三角形的重心谈起: 从三角形的重心谈起:
三角形的重心是: (x1+x2+x3) / 3,(y1+y2+y3) / 3 可以推广否? Sigma(xi)/N , sigma(yi)/N (i=1…N) ???
2011-5-2
32
看看一个特例: 看看一个特例:
2011-5-2
33
36
分别求出每个三角形的面积Ai, 总面积为各个面积 相加根据物理学知识得:n个点(xi,yi)每个重量是mi, 则重心是 X = (x1*M1+x2*M2+...+xn*Mn) /(M1+M2+....+Mn) Y = (y1*M1+y2*M2+...+yn*Mn) /(M1+M2+....+Mn) 由于密度均匀,所以这里重量mi都用面积Ai代替。
也可把叉积看做以下平行四边形的面积
2011-5-2
5
2011-5-2
6
P0p1是否在p0p2的顺时针方向上?
2011-5-2
7
P0p1和p1p2在p1点向是向左转还是向右转?
2011-5-2
8
P1p2和p3p4是否相交?
2011-5-2
9
2011-5-2
10
2011-5-2
11
思考: 思考:
传统的计算线段相交的方法是什么? 1、传统的计算线段相交的方法是什么? 传统方法和本方法的区别是什么? 2、传统方法和本方法的区别是什么?
2011-5-2
12
特别提醒: 特别提醒:
以上介绍的线段的三个属性, 以上介绍的线段的三个属性,是计 算几何的基础, 算几何的基础,在很多方面都有应 用,比如求凸包等等,请务必掌握! 比如求凸包等等,请务必掌握!
62
2011-5-2
63
2011-5-2
64
2011-5-2
65
2011-5-2
66
凸包模板: 凸包模板:
//xiaoxia版 #include <stdio.h> #include <math.h> #include <stdlib.h> typedef struct { double x; double y; }POINT; POINT result[102]; //保存凸包上的点 POINT a[102]; int n,top;
2011-5-2
37
全部搞 定!
第三单元
凸包( Convex Hull ) 凸包(
2011-5-2
39
2011-5-2
40
2011-5-2
41
2011-5-2
42
2011-5-2
43
2011-5-2
44
2011-5-2
45
2011-5-2
46
2011-5-2
47
2011-5-2
2011-5-2 35
公式: 公式:
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)
2011-5-2
48
2011-5-2
49
2011-5-2
50
2011-5-2
51
2011-5-2
52
2011-5-2
53
2011-5-2
54
2011-5-2
55
2011-5-2
56
2011-5-2
57
2011-5-2
58
2011-5-2
59
2011-5-2
60
2011-5-2
61
2011-5-2
思考:此方法的缺点: 思考:此方法的缺点:
计算量大 精度损失 更好的方法?
2011-5-2
20
计算几何的方法: 计算几何的方法:
在计算几何里,我们知道,△ABC的面积 就是“向量AB”和“向量AC”两个向量叉 积的绝对值的一半。其正负表示三角形 顶点是在右手系还是左手系。
B C A ABC成左手系,负面积
2011-5-2 67
double Distance(POINT p1,POINT p2)
//两点间的
Any question?
课后在线作业: 课后在线作业:
1086 1115 1392 2036 2108 1147 /*2324 2805 2948*/
2011-5-2
69
Welcome to HDOJ
原因: 原因:
错误的推广公式是“质点系重心公式”, 即如果认为多边形的质量仅分布在其顶 点上,且均匀分布,则这个公式是对的。 但是,现在多边形的质量是均匀分布在 其内部区域上的,也就是说,是与面积 有关的!
2011-5-2
34
Solution:
剖分成N个三角形,分别求出其重心和面 积,这时可以想象,原来质量均匀分布 在内部区域上,而现在质量仅仅分布在 这N个重心点上(等假变换),这时候就 可以利用刚才的质点系重心公式了。 不过,要稍微改一改,改成加权平均 加权平均数, 加权平均 因为质量不是均匀分布的,每个质点代 表其所在三角形,其质量就是该三角形 的面积(有向面积 有向面积!),——这就是权! 有向面积
P3 P2 P4 P0 P5 P6
2011-5-2 26
P1
前面的三角剖分显然对于多边形内部 任意一点都是合适的! 任意一点都是合适的!
我们可以得到: A=sigma(Ai) ( i=1…N )
即:A= ∣
sigma
2011-5-2
Xi – X0
Yi –Y0
X(i+1) – X0 Y(i+1) –Y0
Thank You ~
2011-5-2 70
2011-5-2
16
Any good idea?
2011-5-2
17
先看最简单的多边形——三角形 三角形 先看最简单的多边形
2011-5-2
18
三角形的面积: 三角形的面积:
在解析几何里, △ABC的面积可以通过 如下方法求得: 点坐标 => 边长 => 海伦公式 => 面积
2011-5-2
ห้องสมุดไป่ตู้
19
P3
P2 P4
P1
2011-5-2
24
依然成立!!! 依然成立!!!
多边形面积公式:A=sigma(Ai) (i=1…N-2)
结论: “有向面积”A比“面积”S其实更本 本 质!
2011-5-2
25
任意点为扇心的三角形剖分:
我们能把多边形分成N-2个三角形,为什么不 能分成N个三角形呢? 比如,以多边形内部的一个点为扇心,就可以 把多边形剖分成 N个三角形。
2011-5-2
C B A ABC成右手系,正面积
21
大功告成: 大功告成:
Area(A,B,C)= 1/2 * (↑AB) × (↑AC)
=∣
2011-5-2
Xb – X a Xc – X a
Yb –Y a
Yc –Y a
∣/2
22
特别注意: 以上得到是有向面积(有正负)! 有向面积( 有向面积 有正负)
2011-5-2
13
第二单元
多边形面积和重心
2011-5-2
14
基本问题( ): 基本问题(1):
给定一个简单多边形,求其面积。 给定一个简单多边形,求其面积。 输入:多边形( 输入:多边形(顶点按逆时针顺 序排列) 序排列) 输出:面积S 输出:面积S