GIS中的计算几何

合集下载

gis面要素面积计算

gis面要素面积计算

gis面要素面积计算
在GIS中,要素面积的计算通常涉及以下步骤:
1. 数据准备:首先需要准备包含要素几何数据的矢量数据集,例如点、线、面等。

2. 投影转换:如果数据集的坐标系统不是投影坐标系统,需要进行投影转换,以确保面积计算的准确性。

3. 要素化:如果数据集是线或面数据,需要将其转换为要素(即面要素),通常使用多边形填充等方法进行要素化。

4. 面积计算:对于要素,可以使用面积计算函数或工具进行面积计算。

常见的面积计算方法包括:
- 平面面积计算:对于投影坐标系,可以使用平面几何方法,如根据顶点坐标计算三角形的面积等。

- 大地面积计算:对于地理坐标系,需要考虑大地曲率的影响,可以使用球面三角形法或椭球面面积计算公式等。

需要注意的是,面积计算结果可能受到多种因素的影响,包括输入数据的精度、数据投影转换的准确性等。

因此,在进行面积计算前,应仔细检查和验证数据,并根据需要进行必要的数据处理和质量控制。

GIS中的计算几何

GIS中的计算几何

GIS中的计算几何GIS是一个图形系统,必然会涉及到几何学上理论应用,比如,图形的可视化,空间拓扑分析,GIS图形编辑等都需要借助几何。

向量几何是用代数的方法来研究几何问题,首先,请大家翻一翻高等数学里有关向量的章节,熟悉一下几个重要的概念:向量、向量的模、向量的坐标表示、向量的加减运算、向量的点积、向量的叉积...下面我们将用这些基本概念来解答GIS中一些几何问题。

一,点和线的关系。

点是否在线段上,这样的判断在图形编辑,拓扑判断(比如,GPS跟踪判断是否跑在线上)需要用到这样的判断。

通常的想法是:先求线段的直线方程,再判断点是否符合这条直线方程,如果符合,还要判断点是否在线段所在的矩形区域(MBR)内,以排除延长线上的可能性,如果不符合,则点不在线段上。

这种思路是可行的,但效率不高,涉及到建立方程,解方程。

借助向量的叉积(也叫向量的向量积,结果还是向量,有方向的)可以很容易的判断。

设向量a=(Xa,Ya,Za) b=(Xb,Yb,Zb) 向量叉积a X b如下:二维向量叉积的模|a X b|=|a|*|b|*sinα=|Xa*Yb-Ya*Xb| (α是向量a,b之间的夹角),向量叉积模的几何意义是以向量a,b为邻边的平行四边形的面积。

可以推测:如果两向量共线,向量叉积模(所代表的平行四边形的面积为零) 则|a X b|=|a|*|b|*sinα=|Xa*Yb-Ya*Xb|=0,否则不共线,叉积的模为非零,根据这样条件可以很轻松的判断点和线的关系,避免了建立方程和解方程的麻烦。

向量叉积的模|AB X AC|=0即可判断C点在AB所确定的直线上,再结合C点是否在AB所在的MBR范围内,就可以最终确定C是否在AB线段上。

关于点和线段的其他关系,都可以通过叉积的求得,比如判断点在线的哪一侧,右手法则,可以通过 a X b=(Xa*Yb-Ya*Xb)*k中的(Xa*Yb-Ya*Xb)正负来判断。

留给大家思考,很简单的,呵呵…二,线和线的关系判断两条线段是否相交,在很多拓扑判断和图形编辑(比如,线的打断来构建拓扑,编辑线对象,叠置分析,面与面关系的判断等) 中都需要用到线线相交的判断,如果两条线段相交,一条线段的两端点必然位于另一条线段的两侧(不考虑退化情况,也就是一条线段的端点在另一条线段上,这个很容易判断)两向量的叉积a X b= (Xa*Yb-Ya*Xb)*k ,分别判断AB X AC的方向与AB X AD的方向是否异号,再判断CD X CA 的方向与CD X CB的方向是否异号即可判断两线段是否相交。

GIS算法基础——计算点到直线、射线、线段的距离

GIS算法基础——计算点到直线、射线、线段的距离

点到线距离的计算1、作业说明1.1 任务点到线距离的计算(包括直线、射线、线段)1.2 要求人机交互,鼠标屏幕取点进行计算,输出计算结果2、程序说明2.1 大体上分三步进行:2.1.1 首先进行画线操作:鼠标在屏幕上取两点(鼠标左键两点)1、画线段直接利用DrawLine函数,将在屏幕上获取的两点坐标传递给函数的参数即可。

