计算几何算法概览.
计算几何

思考如下图形:
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
设你种了很多树,想用一个篱笆把所有的
树都包在里面。出于经济考虑,这个篱笆应该是越 小越好。
geometric 几何算法

geometric 几何算法(原创实用版)目录一、几何算法概述二、几何算法的应用领域三、几何算法的求解方法四、几何算法的优缺点分析五、几何算法的发展趋势正文一、几何算法概述几何算法,顾名思义,是研究几何问题的算法。
在计算机科学领域,几何算法主要研究如何使用计算机求解几何问题,例如计算两个图形的交集、计算多边形的面积等。
几何算法广泛应用于计算机图形学、计算机辅助设计、地理信息系统等领域。
二、几何算法的应用领域1.计算机图形学:在计算机图形学中,几何算法被用于生成、处理和显示图形。
例如,在三维图形学中,需要用到几何算法来计算物体的表面积、体积等。
2.计算机辅助设计:在计算机辅助设计(CAD)中,几何算法被用于创建、修改和分析工程图纸。
例如,在设计建筑结构时,需要用到几何算法来计算结构的稳定性和强度。
3.地理信息系统:在地理信息系统(GIS)中,几何算法被用于处理地理空间数据。
例如,在 GIS 中,需要用到几何算法来计算地理区域的面积、周长等。
三、几何算法的求解方法几何算法的求解方法有很多,下面介绍几种常见的方法:1.枚举法:对于一些简单的几何问题,可以采用枚举法求解。
例如,在计算多边形的面积时,可以枚举多边形的所有顶点,计算每个顶点对应的三角形面积,最后将所有三角形面积相加得到多边形的面积。
2.扫描线法:扫描线法是一种基于二维坐标系的几何算法。
它通过扫描线逐行扫描多边形,计算多边形与扫描线的交点,从而得到多边形的边界。
扫描线法可以高效地计算多边形的面积和周长。
3.空间分割法:空间分割法是一种基于空间数据的几何算法。
它通过将空间数据分成若干个区域,然后计算各个区域之间的交集,从而得到所需的几何信息。
空间分割法可以高效地处理复杂几何体。
四、几何算法的优缺点分析几何算法的优点:1.高效性:几何算法通常具有较高的计算效率,可以快速求解几何问题。
2.通用性:几何算法可以应用于多种几何问题,具有较强的通用性。
几何算法的缺点:1.复杂性:对于一些复杂的几何问题,几何算法的求解过程可能较为复杂,难以理解和实现。
计算几何算法概览

计算几何算法概览一、引言计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。
作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。
在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。
在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助。
二、目录本文整理的计算几何基本概念和常用算法包括如下内容:三、算法介绍如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。
如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。
设二维矢量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)。
计算矢量叉积是与直线和线段相关算法的核心部分。
设矢量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共线,但可能同向也可能反向。
折线段的拐向判断方法可以直接由矢量叉积的性质推出。
数学几何运算

数学几何运算几何运算是数学中的一个重要分支,研究着数学空间内的图形形状、大小和位置关系。
几何运算可以帮助我们进行空间推导和问题解决。
本文将介绍数学几何运算的主要内容,包括点、线、面的运算。
1. 点的几何运算点是几何空间中最基本的元素,不具有大小和方向,只有位置。
点的几何运算主要包括点的坐标表示和点的平移变换。
1.1 点的坐标表示在数学中,我们通常使用笛卡尔坐标系来表示点的位置。
笛卡尔坐标系是一个二维平面上的直角坐标系,通过横坐标和纵坐标来确定点的位置。
例如,点A在坐标系中的位置可以表示为(Ax, Ay)。
1.2 点的平移变换点的平移变换是将点沿某个方向移动一定的距离。
平移变换可以通过将点的坐标分别增加或减少相同的值来实现。
例如,将点A(x, y)沿x轴正方向平移5个单位可以得到新的点A'(x+5, y)。
2. 线的几何运算线是由一系列点组成的几何对象,可以用来连接两个点或者定义一个方向。
线的几何运算主要包括线段的长度计算和线段的延长与截取。
2.1 线段的长度计算线段的长度是指线段所覆盖的距离。
可以使用两点间的距离公式来计算线段的长度。
例如,对于线段AB,长度可以表示为AB = √[(B x - Ax)² + (By - Ay)²]。
2.2 线段的延长与截取线段的延长是指在线段的某一端继续延伸线段的长度。
线段的截取是指将线段的一部分分离出来。
延长和截取线段可以通过改变线段的两个端点来实现。
3. 面的几何运算面是二维几何空间中的一个平面区域,由无数个点组成。
面的几何运算主要包括面积计算和面的旋转变换。
3.1 面积计算面的面积是指面覆盖的二维区域大小。
对于简单的几何图形(如矩形、三角形、圆等),可以使用相应的面积公式计算面积。
对于复杂的几何图形,可以将其分解为多个简单的几何图形,然后计算每个几何图形的面积,最后将它们相加。
3.2 面的旋转变换面的旋转变换是指将面绕着某一点或某一轴旋转一定的角度。
计算几何初步

