Voronoi图

合集下载

VoronoiDiagram——维诺图

VoronoiDiagram——维诺图

VoronoiDiagram——维诺图Voronoi图定义任意两点p 和q 之间的欧⽒距离,记作 dist(p, q) 。

就平⾯情况⽽⾔,我们有dist(p, q) = (px-qx)2+ (py-qy)2设P := {p1, …, pn}为平⾯上任意 n 个互异的点;这些点也就是基点。

按照我们的定义,所谓P对应的Voronoi图,就是平⾯的⼀个⼦区域划分——整个平⾯因此被划分为n 个单元(cell ),它们具有这样的性质:任⼀点q位于点pi 所对应的单元中,当且仅当对于任何的pj∈Pj, j≠i,都有dist(q, pi)<dist(q, pj)。

我们将与P对应的Voronoi图记作Vor(P)。

“Vor(P) ”或者“Voronoi图”所指⽰的仅仅只是组成该⼦区域划分的边和顶点。

在Vor(P)中,与基点pi 相对应的单元记作V (pi)——称作与pi 相对应的Voronoi单元(Voronoi cell)。

上图是Voronoi图,下图的蓝⾊点围成的区域(凸包)是它对应的Delaunay三⾓剖分。

任给平⾯上两点p 和q ,所谓 p 和q 的平分线(bisector),就是线段 pq的垂直平分线。

该平分线将平⾯划分为两张半平⾯(half-plane)。

点 p 所在的那张开半平⾯记作 h(p, q) ,点 q 所在的那张开半平⾯记作 h(q, p) 。

请注意,r ∈ h(p, q) 当且仅当 dist(r, p) < dist(r, q) 。

据此,可以得出如下观察结论:V (pi) = ∩ h(pi, pj) , 1≤j≤n, j≠ i也就是说,V (pi)是(n-1)张半平⾯的公共交集;它也是⼀个(不见得有界的)开的凸多边形(convex polygon)⼦区域.很显然,Voronoi顶点到相邻的三个site距离相等;Voronoi边上任意⼀点到相邻的两个site距离相等;对于任何点q,我们将以q为中⼼、内部不含P中任何基点的最⼤圆,称作q关于P的最⼤空圆(largest empty circle ),记作Cp(q)。

7-2-Voronoi图栅格算法

7-2-Voronoi图栅格算法

GIS原理与算法第七章Voronoi图构建算法(based on Raster)2011.6主要内容预备知识并行生长算法传统距离变换动态距离变换算法栅格算法实例球面V的生成算法原理球面格网算法实例问题讨论??意义矢量算法对于点集十分有效,对于线集变得比较复杂,面状集则非常困难,推广到三维Voronoi图和球面Voronoi图的矢量算法则更为复杂。

算法的复杂性是Voronoi图在动态GIS模型中难以得到广泛应用的主要原因。

为解决这个矛盾,C.Gold & Yang[1992,1996]提出一个点线模型,即把复杂实体分解成点和直线,先构建点线的Voronoi图,再转换为实体的Voronoi 图。

意义•此方法的优点是结构简单,能直接建立实体的四边数据结构和容易处理区域实体的动态变化,•但是此方法缺乏数据的层次结构(即数据综合),难以从根本上解决海量数据的不同层次的综合表达。

扩展模板最简单的距离扩展模板是3×3的正方形模板,其距离扩张如图所示:扩展模板其他模版还有:菱形模版、棋盘模版、八边形模版等:只要上述a,b的取值满足1<b/a<2,那么它就是“欧氏距离”在平面栅格空间的一个整数近似。

(a) 菱形模版(b)棋盘模版(c)八边形模版不同的模板给出的栅格距离不同,如下图:对于这些距栅格VD定义栅格膨胀和腐蚀算子膨胀(dilation)和腐蚀(erosion)是数学形态学的两个基本算子。

A是原始影像,B是结构元。