2、画直线由于直线是无限的,所以此时要借助于屏幕上所取两点的直线方程,通过求出与所在容器边缘的交点,结合具体情况,将求出的交点的坐标传递给DrawLine函数的参数,即可画出当前范围内的直线形状。

3、画射线画射线与画直线的思路大致相同,不过需判断射线的方向,此处借助所取的第二个点和第一个点的位置关系判断方向,最后再将所取的第一个点和求得的射线方向与容器边缘的交点坐标传递给DrawLine函数的参数即可。

2.1.2 开始绘制第三个点(鼠标右键取该点)借助于DrawEllipse函数(详情参见代码部分)2.1.3 线和点绘制完成后,开始进行距离的计算1、点到直线的距离:可直接利用点到线之间的距离公式2、点到线段的距离:由于点在线段上的投影可能不在线段上,故还需要求出点到线段两端点坐标的距离,再将最小值作为结果输出3、点到射线的距离:同理,若点的投影不在射线上,则其最小距离为点到射线起始端点的距离2.2 窗体界面介绍首先是ComeBox,对其添加三项:计算点到线段的距离、计算点到直线的距离、计算点到射线的距离在PictureBox里进行点和线的绘制,在TextBox里显示点到线的距离值3、源代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace me{public partial class Form1 : Form{public Form1(){InitializeComponent();}//首先定义两个变量:屏幕上所取的两个点private Point m_ptStart; private Point m_ptEnd;//定义两个集合:myplist存放用于画线的两个点,pt存放第三个点List<Point> myplist = new List<Point>();List<Point> pt = new List<Point>();//result用来存放点到线的距离值double result;//自定义方法:两点之间的距离double ptdis(Point p0, Point p1){return System.Math.Sqrt((p1.X - p0.X) * (p1.X - p0.X) + (p1.Y - p0.Y) * (p1.Y - p0.Y));}//自定义最大最小值函数double max(double x, double y){return x > y ? x : y;}double min(double x, double y){return x > y ? y : x;}//自定义方法:点和线之间的距离double pldis(Point p0, Point p1, Point p2){double result;double A = p2.Y - p1.Y;double B = p1.X - p2.X;double C = p2.X * p1.Y - p1.X * p2.Y;result = System.Math.Abs(A * p0.X + B * p0.Y + C) /System.Math.Sqrt(A * A + B * B);return result;}//自定义方法:获取点在线上的投影Point GetProjectPt(Point p0, Point p1, Point p2){Point ProjectPt=new Point();if (p2.X == p1.X){ProjectPt.X = p1.X;ProjectPt.Y = p0.Y;}else{double k = (p2.Y - p1.Y) / (p2.X - p1.X);ProjectPt.X = (int)((k * p1.X + p0.X / k + p0.Y - p1.Y)/(k+1/k));ProjectPt.Y = (int)(-1 / k * (ProjectPt.X - p0.X) + p0.Y);}return ProjectPt;}/*当comboBox1里面的项改变时,清除之前的所有数据比如计算点到直线的距离时,清除点到线段的距离*/private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){myplist.Clear();textBox1.Text = "";Graphics g = pictureBox1.CreateGraphics();g.Clear(Color.White);}// 对pictureBox1的MouseDown事件进行编辑,当鼠标按下时,会产生哪些操作private void pictureBox1_MouseDown(object sender, MouseEventArgs e){Pen blue = new Pen(Color.Blue, 3);Graphics g = pictureBox1.CreateGraphics();//当按下鼠标左键时,在屏幕上取两点画线if (e.Button == MouseButtons.Left){Point p = new Point(e.X, e.Y);myplist.Add(p);}//当按下鼠标右键时,在屏幕上取第三个点if (e.Button == MouseButtons.Right){Point p = new Point(e.X, e.Y);pt.Clear();//改变所取的第三个点时,清除上一次的数据(距离)和图形(点)g.Clear(Color.White);pt.Add(p);//此处将第三个点画成椭圆形式g.DrawEllipse(blue, pt[0].X, pt[0].Y, 1, 1);//在取点的同时,进行点到线距离的计算,并将结果值显示在textBox1上Point p3 = new Point();p3 = GetProjectPt(pt[0], m_ptStart,m_ptEnd);//获取点在线上的投影点//分情况讨论if(comboBox1.Text=="计算点到线段的距离"){if (p3.X >max(m_ptStart.X,m_ptEnd.X ) || p3.X < min( m_ptStart.Y,m_ptEnd.Y)){//点在线段上的投影不在线段上double dis1 = ptdis(pt[0], m_ptStart);double dis2 =ptdis(pt[0], m_ptEnd);result = min(dis1, dis2);}elseresult = pldis(pt[0], m_ptStart, m_ptEnd);}if(comboBox1.Text=="计算点到射线的距离"){if (p3.X < myplist[0].X) //点在射线上的投影不在射线上result = ptdis(pt[0], m_ptStart);elseresult = pldis(pt[0], m_ptStart, m_ptEnd);}if (comboBox1.Text == "计算点到直线的距离")result = pldis(pt[0], m_ptStart, m_ptEnd);textBox1.Text = result.ToString(); //将结果显示在textBox1上}//开始画线if (myplist.Count > 1){//A、B、C分别是直线一般方程中的三和参数,即A*x+B*y+C=0double A = myplist[1].Y - myplist[0].Y;double B = myplist[0].X - myplist[1].X;double C = myplist[1].X * myplist[0].Y - myplist[0].X * myplist[1].Y; //通过switch语句,输入comboBox1的文本内容,判断将要进行哪一种操作switch (comboBox1.Text){case"计算点到线段的距离":{ //起点和终点即为屏幕上所取的两个点m_ptStart = myplist[0];m_ptEnd = myplist[1];break;}case"计算点到直线的距离"://画直线时,需要将起始点和pictureBox1容器边缘交点联系起来{ //起点坐标m_ptStart.Y = 0;m_ptStart.X = (int)(-C / A);//终点坐标m_ptEnd.Y = pictureBox1.Height;m_ptEnd.X = (int)(-(C + B * m_ptEnd.Y) / A);break;}case"计算点到射线的距离"://画射线时同样要考虑到线与pictureBox容器边缘的交点,比较困难的是判断射线方向(借助于所取两点的位置关系){Point p0 = new Point();Point p1 = new Point();//起点坐标if (myplist[1].Y == myplist[0].Y){p0.Y = myplist[0].Y; p0.X = 0;p1.Y = myplist[0].Y; p1.X = pictureBox1.Width;}else{p0.Y = 0;p0.X = (int)(-C / A);//终点坐标p1.Y = pictureBox1.Height;p1.X = (int)(-(C + B * p1.Y) / A);}//结合所取两点的位置关系确定最终传递给DrawLine的是哪两点if (myplist[1].Y >= myplist[0].Y){m_ptEnd.X = p1.X;m_ptEnd.Y = p1.Y;}else{m_ptEnd.X = p0.X;m_ptEnd.Y = p0.Y;}m_ptStart = myplist[0];break;}}g.DrawLine(blue, m_ptStart, m_ptEnd);//画线}}}}4、结果展示实现功能:首先在下拉列表中选择将要计算点到哪种线的距离,选择好后,鼠标左键取两点自动画线,之后鼠标右键取点,在取点的同时,会自动显示距离值,并且在选取下一个点时,上一组的数据自动清除4.1 计算点到线段的距离4.2 计算点到直线的距离:4.3 计算点到射线的距离。

GIS算法的计算几何基础

GIS算法的计算几何基础

GIS算法的计算几何基础矢量的概念:如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(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。

ArcGIS计算面积或者长度

ArcGIS计算面积或者长度

ArcGIS计算面积或者长度
ArcGIS计算面积或者长度
用一副遥感影像作为底图配准后进行矢量化,想要求出上面每个图斑面积的大小
方法1:
首先应该把地理坐标(经纬度)转换为投影坐标。

然后打开多边形的attribute table, 里面有一个功能叫calculate geometry 方法2:
打开要计算的shape文件的属性表,添加一个叫area的字段,然后选择area这个字段,右击,calculate,打开对话框后,点advanced的复选框,把下面的代码拷入就可以了.
Dim dblArea as double
Dim pArea as IArea
Set pArea = [shape]
dblArea = pArea.area
方法3:
如果shape文件有真实的坐标,把shape转化为geodatabase中的feature class,面积字段就直接出来了。

方法4:
TOOLBOX下的空间分析里IDENTIFY
需要说明的是:面积单位根据你当前数据的地理坐标单位,如果是米,则是平方米,如果是公里,则是平方公里.可以转换为平方公里,公顷,亩等.但如果是经纬度,则仅仅是经纬度作为平面单位的几何值.。

GIS算法的计算几何基础2

GIS算法的计算几何基础2

都要好写且不易出错。
24
弧长法

将坐标原点平移到被测点P,这个新坐标系将平面划分 为4个象限,对每个多边形顶点P ,只考虑其所在的象 限,然后按邻接顺序访问多边形的各个顶点P[i],分析 P[i]和P[i+1],有下列三种情况: (1)P[i+1]在P[i]的下一象限。此时弧长和加π/2; (2)P[i+1]在P[i]的上一象限。此时弧长和减π/2; (3)P[i+1]在P[i]的相对象限。 首先计算f=y[i+1]*x-x[i+1]*y(叉积), 若f=0,则点在多边形上; 若f<0,弧长和减π; 若f>0,弧长和加π。 最后对算出的代数和和上述的情况一样判断即可。


1 1 wn d 2 2
(u)du
0
16
1
5.2 转角法

若曲线C是由顶点V0,V1,…,Vn=V0构成的多边形,那么积分可 以简化为计算带符号的角度的总和。这些角PVi与PVi+1的夹 角。因此,如果i=angle(PVi,PVi+1),则
1 wn 2 1 i 2 i 0
《GIS算法基础》第二章
GIS算法的计算几何基础(2)
1

1 判断矩形是否包含点 2 判断线段、折线、多边形是否在矩形中
本 讲 内 容


3 判断矩形是否在矩形中
4 判断圆是否在矩形中
5 判断点是否在多边形内 6 判断线段是否在多边形内 7 判断折线是否在多边形内 8 判断多边形是否在多边形内 9 判断矩形是否在多边形内 10 判断圆是否在断点是否在多边形内

两种方法比较:

上图中,重叠区域的点被环绕两次,证明点在多边形内 部两次,但射线法测试的结果为点在多边形外。环绕法 的结果更加合理。

arcgis 几何计算 详解

arcgis 几何计算 详解

arcgis 几何计算详解摘要:1.ArcGIS 几何计算概述2.常用的几何计算工具3.几何计算的具体操作步骤4.几何计算的应用实例5.总结正文:一、ArcGIS 几何计算概述ArcGIS 是一款功能强大的地理信息系统软件,它集成了地理数据处理、管理、分析和可视化等功能。

在众多功能中,几何计算是其中的一项重要功能。

几何计算可以帮助用户对地理空间数据进行各种复杂的数学运算,从而满足空间数据分析和应用的需求。

二、常用的几何计算工具ArcGIS 中提供了丰富的几何计算工具,主要包括以下几类:1.简单几何计算:包括点、线、面等基本要素的创建、删除和修改等操作。

2.几何变换:包括平移、旋转、缩放等几何变换操作。

3.几何关系:包括空间关系的查询和计算,如相交、相离、包含等。

4.几何测量:包括面积、长度、角度等几何量的计算。

5.几何模拟:包括随机点、随机线、随机面等随机几何体的生成。

三、几何计算的具体操作步骤以计算两个多边形区域的交集为例,具体操作步骤如下:1.打开ArcGIS 软件,加载需要进行几何计算的地图数据。

2.在“地理处理工具”或“模型构建器”中,找到“几何计算”工具集。

3.选择“几何计算”工具集,找到“区域相交”工具,点击并将鼠标移至需要相交的两个多边形区域上,鼠标变为一个小方框,点击并拖动鼠标框选择两个多边形区域。

4.点击“确定”,完成相交操作。

结果将显示在图层中。

四、几何计算的应用实例1.城市规划:通过几何计算,可以分析不同区域的空间关系,为城市规划提供参考。

2.土地利用:通过几何计算,可以计算不同地类的面积,为土地利用提供数据支持。

3.自然资源管理:通过几何计算,可以分析自然资源的空间分布规律,为自然资源管理提供依据。

4.环境评估:通过几何计算,可以分析污染物的空间扩散规律,为环境评估提供数据支持。

五、总结ArcGIS 几何计算功能为用户提供了丰富的空间数据处理手段,可以帮助用户对地理空间数据进行各种复杂的数学运算。

GIS算法的计算几何基础3解析课件

GIS算法的计算几何基础3解析课件

▪ 如果距A点最近,则D点的位置为:
xD =xA + (xA — xB) • d/L yD 第三步:连接D点与点A、B中距P点的最近点即为所求延
长线。
思考:算法是否完善?
20
12.三点画圆
通过已知三点a、b、c画圆
算法的关键是求取圆心和圆半径。
▪ 第一步:求取圆心P。设三点为a、b、c,则令:
选择已有线段AB,以已有线段 为极轴,输入角度a和长度d求 点P坐标。
▪ 第一步:计算有向线段AB的长度L
▪ 第二步:根据有向线段AB坐标计算
dx = xB — XA ,dy = yB — yA
▪ 第三步:以A点义为基点旋转有向线段AB,则
dx dx cos a dy sin a dy dx sin a dy cos a
▪ 第三步:按照如下公式求取E、F点:
错误!!!xE =xA + dx, yE = yA + dy xF = xA + dx,yF = yA + dy
思考正确的算法?
▪ 第四步:连接E、F点,则线段EF为所
求平行线。
18
10.过点作平行线
伪代码?
选择一条已有线段AB,选择点P,选一点C, 以C点为端点作平行于线段AB的平行线CD, 线段CD的长度与线段AB相等。
xp xA L(xB xA) H ( yB yA)
▪ 式中
yp yA L( yB yA) H (xB xA)
L
1 S AB
Sb2
S
2 AB
Sa2
2S
2 AB
H
h S AB
Sb2
S
2 AB
L2
G
g S AB
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

GIS中的计算几何
GIS是一个图形系统,必然会涉及到几何学上理论应用,比如,图形的可视化,空间拓扑分析,GIS图形编辑等都需要借助几何。

向量几何是用代数的方法来研究几何问题,首先,请大家翻一翻高等数学里有关向量的章节,熟悉一下几个重要的概念:向量、向量的模、向量的坐标表示、向量的加减运算、向量的点积、向量的叉积...下面我们将用这些基本概念来解答GIS中一些几何问题。

一,点和线的关系。

点是否在线段上,这样的判断在图形编辑,拓扑判断(比如,GPS跟踪判
断是否跑在线上)需要用到这样的判断。

通常的想法是:先求线段的直线
方程,再判断点是否符合这条直线方程,如果符合,还要判断点是否在
线段所在的矩形区域(MBR)内,以排除延长线上的可能性,如果不符合,
则点不在线段上。

这种思路是可行的,但效率不高,涉及到建立方程,
解方程。

借助向量的叉积(也叫向量的向量积,结果还是向量,有方向
的)可以很容易的判断。

设向量a=(Xa,Ya,Za) b=(Xb,Yb,Zb) 向量叉积
a X b如下:
二维向量叉积的模|a X b|=|a|*|b|*sinα=|Xa*Yb-Ya*Xb| (α是向量a,b之间的夹角),向量叉积模的几何意义是以向量a,b为邻边的平行四边
形的面积。

可以推测:如果两向量共线,向量叉积模(所代表的平行四边
形的面积为零) 则|a X b|=|a|*|b|*sinα=|Xa*Yb-Ya*Xb|=0,否则不共线,叉
积的模为非零,根据这样条件可以很轻松的判断点和线的关系,避免了
建立方程和解方程的麻烦。

向量叉积的模|AB X AC|=0即可判断C点在AB所确定的直线上,再结合
C点是否在AB所在的MBR范围内,就可以最终确定C是否在AB线段
上。

关于点和线段的其他关系,都可以通过叉积的求得,比如判断点在
线的哪一侧,右手法则,可以通过 a X b=(Xa*Yb-Ya*Xb)*k中的
(Xa*Yb-Ya*Xb)正负来判断。

留给大家思考,很简单的,呵呵…
二,线和线的关系
判断两条线段是否相交,在很多拓扑判断和图形编辑(比如,线的打断来
构建拓扑,编辑线对象,叠置分析,面与面关系的判断等) 中都需要用到
线线相交的判断,如果两条线段相交,一条线段的两端点必然位于另一
条线段的两侧(不考虑退化情况,也就是一条线段的端点在另一条线段
上,这个很容易判断)
两向量的叉积a X b= (Xa*Yb-Ya*Xb)*k ,分别判断AB X AC的方向与
AB X AD的方向是否异号,再判断CD X CA 的方向与CD X CB的方向
是否异号即可判断两线段是否相交。

退化情况,一条线的端点在另一条线上,则AB X AC、 AB X AD 、CD
X CA、CD X CB 是否存在有一个为零的,存在则表明肯定有一条线的端
点在另一个线上或者共用一个端点。

详细区分留给大家思考。

呵呵…
利用向量的方向还可以判断线段的转向,这个在道路导航中有所应用
三,点和面的关系
在各种拓扑判断中(比如,面对象的选取,包含关系的判断等)有时
需要判断一个点是否位于某个面内,经典的方法就是“垂线法”,在直
角坐标系中,从这个点向X轴作射线,判断射线与多边形的交点个数
(不考虑退化情况,退化情况下,判断点或者射线与多边形端点或者
边的关系),如果为奇数,则点在面内,为偶数,则点在面外。

四,线和面的关系
线面关系的判断相对比较复杂,线在面内,线和面相交,相离,相接等关
系。

线段在面内,第一个必要条件是,线段的两个端点都要在内。

但由于
多边形可能为凹,所以这不能成为判断的充分条件,于是有第二个必要条
件线段与多边形的边,没有内部交点。

线段和多边形交于线段的两端点并不会影响线段是否在多边形内;但是如
果多边形的某个顶点和线段相交,还必须判断两相邻交点之间的线段是否
包含于多边形内部,如果在面内,则线段在面内,否则不在面内。

所以,算法思路如下(本算法引用网络上一篇文章):
if 线端PQ的端点不都在多边形内
then return false;
点集pointSet初始化为空;
for 多边形的每条边s
do 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;
注:X-Y坐标排序,X坐标小的排在前面,对于X坐标相同的点,Y坐标小
的排在前面,这种排序准则也是为了保证水平和垂直情况的判断正确
点在面内,线段相交情况的判断见上面的思路。

这个过程中的排序因为交点数目肯定远小于多边形的顶点数目n,所以最
多是常数级的复杂度,几乎可以忽略不计。

因此算法的时间复杂度也是
O(n)。

有了线段和面的关系,再判断折线与面的关系,也就可以for循环,同理
进行判断了。

五,面和面的关系
面面的空间关系,可能要更复杂一些,在拓扑判断,多边形叠置分析,面
对象的编辑中,有着广泛的应用。

这个将在以后的章节中介绍一种时间复
杂度为O(nlogn)的算法“平面扫描算法”。

六,点到线段的距离
点到线段的距离,在各种测量,拓扑判断(比如,线对象的选取中需要比较
距离)中都需要用到。

大家对点到直线的距离,都很熟悉,那点到线段距离
又该怎么计算呢?
问题的关键是判断a、r的角度,向量的点积能判断一个角是钝角还是锐角,
先复习一下向量的点积,也叫向量的数量积,结果是一个数,没有方向。


向量a=(Xa,Ya,Za) b=(Xb,Yb,Zb)
a . b=|a|*|b|*cosα=Xa*Xb+Ya*Yb+Za*Z
b 向量点积的几何意义是,高中物
理中,求作用力在一个方向上所作的功。

如果a . b>0,则α为锐角,a . b<0,
则α钝角。

熟悉了利用向量的点积来判断角度,A C·AB 判断夹角a,B A·BC判断夹
角r,即可确定三种情况中,具体是哪一种。

至于第一种情况,求点到垂
足的距离,可以饶开建立方程求垂足,再求两点距离的思路,因为运算就
复杂了,多耗了CPU资源。

利用向量叉积的几何意义来求,向量的叉积表
示两向量为邻边的平行四边形的面积|AC X AB|为⊿ABC的面积的两倍,求
平行四边形的高,只要用面积除以底边AB的长度,高CD的长度=|AC X
AB|/distance(AB)。

这些复杂的几何判断,都将在空间索引的过滤下,在少量数据集(侯选集)上进行。

计算几何算法,通常是比较复杂,比较耗CPU的运算,而且还要考虑各种退化的情况,在这里,并不试图向大家穷举各种情况,只想起一个抛砖引玉的作用,或许还有人会有这样的疑问:有没考虑“投影”的问题?关于投影将在相应的章节中给予解释,但有一点是可以肯定的,空间分析计算几何算法,都是在直角平面上运算的,不会在球面上。

参考文献:计算机地图制图蔡先华东南大学 2000.08
作者:陈玉进geochenyj@
07.01.30。

相关文档
最新文档