矢量的叉乘
矢量积的一般含义:两个矢量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,
计算几何算法

计算几何算法计算几何学是一门复杂而又深入的学科,它将数学和计算机科学结合在一起,用于对空间几何问题提出数学和计算机科学方法的解决方案。
计算几何学研究的主要内容包括几何计算、几何分析、图形处理等等。
计算几何学的研究可以追溯到古希腊的几何学,但它作为现代科学的一个分支是在20世纪60年代开始发展的。
在这50多年的发展中,计算几何学逐渐发展出一系列算法以解决各种几何问题。
计算几何学的算法分为基本算法和高级算法。
基本算法主要包括点位置检查算法、距离计算算法、可视性分析算法、图算法等等。
例如,点位置检查算法是一种用于判断两个点在三维空间中的关系的算法,距离计算算法用于计算两点在三维空间中的距离,可视性分析算法用于检测两个几何物体之间的可视性,而图算法则是用于建模空间结构和做几何计算的一类算法。
除了基本算法外,计算几何学还涉及一些高级算法,如几何建模算法、线性规划算法、最短路径算法、剖面分析算法等。
几何建模算法用于模拟物体的表面形状,利用该算法可以建立更真实的虚拟模型。
线性规划算法用于解决线性优化问题,可以用来找出最优路径。
最短路径算法用于求解具有权重的网络最短路径,是图论中应用最广泛的算法之一。
最后,剖面分析算法则是一种用于求解物体表面剖面的算法,可以帮助分析物体的结构和性质。
计算几何学的算法可以应用于各种空间几何问题的求解,为计算机视觉、图形学以及制造等领域提供了强大的算法支持。
计算几何学算法在空间几何问题领域中占据着重要的地位,在各种空间几何计算中得到了广泛的应用。
随着计算机技术的不断发展,计算几何学算法也在不断的完善和改进,使得计算几何学能够更加有效的解决空间几何问题,为解决现实世界中的各种复杂问题提供了强有力的技术支持。
展望未来,计算几何学将继续发展壮大,发展出更加强大的算法,为人类带来更多惊喜和机遇。
计算几何

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
计算机图形学中计算几何算法