定义如下:bBbbBbABAABA∈∈=Θ=⊕IU::腐蚀膨胀膨胀和腐蚀算子 膨胀和腐蚀原理:分解图(2)4、动态距离变换算法采用距离变换后,由于取整带来的误差,与欧氏距离之间的差异随距离的增大而增大,如下图:动态距离变换原理实验结果意义与研究现状由于现代测绘及相关技术的发展,人们研究的区域逐渐从局部区域发展到覆盖整个地球。

而地球本身就是一个近似的椭球体,研究球面Voronoi图的生成方法对于全球数据的动态管理和球面空间关系的推理有其重要的意义。

三维Voronoi图的动态实现与研究

三维Voronoi图的动态实现与研究

三维Voronoi图的动态实现与研究曹锐创石奇偲黄棱潇摘要在计算几何中,离散点构造Voronoi图是一个非常基础且应用广泛的问题。

N个离散点按照最邻近原则划分区域,每个点与它的最近邻区域相关联。

本实验重点研究Voronoi图的三维情况,运用分块的方法动态实现了单一Voronoi细胞和三维Voronoi图的构造。

同时,本实验对均匀分布的随机点产生的性质进行了一系列研究和分析。

关键字:三维Voronoi图,单一Voronoi细胞,分块,均匀分布1.引言在二维(平面)情况下,Voronoi图是由一组连接两邻近点直线的垂直平分线组成的连续多边形组成。

N个在平面上有区别的点,按照最邻近原则划分平面。

每个离散点则各自拥有一个细胞区域,区域内部的点到相对应的离散点距离最近。

在高维情况下,连接两邻近点直线的垂直平分不再是直线,形成Voronoi图的细胞则会从平面上的多边形转变为高维的多面体。

Voronoi图的平面情况和三维情况的区别不光体现在细胞的构成上。

平面情况下,由于可以应用欧拉公式,我们能知道构成Voronoi图的顶点和边数和离散点数为相同数量级。

但涉及到三维情况:首先,每个细胞区域构成多了面的概念;其次,构成细胞的顶点数和边数在数量级上也有了质变,可以达到离散点数数量级的平方。

这为构造三维Vonoroi图带来了困难,导致了时间复杂度和空间复杂度的增加。

三维Voronoi图主要有Quickhull[11]和分块动态实现[12]两种算法,但它们的时间复杂性最差情况下都可以达到θ(n2)。

实验中,我们首先动态实现了单一Voronoi细胞的构造。

事实上,在许多物理应用中,人们更关注的仅是几个单一Voronoi细胞,而不是整个Voronoi图的构造。

运用单一Voronoi 细胞的构造,结合分块方法,我们动态的构造三维Vonoroi图。

尽管在最差情况下,时间复杂性可以达到θ(n2),但如果考虑离散点是随机均匀分布的,实验结果显示平均复杂度随着离散点数的增加线性增长。

浅析平面Voronoi图的构造及应用.ppt

浅析平面Voronoi图的构造及应用.ppt

编写容易 分治法构造Delaunay三角剖分法 易于理解
Voronoi图的构造
用分治法构造角最优三角剖分,首先要对点集依照X坐 标排序。如果点集内点的个数小于等于三,那么可以直接构 造,否则将点集拆分成为两个含点数目近似的点集进行构造, 最后合并这两个点集。
点集内含点 个数为2的
情况
点集内含点 个数为3的
新增点
Voronoi图拓宽解题思路 原来障碍点
接下来,由于人还可以从走廊边与障碍物之间通过,那么对于每一个障 碍点(x,y)我们可以在走廊壁上增加障碍点(x,0),(x,W),一共增加2n个障碍 点 。 另外 在走 廊开 始和尽 头增 加四个 障碍 点( -W,0),(-W,W), (L+W,0),(L+W,W)这四个点与其它点之间距离不小与W,这样就 不影响结果。然后对于这3n+4个点求Voronoi图。
Ta
c
a
Tb b
Voronoi图与平面MST问题
根据这个条件,我们可以得到一个新的方案,构造角 最优三角剖分,然后计算最小生成树,总的时间复杂度是 O(n log n)。
可能大家会问这样一个问题:
除了距离问题,Voronoi图还有什么用呢?
我想告诉大家!Voronoi图不仅能快速解决距离问题
Voronoi图还可以扩宽我们的解题思路



