https://www.shaofei.name- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> 软件开发 >> 正文

计算几何常用算法

作者:未知    文章来源:Sohu博客    点击数:    更新时间:2008-4-18
摘要:计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。 作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。在现代工程和数学领域,计算几何在必威现金回扣形学、机器人技术、超大规模集成电路设计和统计等诸 多领域有着十分重要的应用。在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助。

一、引言

计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。 作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。在现代工程和数学领域,计算几何在必威现金回扣形学、机器人技术、超大规模集成电路设计和统计等诸 多领域有着十分重要的应用。在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助。

二、目录

本文整理的计算几何基本概念和常用算法包括如下内容:

矢量的概念

矢量加减法

矢量叉积

折线段的拐向判断

判断点是否在线段上

判断两线段是否相交

判断线段和直线是否相交

判断矩形是否包含点

判断线段、折线、多边形是否在矩形中

判断矩形是否在矩形中

判断圆是否在矩形中

判断点是否在多边形中

判断线段是否在多边形内

判断折线是否在多边形内

判断多边形是否在多边形内

判断矩形是否在多边形内

判断圆是否在多边形内

判断点是否在圆内

判断线段、折线、矩形、多边形是否在圆内

判断圆是否在圆内

计算点到线段的最近点

计算点到折线、矩形、多边形的最近点

计算点到圆的最近距离及交点坐标

计算两条共线的线段的交点

计算线段或直线与线段的交点

求线段或直线与折线、矩形、多边形的交点

求线段或直线与圆的交点

凸包的概念

凸包的求法

三、算法介绍

矢量的概念:

如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(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] [2] [3] [4] 下一页

Tags:计算几何,算法  
责任编辑:gissky
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地必威现金回扣 - 中国地必威现金回扣