计算机图形学中计算几何算法/*计算几何(本文档源文件格式为.cpp,上传百度时被迫改有.txt) 目录㈠点的基本运算1. 平面上两点之间距离 12. 判断两点是否重合 13. 矢量叉乘 14. 矢量点乘 25. 判断点是否在线段上 26. 求一点饶某点旋转后的坐标 27. 求矢量夹角 2㈡线段及直线的基本运算1. 点与线段的关系 32. 求点到线段所在直线垂线的垂足 43. 点到线段的最近点 44. 点到线段所在直线的距离 45. 点到折线集的最近距离 46. 判断圆是否在多边形内 57. 求矢量夹角余弦 58. 求线段之间的夹角 59. 判断线段是否相交 610.判断线段是否相交但不交在端点处 611.求线段所在直线的方程 612.求直线的斜率 713.求直线的倾斜角 714.求点关于某直线的对称点 715.判断两条直线是否相交及求直线交点 716.判断线段是否相交,如果相交返回交点 7㈢多边形常用算法模块1. 判断多边形是否简单多边形 82. 检查多边形顶点的凸凹性 93. 判断多边形是否凸多边形 94. 求多边形面积 95. 判断多边形顶点的排列方向,方法一 106. 判断多边形顶点的排列方向,方法二 107. 射线法判断点是否在多边形内 108. 判断点是否在凸多边形内 119. 寻找点集的graham算法 1210.寻找点集凸包的卷包裹法 1311.判断线段是否在多边形内 1412.求简单多边形的重心 1513.求凸多边形的重心 1714.求肯定在给定多边形内的一个点 1715.求从多边形外一点出发到该多边形的切线 1816.判断多边形的核是否存在 19㈣圆的基本运算1 .点是否在圆内 202 .求不共线的三点所确定的圆 21㈤矩形的基本运算1.已知矩形三点坐标,求第4点坐标 22 ㈥常用算法的描述 22㈦补充1.两圆关系: 242.判断圆是否在矩形内: 243.点到平面的距离: 254.点是否在直线同侧: 255.镜面反射线: 256.矩形包含: 267.两圆交点: 278.两圆公共面积: 289. 圆和直线关系: 2910. 内切圆: 3011. 求切点: 3112. 线段的左右旋: 3113.公式: 32*//* 需要包含的头文件 */#include/* 常用的常量定义 */const double INF = 1E200const double EP = 1E-10const int MAXV = 300const double PI = 3.14159265/* 基本几何结构 */struct POINT{double x;double y;POINT(double a=0, double b=0) { x=a; y=b;} //constructor };struct LINESEG{POINT s;POINT e;LINESEG(POINT a, POINT b) { s=a; e=b;}LINESEG() { }};struct LINE // 直线的解析方程 a*x+b*y+c=0 为统一表示,约定a >= 0{double a;double b;double c;LINE(double d1=1, double d2=-1, double d3=0) {a=d1; b=d2; c=d3;}};/*********************** ** 点的基本运算 ** ***********************/double dist(POINT p1,POINT p2) // 返回两点之间欧氏距离{return( sqrt( (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) ) );}bool equal_point(POINT p1,POINT p2) // 判断两个点是否重合{return ( (abs(p1.x-p2.x)<ep)&&(abs(p1.y-p2.y)}/************************************************************** ****************r=multiply(sp,ep,op),得到(sp-op)和(ep-op)的叉积r>0:ep在矢量opsp的逆时针方向;r=0:opspep三点共线;r<0:ep在矢量opsp的顺时针方向*************************************************************** ****************/double multiply(POINT sp,POINT ep,POINT op){return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));}/*r=dotmultiply(p1,p2,op),得到矢量(p1-op)和(p2-op)的点积,如果两个矢量都非零矢量r<0:两矢量夹角为锐角;r=0:两矢量夹角为直角;r>0:两矢量夹角为钝角*************************************************************** ****************/double dotmultiply(POINT p1,POINT p2,POINT p0){return ((p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y));}/************************************************************** ****************判断点p是否在线段l上条件:(p在线段l所在的直线上) && (点p在以线段l为对角线的矩形内)*************************************************************** ****************/bool online(LINESEG l,POINT p){return( (multiply(l.e,p,l.s)==0) &&( ( (p.x-l.s.x)*(p.x-l.e.x)<=0 )&&( (p.y-l.s.y)*(p.y-l.e.y)<=0 ) ) );}// 返回点p以点o为圆心逆时针旋转alpha(单位:弧度)后所在的位置POINT rotate(POINT o,double alpha,POINT p){POINT tp;p.x-=o.x;p.y-=o.y;tp.x=p.x*cos(alpha)-p.y*sin(alpha)+o.x;tp.y=p.y*cos(alpha)+p.x*sin(alpha)+o.y;return tp;}/* 返回顶角在o点,起始边为os,终止边为oe的夹角(单位:弧度)角度小于pi,返回正值角度大于pi,返回负值可以用于求线段之间的夹角原理:r = dotmultiply(s,e,o) / (dist(o,s)*dist(o,e))r'= multiply(s,e,o)r >= 1 angle = 0;r <= -1 angle = -PI-1<r<="0">*/double angle(POINT o,POINT s,POINT e){double cosfi,fi,norm;double dsx = s.x - o.x;double dsy = s.y - o.y;double dex = e.x - o.x;double dey = e.y - o.y;cosfi=dsx*dex+dsy*dey;norm=(dsx*dsx+dsy*dsy)*(dex*dex+dey*dey);cosfi /= sqrt( norm );if (cosfi >= 1.0 ) return 0;if (cosfi <= -1.0 ) return -3.1415926;fi=acos(cosfi);if (dsx*dey-dsy*dex>0) return fi; // 说明矢量os 在矢量 oe的顺时针方向return -fi;}/*****************************\* ** 线段及直线的</r</r</ep)&&(abs(p1.y-p2.y)基本运算 ** *\*****************************//* 判断点与线段的关系,用途很广泛本函数是根据下面的公式写的,P是点C到线段AB所在直线的垂足AC dot ABr = ---------||AB||^2(Cx-Ax)(Bx-Ax) + (Cy-Ay)(By-Ay)= -------------------------------L^2r has the following meaning:r=0 P = Ar=1 P = Br<0 P is on the backward extension of ABr>1 P is on the forward extension of AB0<r*/double relation(POINT p,LINESEG l){LINESEG tl;tl.s=l.s;tl.e=p;return dotmultiply(tl.e,l.e,l.s)/(dist(l.s,l.e)*dist(l.s,l.e));}// 求点C到线段AB所在直线的垂足 PPOINT perpendicular(POINT p,LINESEG l){double r=relation(p,l);POINT tp;tp.x=l.s.x+r*(l.e.x-l.s.x);tp.y=l.s.y+r*(l.e.y-l.s.y);return tp;}/* 求点p到线段l的最短距离,并返回线段上距该点最近的点np 注意:np是线段l上到点p最近的点,不一定是垂足 */ double ptolinesegdist(POINT p,LINESEG l,POINT &np) {double r=relation(p,l);if(r<0){np=l.s;return dist(p,l.s);}if(r>1){np=l.e;return dist(p,l.e);}np=perpendicular(p,l);return dist(p,np);}// 求点p到线段l所在直线的距离,请注意本函数与上个函数的区别double ptoldist(POINT p,LINESEG l){return abs(multiply(p,l.e,l.s))/dist(l.s,l.e);}/* 计算点到折线集的最近距离,并返回最近点.注意:调用的是ptolineseg()函数 */double ptopointset(int vcount,POINT pointset[],POINT p,POINT &q){int i;double cd=double(INF),td;LINESEG l;POINT tq,cq;for(i=0;i{l.s=pointset[i];l.e=pointset[i+1];td=ptolinesegdist(p,l,tq);if(td{cd=td;cq=tq;}}q=cq;return cd;}/* 判断圆是否在多边形内.ptolineseg()函数的应用2 */bool CircleInsidePolygon(int vcount,POINT center,double radius,POINT polygon[]){POINT q;double d;q.x=0;q.y=0;d=ptopointset(vcount,polygon,center,q);if(d<radius||fabs(d-radius)return true;elsereturn false;}/* 返回两个矢量l1和l2的夹角的余弦(-1 --- 1)注意:如果想从余弦求夹角的话,注意反余弦函数的定义域是从 0到pi */double cosine(LINESEG l1,LINESEG l2){return (((l1.e.x-l1.s.x)*(l2.e.x-l2.s.x) +(l1.e.y-l1.s.y)*(l2.e.y-l2.s.y))/(dist(l1.e,l1.s)*dist(l2.e,l2.s))) );}// 返回线段l1与l2之间的夹角单位:弧度范围(-pi,pi)double lsangle(LINESEG l1,LINESEG l2){POINT o,s,e;o.x=o.y=0;s.x=l1.e.x-l1.s.x;s.y=l1.e.y-l1.s.y;e.x=l2.e.x-l2.s.x;e.y=l2.e.y-l2.s.y;return angle(o,s,e);}// 如果线段u和v相交(包括相</radius||fabs(d-radius)</r交在端点处)时,返回true////判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。
几何算法初步知识点总结