D C
B
所求点
A
Voronoi图的在信息学中的应用
根据刚才分析的两种情况,我们可以构造两种方 案。第一种方案针对所求点为过三个点的圆的圆心的 状态,我们枚举三个点,求出它们组成的三角形的外 心和半径,然后枚举其它的点,看它们是不是在这个 圆中。第二种方案是枚举两个点的中垂线,求出中垂 线与矩形的交点,然后根据这三个点来计算最远位置, 进行判断。

空间分析-Voronoi图构建方法与应用

空间分析-Voronoi图构建方法与应用
( si s ) n s
湖北大学资源环境学院
i 1
王新生 2019/3/9
点集分布的判别标准
当某个点集的空间分布为规则分布时,CV是 低的。当为集群分布时,在集群(“类”)内的 Voronoi多边形面积较小,而在集群间的面积较大, CV是高的。但是,应该注意的是,规则的周期结 构也会导致较高的CV值;周期性重复出现的集群 分布也会形成高的CV值。 Duyckaerts and Godefroy (2000)提出了三 个建议值,当点集为随机分布时,CV值为57% (包括从33%到64%);当点集为集群分布时, CV值为92%(包括大于64%);当点集为规则分 布时,CV值为29%(包括小于33%)
湖北大学资源环境学院
的随机分布,不同于泊 松分布的两种情况是空间规则分布和集群分布。 Voronoi分割可以帮助我们判断点集的空间分布属 于那一种形式。当点集在平面上呈现泊松分布时, Voronoi多边形面积是有变化的,有些是面积大的 Voronoi多边形,有些是面积小的Voronoi多边形。 Voronoi多边形面积的变化性是很容易通过其方差来估 计的。变异系数(the coefficient of variation, CV)是 Voronoi多边形面积的标准差与平均值的比值,它可以 衡量现象在空间上的相对变化程度。 n 标准差计算公式: 2

湖北大学资源环境学院
王新生 2019/3/9
湖北大学资源环境学院
王新生 2019/3/9
任意形状发生元Voronoi图构建的栅格方法
1 d ( p ,p d ( p ,p w , w i) i) i 2 w i 1
wi1>0、wi2是加权Voronoi图的权重。 当 wi2=0 时 产 生 倍 增 的 加 权 Voronoi 图

Voronoi图和Delaunay三角剖分

Voronoi图和Delaunay三角剖分