几何算法初步知识点总结几何算法是数学中的一个重要分支,它研究空间和平面中点、线、面等几何图形的性质和运算方法。
几何算法在实际中有着广泛的应用,比如工程设计、地理信息系统、计算机图形学等领域都需要用到几何算法。
本文将主要总结几何算法的一些初步知识点,包括点、线、面的性质和运算方法,以及一些常见的几何算法。
一、点的性质和运算方法1. 点的定义一个点是几何中最基本的图形,它是一个没有长度、宽度和高度的对象。
点在空间中可以用坐标来表示,比如二维平面上的点可以用(x, y)来表示,三维空间中的点可以用(x, y, z)来表示。
2. 点的运算两个点之间可以进行一些基本运算,比如计算它们之间的距离、判断它们是否在同一条直线上等。
点的运算是几何算法中的基础,它为其他几何图形的运算奠定了基础。
3. 点的性质点是一个没有大小的对象,它没有方向,也没有形状。
在几何中,我们通常用点来表示图形的顶点和交点,它在几何图形的构造和分析中起着重要作用。
二、线的性质和运算方法1. 线的定义一条线是由无数个点连续排列而成的。
在几何中,线是一个没有宽度和厚度的对象,它只有长度。
线在空间中可以是一条直线或者是一条曲线,它们可以用数学方程或参数方程来表示。
2. 线的运算线可以进行一些基本的运算,比如计算两条线之间的交点、判断两条线是否平行等。
线的运算是几何算法中的重要内容,它可以用来解决很多实际问题。
3. 线的性质线是一个没有宽度的对象,它没有方向和形状。
在线的几何中,我们经常用线来表示直线、线段、射线等图形,它在几何学和数学中有着广泛的应用。
三、面的性质和运算方法1. 面的定义一个面是由一组点和连结这些点的线组成的,它有着长度、宽度和面积。
面可以是平面的,也可以是空间的。
在几何中,我们通常用平面几何学来研究平面上的图形,用立体几何学来研究空间中的图形。
2. 面的运算面可以进行一些基本的运算,比如计算它们之间的距离、判断它们是否相交等。
autocadarx程序设计。几何算法、配置环境、常用函数、命令添加等

计算几何算法概览一、引言计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。
作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。
在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。
在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助。
二、目录本文整理的计算几何基本概念和常用算法包括如下内容:矢量的概念矢量加减法AcGeVector2d/AcGeVector3d + - += -=等运算符重载或者setToSum矢量叉积AcGeVetor3d crossProduct折线段的拐向判断由矢量叉积的性质推出判断点是否在线段上isOn判断两线段是否相交AcgeLineSeg2d intersectWith判断线段和直线是否相交AcgeLine2d AcgeLineSeg2d intersectWith判断矩形是否包含点判断线段、折线、多边形是否在矩形中判断矩形是否在矩形中判断圆是否在矩形中判断点是否在多边形中判断线段是否在多边形内判断折线是否在多边形内判断多边形是否在多边形内判断矩形是否在多边形内判断圆是否在多边形内判断点是否在圆内判断线段、折线、矩形、多边形是否在圆内判断圆是否在圆内计算点到线段的最近点line.closestPointTo(point);计算点到折线、矩形、多边形的最近点计算点到圆的最近距离及交点坐标计算两条共线的线段的交点计算线段或直线与线段的交点求线段或直线与折线、矩形、多边形的交点求线段或直线与圆的交点凸包的概念凸包的求法三、算法介绍矢量的概念:如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。
如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。
计算几何

思考如下图形: 思考如下图形:
2011-1-7
9
先看最简单的多边形——三角形 三角形 先看最简单的多边形
2011-1-7
10
三角形的面积: 三角形的面积:
在解析几何里, △ABC的面积可以通过 如下方法求得: 点坐标 => 边长 => 海伦公式 => 面积
2011-1-7
11
思考:此方法的缺点: 思考:此方法的缺点:
计算量大 精度损失 更好的方法?
2011-1-7
12
计算几何的方法: 计算几何的方法:
在计算几何里,我们知道,△ABC的面积就是“向量AB”和“向量 AC”两个向量叉积的绝对值的一半。其正负表示三角形顶点是在 右手系还是左手系。
B
C
C
B
A ABC成左手系,负面积 2011-1-7
A ABC成右手系,正面积 13
2011-1-7
18
2011-1-7
19
2011-1-7
20
2011-1-7
21
2011-1-7
22
2011-1-7
23
2011-1-7
24
2011-1-7
25
2011-1-7
26
2011-1-7
27
2011-1-7
28
2011-1-7
29
2011-1-7
30
2011-1-7
点-线距离 线距离
找出一个点和一条线间的距离是经常遇见的几何问题之一。假设 给出三个点,A,B和C,你想找出点C到点A、B定出的直线间距 离。第一步是找出A到B的向量AB和A到C的向量AC,现在我们用 该两向量的叉积除以|AB|,这就是我们要找的的距离了(下图中 的红线)。 d = (AB x AC)/|AB|
计算几何算法与实现

计算几何算法与实现
计算几何算法是计算机科学领域中的一个重要分支,其主要研究对象是在计算机中对几何形体的描述、计算和变换。
计算几何算法包括点、线、多边形、曲线、曲面等几何形体的基本操作,如插值、拟合、裁剪、交、并、差、距离、相似变换、仿射变换、透视变换等。
在实际应用中,计算几何算法被广泛应用于计算机图形学、计算机辅助设计、计算机视觉、机器人、计算机动画等领域。
本书旨在系统介绍计算几何算法及其实现方法,涵盖了点、线、多边形、曲线、曲面等几何形体的基本操作及其应用。
本书共分为四个部分。
第一部分介绍计算几何算法的基础知识,包括坐标系、向量、点乘、叉乘、向量长度、向量夹角等概念。
第二部分重点介绍计算几何算法的基本操作,包括点、线、多边形、曲线、曲面的插值、拟合、裁剪、交、并、差、距离等。
第三部分介绍计算几何算法的应用,包括计算机图形学、计算机辅助设计、计算机视觉、机器人、计算机动画等领域的常用算法及其实现方法。
第四部分介绍计算几何算法的最新进展,包括深度学习、机器学习、数据挖掘等领域中的应用。
本书的目标读者为计算机科学及相关专业的本科、研究生学生,以及从事计算机图形学、计算机辅助设计、计算机视觉、机器人、计算机动画等领域工作的专业人员。
本书既可作为高校计算几何算法课程的教材,也可作为相关领域从业人员的参考书。
- 1 -。
数学几何运算公式