Voronoi图和Delaunay三⾓剖分刷题的时候发现了这么⼀个新的东西:Voronoi图和Delaunay三⾓剖分发现这个东西可以O(nlogn)解决平⾯图最⼩⽣成树问题感觉⾮常棒然后就去学了..看的,感谢n+e的耐⼼教导..Voronoi图是个啥Delaunay三⾓剖分最优三⾓剖分就是使每⼀个三⾓形的外接圆都不包含其他的点的三⾓剖分这个算法就是求最优三⾓剖分的简单来说就是分治合并对于点数⼩于等于3的可以直接连边合并的时候1)先找到两边最下⾯的点,这个可以⽤凸包求,然后连边2)对于现在得到的两个点p1、p2,找到⼀个点连接着p1且由这三个点的外接圆不包含别的任何点,并删除这个外接圆经过的边,p2也是如此3)看现在找出来的两个点y1、y2,找其中⼀个点使得它与p1、p2的外接圆不包含另外⼀个点,使其与对应的点连边4)重复(2)(3)直到⽆边可连对n+e代码的修改⼀开始压根不知道怎么实现这个算法的时候去看了看n+e的代码..发现他的代码中每次都要遍历p1和p2的所有边,这样的做法在特殊的图⾥⾯是O(n2)的可以说他⾃⼰出的数据偏⽔??(雾然后看了上⾯那篇详细的⽂章,发现它的边是按照顺时针或者逆时针的⽅向进⾏取边的,这样遇到的边要不删掉要不就是最优的所以我开了⼀个双向链表来储存边,使得边是按照(−π2,3π2]顺时针排列然后就会发现细节⼀⼤堆..调了我3天的东西就直接放上来好了判断⼀个点是否在某三个点的外接圆内在⾥⾯有讲,但是貌似图都爆掉了??就是把点映射到z=x2+y2的抛物⾯上,这三个点就会形成⼀个新的平⾯,然后再判断剩下的那个点和这个平⾯的关系即可下⾯放⼏张n+e给我的图⽚⽅便理解?抛物⾯z=x2+y2其实第三张图应该很清晰了吧..在圆内的点都会在平⾯下⽅,⽽在圆外的都会在平⾯上⽅这个⽤三维叉积点积判⼀下就好了Code下⾯就贴⼀下我3天的成果吧..还有什么问题请指教..bzoj4219#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <cmath>#include <vector>#define eps 1e-10using namespace std;const int Maxn = 100010;double _max(double x, double y) { return x > y ? x : y; }double _min(double x, double y) { return x < y ? x : y; }struct node {int y, nxt, frt, opp;}a[Maxn<<3]; int first[Maxn], last[Maxn], num[Maxn<<3], now;int sta[Maxn], tp;int pb(int x, int k, int y) {int u = num[now++];a[u].y = y; a[u].frt = k;if(k){a[u].nxt = a[k].nxt;if(a[k].nxt) a[a[k].nxt].frt = u;else last[x] = u;a[k].nxt = u;} else {if(first[x]) a[first[x]].frt = u;else last[x] = u;a[u].nxt = first[x]; first[x] = u;}return u;}int pf(int x, int k, int y) {int u = num[now++];a[u].y = y; a[u].nxt = k;if(k){a[u].frt = a[k].frt;if(a[k].frt) a[a[k].frt].nxt = u;else first[x] = u;a[k].frt = u;} else {if(last[x]) a[last[x]].nxt = u;else first[x] = u;a[u].frt = last[x]; last[x] = u;}return u;}void del(int x, int k) {num[--now] = k;if(a[k].nxt) a[a[k].nxt].frt = a[k].frt;else last[x] = a[k].frt;if(a[k].frt) a[a[k].frt].nxt = a[k].nxt;else first[x] = a[k].nxt;}double _abs(double x) { return x < 0 ? -x : x; }int zero(double x) { return _abs(x) < eps ? 1 : 0; }struct Point {double x, y;Point(double x = 0, double y = 0) : x(x), y(y) {}bool operator<(const Point &A) const { return zero(x-A.x) ? y < A.y : x < A.x; } Point operator-(const Point &A) const { return Point(x-A.x, y-A.y); }}list[Maxn]; int n; double X, Y;double Cross(Point A, Point B) { return A.x*B.y-B.x*A.y; }double Dot(Point A, Point B) { return A.x*B.x+A.y*B.y; }double dis(Point A) { return sqrt(Dot(A, A)); }double dis(int x, int y) { return dis(list[y]-list[x]); }struct Point3 {double x, y, z;Point3(double x = 0, double y = 0, double z = 0) : x(x), y(y), z(z) {}Point3 operator-(const Point3 &A) const { return Point3(x-A.x, y-A.y, z-A.z); } };double Dot(Point3 A, Point3 B) { return A.x*B.x+A.y*B.y+A.z*B.z; }Point3 Cross(Point3 A, Point3 B) { return Point3(A.y*B.z-A.z*B.y, A.z*B.x-A.x*B.z, A.x*B.y-A.y*B.x); } Point3 t(Point A) { return Point3(A.x, A.y, A.x*A.x+A.y*A.y); }bool incir(Point D, Point A, Point B, Point C) {if(Cross(B-A, C-A) < -eps) swap(B, C);Point3 aa = t(A), bb = t(B), cc = t(C), dd = t(D);return Dot(Cross(bb-aa, cc-aa), dd-aa) < -eps;}bool incir(int D, int A, int B, int C) { return incir(list[D], list[A], list[B], list[C]); }void divi(int L, int R) {if(L == R) return;if(L+1 == R){int k1 = pb(L, 0, R); int k2 = pf(R, 0, L);a[k1].opp = k2; a[k2].opp = k1;return;}int mid = L+R>>1, i, j, k;divi(L, mid); divi(mid+1, R);int p1 = 0, p2 = 0; tp = 0;for(i = L; i <= R; i++){while(tp > 1 && Cross(list[i]-list[sta[tp-1]], list[sta[tp]]-list[sta[tp-1]]) > eps) tp--;sta[++tp] = i;}for(i = 1; i < tp; i++) if(sta[i] <= mid && sta[i+1] > mid){ p1 = sta[i]; p2 = sta[i+1]; break; }int kp1, kp2;for(kp1 = last[p1]; kp1; kp1 = a[kp1].frt){if(Cross(list[a[kp1].y]-list[p1], list[p2]-list[p1]) < eps || Cross(list[a[kp1].y]-list[p1], Point(0,1)) < -eps) break; }int k1 = pb(p1, kp1, p2);for(kp2 = first[p2]; kp2; kp2 = a[kp2].nxt){if(Cross(list[a[kp2].y]-list[p2], list[p1]-list[p2]) > -eps || Cross(list[a[kp2].y]-list[p2], Point(0,1)) > eps) break; }int k2 = pf(p2, kp2, p1);a[k1].opp = k2; a[k2].opp = k1;while(1){int np1 = 0, np2 = 0;for(; kp1; kp1 = a[kp1].frt){if(Cross(list[a[kp1].y]-list[p1], list[p2]-list[p1]) > -eps){if(Cross(list[a[kp1].y]-list[p1], Point(0,1)) > -eps) continue;else break;}if(a[kp1].frt && incir(a[a[kp1].frt].y, p1, p2, a[kp1].y)) del(a[kp1].y, a[kp1].opp), del(p1, kp1);else { np1 = kp1; break; }}for(; kp2; kp2 = a[kp2].nxt){if(Cross(list[a[kp2].y]-list[p2], list[p1]-list[p2]) < eps){if(Cross(list[a[kp2].y]-list[p2], Point(0,1)) < -eps) continue;else break;}if(a[kp2].nxt && incir(a[a[kp2].nxt].y, p1, p2, a[kp2].y)) del(a[kp2].y, a[kp2].opp), del(p2, kp2);else { np2 = kp2; break; }}if(!np1 && !np2) break;if(!np2 || (np1 && !incir(a[kp2].y, p1, p2, a[kp1].y))){p1 = a[kp1].y;k2 = pf(p2, kp2, p1);for(kp1 = last[p1]; kp1; kp1 = a[kp1].frt){if(Cross(list[a[kp1].y]-list[p1], list[p2]-list[p1]) < eps || Cross(list[a[kp1].y]-list[p1], Point(0,1)) < -eps) break; }k1 = pb(p1, kp1, p2);a[k1].opp = k2; a[k2].opp = k1;} else {p2 = a[kp2].y;k1 = pb(p1, kp1, p2);for(kp2 = first[p2]; kp2; kp2 = a[kp2].nxt){if(Cross(list[a[kp2].y]-list[p2], list[p1]-list[p2]) > -eps || Cross(list[a[kp2].y]-list[p2], Point(0,1)) > eps) break; }k2 = pf(p2, kp2, p1);a[k1].opp = k2; a[k2].opp = k1;}}}struct enode {int x, y; double d;enode(int x = 0, int y = 0, double d = 0) : x(x), y(y), d(d) {}bool operator<(const enode &A) const { return d < A.d; }}e[Maxn<<4]; int el;int fa[Maxn];int ff(int x) { return fa[x] == x ? x : fa[x] = ff(fa[x]); }int main() {int i, j, k;scanf("%d%lf%lf", &n, &X, &Y);for(i = 1; i <= n; i++) scanf("%lf%lf", &list[i].x, &list[i].y);now = 1;for(i = 1; i <= n<<3; i++) num[i] = i;sort(list+1, list+n+1);divi(1, n);for(i = 1; i <= n; i++){e[++el] = enode(i, n+1, _min(list[i].x, Y-list[i].y));e[++el] = enode(i, n+2, _min(list[i].y, X-list[i].x));for(k = first[i]; k; k = a[k].nxt) e[++el] = enode(i, a[k].y, dis(i, a[k].y)/2.0); }sort(e+1, e+el+1);for(i = 1; i <= n+2; i++) fa[i] = i;for(i = 1; i <= el; i++){int fx = ff(e[i].x), fy = ff(e[i].y);if(fx != fy){fa[fx] = fy;if(ff(n+1) == ff(n+2)){ printf("%lf\n", e[i].d); return 0; }}}return 0;}⼩总结??虽然这次搞这个东西⽤的时间很长.. 但是收获还是很⼤的..最后差那么⼏个点wa还是很想放弃的..但是还是坚持下了来了嘛..加油啊..Processing math: 100%。

沃罗诺伊图(VoronoiDiagram,也称作Dirichlettessellation。。。

沃罗诺伊图(VoronoiDiagram,也称作Dirichlettessellation。。。

沃罗诺伊图(VoronoiDiagram,也称作Dirichlettessellation。

沃罗诺伊图(Voronoi Diagram,也称作Dirichlet tessellation,狄利克雷镶嵌)是由俄国数学家建⽴的空间分割算法。

灵感来源于⽤凸域分割空间的思想。

在⼏何,晶体学建筑学,地理学,⽓象学,信息系统等许多领域有⼴泛的应⽤。

泰森多边形法,荷兰⽓候学家A·H·Thiessen提出了⼀种根据离散分布的⽓象站的降⾬量,来计算平均降⾬量的⽅法,即将所有相邻⽓象站连成三⾓形,作这些三⾓形各边的,将每个三⾓形的三条边的的交点(也就是的圆⼼)连接起来得到⼀个多边形。

⽤这个多边形内所包含的⼀个唯⼀⽓象站的来表⽰这个内的降⾬强度,并称这个多边形为。

如图,其中虚线构成的多边形就是泰森多边形。

泰森多边形每个顶点是每个三⾓形的圆⼼。

泰森多边形也称为图,或图。

⼀、⽂档⽬的本⽂描述了在geomodel模块中,⽣成泰森多边形所使⽤的算法。

⼆、概述GIS和地理分析中经常采⽤泰森多边形进⾏快速插值,和分析地理实体的影响区域,是解决邻接度问题的⼜⼀常⽤⼯具。

荷兰⽓候学家A·H·Thiessen提出了⼀种根据离散分布的⽓象站的降⾬量来计算平均降⾬量的⽅法,即将所有相邻⽓象站连成三⾓形,作这些三⾓形各边的垂直平分线,于是每个⽓象站周围的若⼲垂直平分线便围成⼀个多边形。

⽤这个多边形内所包含的⼀个唯⼀⽓象站的降⾬强度来表⽰这个多边形区域内的降⾬强度,并称这个多边形为泰森多边形。

如图1,其中虚线构成的多边形就是泰森多边形。

泰森多边形每个顶点是每个三⾓形的外接圆圆⼼。

泰森多边形也称为Voronoi图,或dirichlet图。

泰森多边形的特性是:1,每个泰森多边形内仅含有⼀个离散点数据。

2,泰森多边形内的点到相应离散点的距离最近。

3,位于泰森多边形边上的点到其两边的离散点的距离相等。

泰森多边形可⽤于定性分析、统计分析、邻近分析等。

7-1-Voronoi图矢量算法

7-1-Voronoi图矢量算法

第七章Voronoi图构建算法(based on Vector)2011.6GIS原理与算法Voronoi图Voronoi图是计算几何中最重要的几何结构之一(紧次于凸壳),它描述了对于一系实体集的邻近性问题。

邮局问题;观测台问题;学校(医院)问题;Voronoi图Voronoi图的概念是由Dirichlet在1850年首先提出; 俄国数学家Voronoi于1907年在文章中做了进一步阐述,并提出高次方程化简;气象学家Thiessen在1911年为了提高大面积气象预报结果,应用Voronoi图对观测站进行划分观测区域(多边形);为了纪念这些科学家的成就,这种结构被称为Dirichlet剖分或Voronoi图或Thiessen多边形。

主要内容Definitions & Properties (定义和性质) Vector Algorithm (矢量算法)Order-k VD (多阶VD)Line and area VD (线和面的VD)Minkowski metric VD (M度量VD)Other Voronoi diagram (其他VD)Applications (应用)}iProperties(1)假设:集合S中,没有四点是共圆的。

Voronoi图是度数为三的正则图(图论),即:Voronoi图的每一个顶点恰好是图解的三条边的交点。

在S中,pi的每一个最邻近点确定一条Voronoi图多边形的一条边。

多边形V(i)是无界的当且仅当pi是集合S的凸壳的边界上的一个点。

对于S的Voronoi图的每一个顶点v,圆C(v)不包含S 的其它的点(最大空圆)。

Properties of D(p)& V(p)Each Voronoi region2、Vector Algorithm•自Shamos和Hoey[1975]把Voronoi图作为一种有效的数据结构引入计算机领域,并成为计算几何领域的主要研究热点之一。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目前矢量方法用离散点集代替线面,使空间实体的完整性 遭到破坏,同时生成的V图,要经过复杂的识别和修补工 作,这是一个尚待克服的困难;
增添法的基本步骤:
①搜索最邻近单元和相邻单元
最邻近单元为Pn+1所在原V图中某点 的Voronoi多边形Vk以及原来与它 相邻的若干个多边形及相应生成 元;
②局部更新
对于各邻近单元,首先与最邻近单
元Vk中Pk作中垂线,并找其余Vk 的交点,由于Vk是凸多边形,因 而只产生两个交点1、2,1与2连 线把与Vk相关的单元分为“两 半”:与Pn+1“相关的一半”及 “不相关的一半”,使Pn+1与相 关一半的各生成元Pk+1, Pk+2…作 中垂线围成各封闭多边形,即是
增添法 部件合成法
(一)对偶生成法
对偶生成法:主要是指生成V图时先生成其对偶元 Delaunay三角网,再通过做三角网每一三角形三条 边的中垂线,形成以每一三角形顶点为生成元的多 边形网 。
对偶生成法生成V图
对偶生成法的关键是Delaunay三角网的生成。
Delaunay三角网的特性: 任一三角形外接圆内部包含其他点; 三角形均衡或三边均衡,其最小角最大; 使三角网总边长最小; 在确定的n个点上,构造的Delaunay三角网网形唯一。
部件合成
(四)矢量方法生成V图的分析
以上三种方法是矢量方法中常用的,随着并行处理技术的 发展,V图生成页、也出现了并行算法,它使各生成元同 时进行各点的V图计算;
矢量方法生成V图的算法和数据结构都较为复杂,其生成 元是基于离散点集的,对于实际的地理信息,这远远不够, 应该拓展成点、线、面、体及其组合的复杂形体;
Vi Vj
PV1 V2 ...Vn R2 (假定到Pi为0的点不算在Vi内)
V1 V2 ...Vn R2
(假定到Pi为0的点算在Vi内)
多边形内点到该多边形生成元距离最小。 两多边形边界上的点到两对应多边形生成元距
离相等。 在一多边形内,生成元到各个边的距离一般不
同,可由小到大排序,其中有最小,次小…… 表明其周围生成元到该生成元的不同距离。
(二)增添法
增添法生成V图的基本思想是:假设平面上原有n 个点(生成元),已生成了Vn图,现在增加一个 生成元Pn+1,这时生成新的Vn+1图。由于V图的特 性,加入一个新生成元只与该新生成元所在 Voronoi多边形及与之相邻其它Voronoi多边形“迎 向半边”有关,与这些多边形的“另半边”无关, 也与除它们之外的其它生成元的Voronoi多边形无 关。
(二)广义Voronoi图
拓展Voronoi图为广义Voronoi图具有广泛意义。
设G是由n个实体组成的集合,g1,g2,…,gn ∈ G, 且各实体具有权ki,定义gi的Voronoi区域V(gi)为所 有到gi加权距离最小点(栅格)的集合
V(gi)={p/kid(p,gi)≤kj d(p,gj), i≠j, j=1, 2, …,n} 设G是由n个实体组成的集合,g1,g2,…gn ∈ G,定
V(gi)={p/d(p,gi)≤d(p,gj), i≠j, j=1, 2, …,n} 设G是由n个实体组成的集合,g1,g2,…gn ∈ G,定
义G的Voronoi图V(G)为
V(G)={V(g1),V(g2),…,V(gn)}
V图是与距离紧密相关的,而距离值是由尺度所 基本定义的。不同尺度,距离的概念不一样, 数值往往也不一样,因此不同的尺度空间,有 不同的V图。上述定义同样可推广到3维。
加入Pn+1生成元后的新的Vn+1图。 类此,可不断加入新的生成元,
直至所需。
新加入Pn+1只改变与 之相关的生成元的
Voronoi多边形,其余 不动。
(三)部件合成法
部件合成法:是指把生成元点集分为若干个子集, 并且这些子集的并集必须为生成元点集,为避免 不必要的麻烦,这些子集相互的交集尽可能小或 为空集φ。先对这些子集生成子V图,然后把这些 子V图合并,修正其相互影响部分的Voronoi多边 形,从而得到全生成元点集的V图。
假设P是一离散点集合,P1,P2,…Pn ∈ P,定义P 的V图V(P)为:
V(P)={V(P1),V(P2),…,V(Pn)} 其中Pi称为V图生成元。
(二)性质
假设平面上有n个离散点,其对应的Voronoi多边
形分别为V1,V2…Vn, Voronoi多边形之间除边
界外,其交集为空集,所有Voronoi多边形的并集 为二维平面R2,即
第五章 Voronoi图
主讲教师:邱春霞 测绘学院
重点内容:
Voronoi图的定义 Voronoi图的生成方法 Voronoi图的应用
Voronoi结构的概念是由俄国数学家 M.G.Voronoi于1908年发现并以他的名字命名 的。它实质是一种在自然界中宏观和微观实 体以距离相互作用的普遍结构,具有广泛的 应用范围。
二、地理空间(二维)对V图的扩展定义
(一)V图定义
二维地理空间G是由n个点、线、面实体集合g1, g2,……gn组成的,则称该地理空间是定义了一种尺 度d的量度空间。
设G是由n个实体组成的集合,g1,g2,…,gn ∈ G, 定义gi的Voronoi区域V(gi)为所有到gi距离最小点 (栅格)的集合
义G的Voronoi图V(G)为
V(G)={V(g1),V(g2),…,V(gn)} 一般V图特性在广义V图中类似存在。
5.2 V图生成方法
V图有着按距离划分邻近区域的普遍特性,应 用范围广。
生成V图的方法很多,一般分为两种: 矢量方法 栅格方法
一、生成V图的矢量方法
矢量方法生成V图大多是对点实体。 方法分为:对偶生成法
5.1 Voronoi图定义
一、V图基本定义
从Voronoi结构所脱胎的计算几何来看,V图是 对平面n个离散点而言的,它把平面分为几个 区,每一个区包括一个点,该点所在定义
设P是一离散点集合P1,P2,…Pn∈P,定义Pi的 Voronoi区域V(Pi)为所有到Pi距离最小点的集合: V(Pi)={P/d(P,Pi)≤d(P,Pj), j≠i,j=1,2,…n}
相关文档
最新文档