数学几何运算公式几何学是数学的一个重要分支,研究空间的形状、大小以及它们之间的关系。
几何学可分为平面几何和立体几何两个方面。
在几何学中,运用丰富的公式可以帮助我们解决各种几何问题。
本文将介绍一些常用的数学几何运算公式。
一、平面几何运算公式1. 点积公式:点积是向量运算中的一种运算,表示两个向量之间的夹角关系。
设A(x₁, y₁)和B(x₂, y₂)是平面直角坐标系中的两个点,则点积公式为:AB = √((x₂-x₁)² + (y₂-y₁)²)2. 向量差公式:向量差是指将一个向量的终点与另一个向量的起点相连得到的向量。
设A(x₁, y₁)和B(x₂, y₂)是平面直角坐标系中的两个点,则向量AB的坐标表示为:AB = (x₂-x₁, y₂-y₁)3. 中点公式:中点是指连接线段两个端点的中垂线与线段的交点。
设A(x₁, y₁)和B(x₂, y₂)是平面直角坐标系中的两个点,则线段AB的中点的坐标表示为:M((x₁+x₂)/2, (y₁+y₂)/2)4. 距离公式:距离是指两点之间的直线距离,也叫作线段的长度。
设A(x₁, y₁)和B(x₂, y₂)是平面直角坐标系中的两个点,则线段AB的长度为:AB = √((x₂-x₁)² + (y₂-y₁)²)二、立体几何运算公式1. 体积公式:体积是指立体图形所包围的三维空间的容积大小。
不同立体图形的体积计算公式各不相同,下面是一些常见立体图形的体积计算公式:- 立方体的体积公式:V = a³,其中a为立方体的边长。
- 圆柱体的体积公式:V = πr²h,其中r为底面半径,h为高。
- 圆锥体的体积公式:V = (1/3)πr²h,其中r为底面半径,h为高。
2. 表面积公式:表面积是指立体图形表面所覆盖的面积大小。
不同立体图形的表面积计算公式各不相同,下面是一些常见立体图形的表面积计算公式:- 立方体的表面积公式:S = 6a²,其中a为立方体的边长。
中南大学计算几何知识考点汇总

计算几何1、矢量的运算(1)加(减)法b a + b a -(2)数乘ka(3)矢量的长度j a i a a 21+=2221||a a a +=2、矢量的点积(内积)αcos ||||b a b a =∙其中|a |和|b |表示矢量的长度22112121)()(b a b a j b i b j a i a b a +=+∙+=∙(1)单位矢量a a a ||10=a b 图1 矢量加法 图2 矢量减法 图3 矢量数乘 图4 矢量点积(2)夹角余弦00cos b a ∙=α(3)点到直线的距离|)(|00a b a b d ∙-=例1:已知平面上点A (2,2),B (4,4),P (3,5),求P 到A ,B 所在直线的距离。
解:令j i AB a 22+==那么)(21)22(2210j i j i a +=+=令j i b 3+=j i a b a b AP c +-=∙-==00)(那么2||==c d 所求距离为23、矢量的叉积(外积)b ac ⨯= 321321b b b a a a k j ic =图5 点到直线的距离c 图6 矢量的叉积(1)三角形面积||21c s = (2)多边形面积已知平面上点P 0,P 1,P 2,…,P n-1按逆时针方向排列成一个简单多边形,Q 是平面上任意一点,求多边形的面积。
),,(...),,(),,(012110Q P P s Q P P s Q P P s s n -+++=(3)判定平面上的点在有向线段的哪一侧已知平面上三点A (x 1, y 1),B(x 2, y 2),C(x 3, y 3),判定C 点是否在有向线段AB 的左侧。
k y y x x y y x x y y x x y y x x kj i c 131312121313121200----=----= 令))(())((12131312y y x x y y x x t -----=,如果t 为正,则C 在AB 的左侧,t 为负则C 在AB 的右侧,t 为零则C 与AB 共线。
计算几何算法设计

计算几何算法设计计算几何是数学和计算机科学的交叉领域,它研究如何在计算机上有效地解决几何问题。
在计算几何中,我们需要使用各种算法来处理几何对象,例如点、线、面和体等。
本文将介绍一些常见的计算几何算法和它们的设计思路。
1. 判断两个线段是否相交算法判断两个线段是否相交是计算几何中最基础的问题之一。
我们可以通过求解两个线段所组成的平面方程,然后比较两个方程是否相等来判断是否相交。
如果两个线段所在的平面方程相等,那么我们需要判断两个线段的端点是否在对方的线段上。
如果两个线段的端点都在对方的线段上,那么它们相交,否则它们不相交。
2. 求两条直线的交点算法在计算几何中,求两条直线的交点也是常见的问题。
我们可以先求出两个直线所组成的平面方程,然后通过高斯消元法求解两个方程,得到交点的坐标。
如果两个直线平行或共线,则交点不存在。
3. 求点到直线的距离算法求点到直线的距离也是计算几何中的一个重要问题。
我们可以通过计算点到直线投影点的距离来得到点到直线的距离。
投影点可以通过求解直线的垂线方程得到。
然后,我们可以使用向量计算公式来计算点到直线投影点的距离。
4. 求两个三角形的相交面积算法求两个三角形的相交面积也是计算几何中的一个重要问题。
我们可以通过求解两个三角形所在平面方程的交点,然后将交点构成新的三角形,计算新三角形的面积,再减去重叠部分的面积得到两个三角形的相交面积。
5. 求多边形的凸包算法在计算几何中,求多边形的凸包也是非常重要的问题。
凸包是指包含所有点的最小凸多边形,它可以用于空间遮挡剔除和图像识别等领域。
求多边形的凸包有多种算法,其中最著名的是Graham扫描算法。
这种算法基于极角排序和栈,它可以在线性时间内求解凸包。
综上所述,计算几何算法设计是非常关键的,它可以帮助我们有效地解决各种几何问题。
在实践中,我们需要灵活运用不同的算法来解决具体问题,以达到最优解的效果。
数学中的几何算法

数学中的几何算法几何学是数学的一个重要分支,它研究空间的形状、大小、位置以及其它与空间相关的性质。
而几何算法则是应用数学在几何学中解决问题的科学方法。
本文将介绍数学中的几何算法,并讨论它们在实际应用中的重要性。
一、点与线的相关算法1. 直线的方程在解决几何问题中,求直线的方程是一个非常重要的步骤。
直线的方程可以采用不同的形式表示,比如一般式、截距式、斜截式等。
通过给定直线上的两个点,我们可以轻易地求得直线的斜率和截距,从而得到直线的方程。
2. 点到直线的距离计算一个点到直线的距离是几何算法中的常见问题。
通过点到线段的最短距离公式,我们可以轻松地求得一个点到直线的距离。
3. 直线的交点当我们需要求两条直线的交点时,可以通过解方程组的方法得到。
选取其中一条直线的方程,将另一条直线的方程代入,并从中解出交点的坐标,即可得到两条直线的交点。
二、多边形算法1. 多边形的面积计算多边形的面积是几何算法中的重要问题。
根据多边形的顶点坐标,我们可以利用向量叉积的性质来计算多边形的面积。
2. 多边形的凸包多边形的凸包是包含该多边形的最小凸多边形。
通过凸包算法,我们可以将一个给定的多边形转化为一个凸多边形,并找到凸包上的所有顶点。
3. 多边形的切割将一个多边形切割为几个子多边形是几何算法中的一个常见问题。
通过切割算法,我们可以将一个复杂的多边形切割为若干个简单的多边形,以便于后续的处理或计算。
三、曲线算法1. 圆的方程计算圆的方程是几何算法中的基础问题。
圆的方程可以采用标准方程或参数方程表示,通过给定圆心和半径的值,我们可以很容易地得到圆的方程。
2. 切线的斜率当我们需要求圆上某一点的切线斜率时,可以利用圆的方程和导数的概念来求解。
通过求导,我们可以得到切线的斜率,从而得到圆上某一点的切线方程。
3. 弧长的计算计算圆弧的长度是几何算法中的一个实际问题。
通过圆的半径和圆心角的大小,我们可以利用弧长公式来计算圆弧的长度。
计算几何算法

计算几何算法
计算几何(Computational Geometry)是一种研究计算机与几何概念联用的科学领域,旨在利用计算技术分析几何概念,从而求解使用几何概念解决计算机问题。
计算几何是一个广泛的学科,它将计算机科学、数学、几何学和算法学等领域融会贯通,为计算机辅助设计、图形学、空间信息科学和人机交互等领域提供了有益的支持。
计算几何主要聚焦于解决三维空间内的几何计算问题,其主要研究方向包括几何计算问题的算法分析和研究,以及几何几何多元函数的数值化分析及曲线最优拟合等方面。
计算机几何算法可以分为三个主要类型:结构算法、坐标变换算法和数值分析算法。
结构算法是一类以定义结构为基础的算法,它们通常使用向量,多项式,和其它数学计算工具来求解几何学问题。
坐标变换算法可以利用计算机图形结构进行坐标变换或几何变换,如旋转、缩放和平移等,可以满足复杂的几何学需求。
数值分析算法则利用数值方法来跟踪多边形的轮廓,进行边界拟合等,以解决精细几何学计算问题。
计算几何是一个创新性的学科,它在不断进行中不断发展,它已经奠定了计算机图形学的基础,为计算机图形的未来发展提供了强有力的支撑。
计算几何在支持复杂的几何计算问题、解决计算机图形处理难题和支持人工智能系统实现精细控制等方面有很强的实用性。
如今,计算几何技术已经应用于计算机辅助设计、虚拟现实、空间信息处理、数据可视化等诸多领域,是计算机及其相关技术发展的重要助力。
geometric 几何算法

geometric 几何算法摘要:1.几何算法的概述2.几何算法的应用领域3.几何算法的发展趋势4.几何算法在我国的研究现状5.几何算法在实际生活中的案例分享正文:几何算法,一种基于几何概念的计算方法,广泛应用于数学、计算机科学、工程学等多个领域。
它利用几何图形的性质和变换,为各种实际问题提供高效的解决方案。
一、几何算法的概述几何算法起源于古代数学家对几何图形的探究,如今已经发展成为一门成熟的学科。
它包括一系列计算方法和算法,如解析几何、线性代数、微积分等,这些方法在解决实际问题时具有很高的可读性和实用性。
二、几何算法的应用领域几何算法在众多领域都有广泛的应用,如计算机图形学、计算机视觉、机器人导航、物理学、经济学等。
它为这些领域提供了有力的理论支持和实用工具。
三、几何算法的发展趋势随着科技的不断进步,几何算法也在不断发展。
在未来,它将与其他学科更深入地结合,如拓扑学、非欧几何、混沌理论等。
同时,几何算法的研究将更加注重理论与实践的结合,以满足不断增长的实际需求。
四、几何算法在我国的研究现状我国对几何算法的研究具有悠久的历史,许多古代数学家如刘徽、秦九韶等人都作出了卓越的贡献。
近年来,我国在几何算法领域的研究取得了显著成果,但在国际上仍有一定的差距。
我国学者应继续努力,加强几何算法的研究,提高我国在该领域的地位。
五、几何算法在实际生活中的案例分享几何算法在实际生活中有许多应用案例。
例如,GPS导航系统利用几何算法计算车辆的位置和目的地;机器人运动规划中,几何算法有助于确定机器人的运动轨迹;在经济学领域,几何算法可用于分析价格波动等。
这些案例展示了几何算法在实际生活中的重要作用。
总之,几何算法作为一种具有广泛应用价值的计算方法,在我国的研究和发展仍具有很大的潜力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算几何算法概览[ 2001-03-23 ] 怒火之袍出处:放飞技术网计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。
作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。
在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。
一、引言计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。
作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。
在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。
在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助。
二、目录本文整理的计算几何基本概念和常用算法包括如下内容:1.矢量的概念2.矢量加减法3.矢量叉积4.折线段的拐向判断5.判断点是否在线段上6.判断两线段是否相交7.判断线段和直线是否相交8.判断矩形是否包含点9.判断线段、折线、多边形是否在矩形中10.判断矩形是否在矩形中11.判断圆是否在矩形中12.判断点是否在多边形中13.判断线段是否在多边形内14.判断折线是否在多边形内15.判断多边形是否在多边形内16.判断矩形是否在多边形内17.判断圆是否在多边形内18.判断点是否在圆内19.判断线段、折线、矩形、多边形是否在圆内20.判断圆是否在圆内21.计算点到线段的最近点22.计算点到折线、矩形、多边形的最近点23.计算点到圆的最近距离及交点坐标24.计算两条共线的线段的交点25.计算线段或直线与线段的交点26.求线段或直线与折线、矩形、多边形的交点27.求线段或直线与圆的交点28.凸包的概念29.凸包的求法三、算法介绍矢量的概念:如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。
如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。
矢量加减法:设二维矢量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 )。
矢量叉积:计算矢量叉积是与直线和线段相关算法的核心部分。
设矢量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共线,但可能同向也可能反向。
折线段的拐向判断:折线段的拐向判断方法可以直接由矢量叉积的性质推出。
对于有公共端点的线段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三点共线。
具体情况可参照下图:判断点是否在线段上:设点为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坐标小的排在前面,这种排序准则也是为了保证水平和垂直情况的判断正确),这样相邻的两个点就是在线段上相邻的两交点,如果任意相邻两点的中点也在多边形内,则该线段一定在多边形内。